@infosoftas/s4-orders-js-sdk 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.editorconfig ADDED
@@ -0,0 +1,8 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 4
6
+ charset = utf-8
7
+ trim_trailing_whitespace = true
8
+ insert_final_newline = true
package/.release-it.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
- "$schema": "https://unpkg.com/release-it/schema/release-it.json",
3
- "git": {
4
- "changelog" : "",
5
- "requireBranch": "release/*"
6
- },
7
- "github": {
8
- "release": true
9
- }
2
+ "$schema": "https://unpkg.com/release-it/schema/release-it.json",
3
+ "git": {
4
+ "changelog": "",
5
+ "requireBranch": "release/*"
6
+ },
7
+ "github": {
8
+ "release": true
9
+ }
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infosoftas/s4-orders-js-sdk",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "scripts": {
5
5
  "build": "rimraf lib && webpack --mode production",
6
6
  "release": "release-it"
@@ -24,7 +24,7 @@
24
24
  "@types/react": "^19.2.6",
25
25
  "@types/react-dom": "^19.2.3",
26
26
  "babel-loader": "^10.0.0",
27
- "copy-webpack-plugin": "^13.0.1",
27
+ "copy-webpack-plugin": "^14.0.0",
28
28
  "css-loader": "^7.1.2",
29
29
  "mini-css-extract-plugin": "^2.9.4",
30
30
  "release-it": "^19.0.6",
package/src/App.scss CHANGED
@@ -2,7 +2,6 @@
2
2
  @import './assets/styles/general.scss';
3
3
 
4
4
  .sdk-order-container {
5
-
6
5
  *,
7
6
  *::before,
8
7
  *::after {
@@ -10,15 +9,15 @@
10
9
  }
11
10
 
12
11
  .sdk-iframe-wrapper {
13
- display : flex;
12
+ display: flex;
14
13
  flex-direction: column;
15
- align-items : center;
14
+ align-items: center;
16
15
  }
17
16
 
18
17
  iframe {
19
- max-width : 640px;
20
- border : none;
21
- background : transparent;
18
+ max-width: 640px;
19
+ border: none;
20
+ background: transparent;
22
21
  border-radius: $border-radius * 2;
23
22
  }
24
- }
23
+ }
package/src/App.tsx CHANGED
@@ -30,6 +30,7 @@ const App: FC<ConfigType> = ({
30
30
  submitStartCallback,
31
31
  userActionCallback,
32
32
  setContactCallback,
33
+ cancelVippsCallback,
33
34
  moduleTitle,
34
35
  apiKey,
35
36
  apiUrl,
@@ -62,8 +63,10 @@ const App: FC<ConfigType> = ({
62
63
  errorInvalidEmailMsg: '',
63
64
  errorInvalidPhoneMsg: '',
64
65
  errorValidationTitleMsg: 'One or more validation errors occurred.',
65
- errorValidationDenialOrderBlockingMsg: 'The order/subscription will not be created because the subscriber has a denial order blocking all.',
66
- errorValidationBlockingOffersMsg: 'The order/subscription will not be created because the subscriber has a denial order blocking offers.',
66
+ errorValidationDenialOrderBlockingMsg:
67
+ 'The order/subscription will not be created because the subscriber has a denial order blocking all.',
68
+ errorValidationBlockingOffersMsg:
69
+ 'The order/subscription will not be created because the subscriber has a denial order blocking offers.',
67
70
  paymentMethodNotAllowedMsg: '',
68
71
  invoiceLookupNotFoundText:
69
72
  'There was no recipient found for the given information',
@@ -110,13 +113,15 @@ const App: FC<ConfigType> = ({
110
113
  try {
111
114
  // There is no way to detect the difference between "cancelled" and "accepted" payment for Vipps via UI
112
115
  // Completing an order for cancelled payment is fine. The backend handles it correctly.
113
- await orderComplete(orderId || data.orderId || '',
116
+ await orderComplete(
117
+ orderId || data.orderId || '',
114
118
  userId && identityProviderId
115
119
  ? {
116
- userId,
117
- identityProviderId,
118
- }
119
- : undefined);
120
+ userId,
121
+ identityProviderId,
122
+ }
123
+ : undefined
124
+ );
120
125
  setIsConfirmed(true);
121
126
  setLoading(false);
122
127
  if (window === top) {
@@ -136,6 +141,7 @@ const App: FC<ConfigType> = ({
136
141
  (data.paymentMethod === PaymentMethodEnum.Vipps ||
137
142
  data.paymentMethod === PaymentMethodEnum.MobilePay)
138
143
  ) {
144
+ cancelVippsCallback?.();
139
145
  handleOrderDelete(orderId || data.orderId);
140
146
  return;
141
147
  }
@@ -156,7 +162,9 @@ const App: FC<ConfigType> = ({
156
162
  setLoading(false);
157
163
  setShowOrderForm(true);
158
164
  setFormType(FormTypeEnum.ORDER);
159
- userActionCallback?.(UserActionEnum.SELECT_FORM, { form: FormTypeEnum.ORDER });
165
+ userActionCallback?.(UserActionEnum.SELECT_FORM, {
166
+ form: FormTypeEnum.ORDER,
167
+ });
160
168
  }
161
169
  };
162
170
 
@@ -250,10 +258,14 @@ const App: FC<ConfigType> = ({
250
258
  });
251
259
  } else if (data?.paymentMethod === PaymentMethodEnum.EHF) {
252
260
  setFormType(FormTypeEnum.EHF);
253
- userActionCallback?.(UserActionEnum.SELECT_FORM, { form: FormTypeEnum.EHF });
261
+ userActionCallback?.(UserActionEnum.SELECT_FORM, {
262
+ form: FormTypeEnum.EHF,
263
+ });
254
264
  } else if (data?.paymentMethod === PaymentMethodEnum.OIO) {
255
265
  setFormType(FormTypeEnum.OIO);
256
- userActionCallback?.(UserActionEnum.SELECT_FORM, { form: FormTypeEnum.OIO });
266
+ userActionCallback?.(UserActionEnum.SELECT_FORM, {
267
+ form: FormTypeEnum.OIO,
268
+ });
257
269
  } else if (url) {
258
270
  if (
259
271
  showIframe &&
@@ -275,13 +287,17 @@ const App: FC<ConfigType> = ({
275
287
 
276
288
  const handleInvoiceBack = () => {
277
289
  setFormType(FormTypeEnum.ORDER);
278
- userActionCallback?.(UserActionEnum.SELECT_FORM, { form: FormTypeEnum.ORDER });
290
+ userActionCallback?.(UserActionEnum.SELECT_FORM, {
291
+ form: FormTypeEnum.ORDER,
292
+ });
279
293
  };
280
294
 
281
295
  const updateFormData = (data: OrderFormInputsType) => {
282
296
  setOrderFormValues(data);
283
297
  setFormType(data.paymentMethod as unknown as FormTypeEnum);
284
- userActionCallback?.(UserActionEnum.SELECT_FORM, { form: data.paymentMethod });
298
+ userActionCallback?.(UserActionEnum.SELECT_FORM, {
299
+ form: data.paymentMethod,
300
+ });
285
301
  };
286
302
 
287
303
  const handleInvoiceForm = async (
@@ -350,9 +366,15 @@ const App: FC<ConfigType> = ({
350
366
  }
351
367
  userActionCallback={userActionCallback}
352
368
  setContactCallback={setContactCallback}
353
- errorValidationTitleMsg={settings?.errorValidationTitleMsg}
354
- errorValidationDenialOrderBlockingMsg={settings?.errorValidationDenialOrderBlockingMsg}
355
- errorValidationBlockingOffersMsg={settings?.errorValidationBlockingOffersMsg}
369
+ errorValidationTitleMsg={
370
+ settings?.errorValidationTitleMsg
371
+ }
372
+ errorValidationDenialOrderBlockingMsg={
373
+ settings?.errorValidationDenialOrderBlockingMsg
374
+ }
375
+ errorValidationBlockingOffersMsg={
376
+ settings?.errorValidationBlockingOffersMsg
377
+ }
356
378
  />
357
379
  )}
358
380
  {formType === FormTypeEnum.EHF && (
@@ -386,13 +408,20 @@ const App: FC<ConfigType> = ({
386
408
  }
387
409
  userActionCallback={userActionCallback}
388
410
  setContactCallback={setContactCallback}
389
- errorValidationTitleMsg={settings?.errorValidationTitleMsg}
390
- errorValidationDenialOrderBlockingMsg={settings?.errorValidationDenialOrderBlockingMsg}
391
- errorValidationBlockingOffersMsg={settings?.errorValidationBlockingOffersMsg}
411
+ errorValidationTitleMsg={
412
+ settings?.errorValidationTitleMsg
413
+ }
414
+ errorValidationDenialOrderBlockingMsg={
415
+ settings?.errorValidationDenialOrderBlockingMsg
416
+ }
417
+ errorValidationBlockingOffersMsg={
418
+ settings?.errorValidationBlockingOffersMsg
419
+ }
392
420
  />
393
421
  )}
394
422
  {formType !== FormTypeEnum.OIO &&
395
- formType !== FormTypeEnum.EHF && templatePackageId && (
423
+ formType !== FormTypeEnum.EHF &&
424
+ templatePackageId && (
396
425
  <OrderForm
397
426
  callback={handleForm}
398
427
  updateFormData={updateFormData}
@@ -435,9 +464,15 @@ const App: FC<ConfigType> = ({
435
464
  }
436
465
  userActionCallback={userActionCallback}
437
466
  setContactCallback={setContactCallback}
438
- errorValidationTitleMsg={settings?.errorValidationTitleMsg}
439
- errorValidationDenialOrderBlockingMsg={settings?.errorValidationDenialOrderBlockingMsg}
440
- errorValidationBlockingOffersMsg={settings?.errorValidationBlockingOffersMsg}
467
+ errorValidationTitleMsg={
468
+ settings?.errorValidationTitleMsg
469
+ }
470
+ errorValidationDenialOrderBlockingMsg={
471
+ settings?.errorValidationDenialOrderBlockingMsg
472
+ }
473
+ errorValidationBlockingOffersMsg={
474
+ settings?.errorValidationBlockingOffersMsg
475
+ }
441
476
  />
442
477
  )}
443
478
  </>
@@ -17,8 +17,7 @@ export const invoiceLookup = (
17
17
  method: 'POST',
18
18
  url: '/invoicelookup',
19
19
  headers: {
20
- 'S4-ORDERS-API-KEY':
21
- sessionStorage.getItem('sdk_api_key') || '',
20
+ 'S4-ORDERS-API-KEY': sessionStorage.getItem('sdk_api_key') || '',
22
21
  },
23
22
  body,
24
23
  }) as Promise<InvoiceLookupResponseType>;
@@ -13,8 +13,8 @@ type RequestOrderStartType = {
13
13
  orderReference?: string;
14
14
  };
15
15
 
16
- type OrderCompleteRequestType = {
17
- userId: string;
16
+ type OrderCompleteRequestType = {
17
+ userId: string;
18
18
  identityProviderId: string;
19
19
  };
20
20
 
@@ -30,19 +30,20 @@ export const orderStart = (
30
30
  method: 'POST',
31
31
  url: '/order',
32
32
  headers: {
33
- 'S4-ORDERS-API-KEY':
34
- sessionStorage.getItem('sdk_api_key') || '',
33
+ 'S4-ORDERS-API-KEY': sessionStorage.getItem('sdk_api_key') || '',
35
34
  },
36
35
  body,
37
36
  }) as Promise<OrderResponseType>;
38
37
 
39
- export const orderComplete = (id: string, body?: OrderCompleteRequestType): Promise<OrderResponseType> =>
38
+ export const orderComplete = (
39
+ id: string,
40
+ body?: OrderCompleteRequestType
41
+ ): Promise<OrderResponseType> =>
40
42
  fetcher<OrderResponseType, OrderCompleteRequestType | null>({
41
43
  method: 'POST',
42
44
  url: `/order/${id}/complete`,
43
45
  headers: {
44
- 'S4-ORDERS-API-KEY':
45
- sessionStorage.getItem('sdk_api_key') || '',
46
+ 'S4-ORDERS-API-KEY': sessionStorage.getItem('sdk_api_key') || '',
46
47
  },
47
48
  body: body || null,
48
49
  }) as Promise<OrderResponseType>;
@@ -52,8 +53,7 @@ export const orderDelete = (id: string): Promise<OrderResponseType> =>
52
53
  method: 'DELETE',
53
54
  url: `/order/${id}`,
54
55
  headers: {
55
- 'S4-ORDERS-API-KEY':
56
- sessionStorage.getItem('sdk_api_key') || '',
56
+ 'S4-ORDERS-API-KEY': sessionStorage.getItem('sdk_api_key') || '',
57
57
  },
58
58
  body: null,
59
59
  }) as Promise<OrderResponseType>;
@@ -12,8 +12,7 @@ export const createSubscriber = (
12
12
  method: 'POST',
13
13
  url: '/subscriber',
14
14
  headers: {
15
- 'S4-ORDERS-API-KEY':
16
- sessionStorage.getItem('sdk_api_key') || '',
15
+ 'S4-ORDERS-API-KEY': sessionStorage.getItem('sdk_api_key') || '',
17
16
  },
18
17
  body,
19
18
  }) as Promise<CreateSubscriberResponseType>;
@@ -1,24 +1,24 @@
1
1
  @import './variables.scss';
2
2
 
3
3
  .field-label {
4
- display : block;
4
+ display: block;
5
5
  margin-bottom: 0.375em;
6
- font-weight : 500;
7
- text-align : left;
6
+ font-weight: 500;
7
+ text-align: left;
8
8
  }
9
9
 
10
10
  .field-wrapper {
11
- display : flex;
11
+ display: flex;
12
12
  flex-direction: column;
13
- width : 100%;
14
- margin-bottom : 20px;
13
+ width: 100%;
14
+ margin-bottom: 20px;
15
15
 
16
16
  label {
17
- display : block;
18
- order : 1;
17
+ display: block;
18
+ order: 1;
19
19
  margin-bottom: 0.375em;
20
- font-weight : 500;
21
- text-align : left;
20
+ font-weight: 500;
21
+ text-align: left;
22
22
  }
23
23
 
24
24
  .caption {
@@ -31,13 +31,13 @@
31
31
  }
32
32
 
33
33
  .input-control {
34
- width : 100%;
35
- padding : 0.25em 0.5em;
36
- border : 2px solid $input-border-color;
37
- border-radius : 4px;
38
- font-size : 16px;
39
- font-size : max(16px, 1em);
40
- font-family : inherit;
34
+ width: 100%;
35
+ padding: 0.25em 0.5em;
36
+ border: 2px solid $input-border-color;
37
+ border-radius: 4px;
38
+ font-size: 16px;
39
+ font-size: max(16px, 1em);
40
+ font-family: inherit;
41
41
  background-color: $white;
42
42
 
43
43
  &[disabled],
@@ -45,9 +45,9 @@
45
45
  &:read-only,
46
46
  .disabled,
47
47
  .red-only {
48
- border-color : $input-border-disabled-color;
48
+ border-color: $input-border-disabled-color;
49
49
  background-color: $input-border-disabled-bg-color;
50
- cursor : not-allowed;
50
+ cursor: not-allowed;
51
51
  }
52
52
 
53
53
  &:focus {
@@ -57,18 +57,18 @@
57
57
 
58
58
  .radio-button-control {
59
59
  label {
60
- display : flex;
60
+ display: flex;
61
61
  margin-bottom: 0.375em;
62
- font-weight : 500;
63
- position : relative;
64
- overflow : hidden;
65
- cursor : pointer;
62
+ font-weight: 500;
63
+ position: relative;
64
+ overflow: hidden;
65
+ cursor: pointer;
66
66
 
67
67
  input {
68
68
  position: absolute;
69
- left : -9999px;
69
+ left: -9999px;
70
70
 
71
- &:checked+span.value-block {
71
+ &:checked + span.value-block {
72
72
  background-color: mix($white, $primary-color, 84%);
73
73
 
74
74
  &:before {
@@ -78,27 +78,27 @@
78
78
  }
79
79
 
80
80
  span.value-block {
81
- display : flex;
82
- align-items : center;
83
- padding : 0.375em 0.75em 0.375em 0.375em;
81
+ display: flex;
82
+ align-items: center;
83
+ padding: 0.375em 0.75em 0.375em 0.375em;
84
84
  border-radius: 20px;
85
- transition : 0.25s ease;
85
+ transition: 0.25s ease;
86
86
 
87
87
  &:hover {
88
88
  background-color: mix($white, $primary-color, 84%);
89
89
  }
90
90
 
91
91
  &:before {
92
- content : "";
93
- display : flex;
94
- flex-shrink : 0;
95
- width : 1.5em;
96
- height : 1.5em;
97
- margin-right : 0.375em;
98
- border-radius : 50%;
92
+ content: '';
93
+ display: flex;
94
+ flex-shrink: 0;
95
+ width: 1.5em;
96
+ height: 1.5em;
97
+ margin-right: 0.375em;
98
+ border-radius: 50%;
99
99
  background-color: $white;
100
- box-shadow : inset 0 0 0 0.125em $primary-color;
101
- transition : 0.25s ease;
100
+ box-shadow: inset 0 0 0 0.125em $primary-color;
101
+ transition: 0.25s ease;
102
102
  }
103
103
  }
104
104
  }
@@ -110,47 +110,47 @@
110
110
 
111
111
  .sdk-on-off {
112
112
  position: relative;
113
- display : inline-block;
114
- width : 60px;
115
- height : 28px;
113
+ display: inline-block;
114
+ width: 60px;
115
+ height: 28px;
116
116
 
117
117
  input {
118
118
  opacity: 0;
119
- width : 0;
120
- height : 0;
119
+ width: 0;
120
+ height: 0;
121
121
  }
122
122
 
123
- input:checked+.slider:before {
123
+ input:checked + .slider:before {
124
124
  -webkit-transform: translateX(32px);
125
- -ms-transform : translateX(32px);
126
- transform : translateX(32px);
125
+ -ms-transform: translateX(32px);
126
+ transform: translateX(32px);
127
127
  }
128
128
 
129
- input:checked+.slider {
129
+ input:checked + .slider {
130
130
  background-color: $primary-color;
131
131
  }
132
132
 
133
133
  .slider {
134
- position : absolute;
135
- cursor : pointer;
136
- top : 0;
137
- left : 0;
138
- right : 0;
139
- bottom : 0;
140
- background-color : $input-border-disabled-color;
141
- -webkit-transition: .4s;
142
- transition : .4s;
134
+ position: absolute;
135
+ cursor: pointer;
136
+ top: 0;
137
+ left: 0;
138
+ right: 0;
139
+ bottom: 0;
140
+ background-color: $input-border-disabled-color;
141
+ -webkit-transition: 0.4s;
142
+ transition: 0.4s;
143
143
 
144
144
  &:before {
145
- position : absolute;
146
- content : "";
147
- height : 24px;
148
- width : 24px;
149
- left : 2px;
150
- bottom : 2px;
151
- background-color : white;
152
- -webkit-transition: .4s;
153
- transition : .4s;
145
+ position: absolute;
146
+ content: '';
147
+ height: 24px;
148
+ width: 24px;
149
+ left: 2px;
150
+ bottom: 2px;
151
+ background-color: white;
152
+ -webkit-transition: 0.4s;
153
+ transition: 0.4s;
154
154
  }
155
155
 
156
156
  &.round {
@@ -161,4 +161,4 @@
161
161
  }
162
162
  }
163
163
  }
164
- }
164
+ }
@@ -18,7 +18,7 @@
18
18
  }
19
19
 
20
20
  .gap-2 {
21
- gap: 0.5rem
21
+ gap: 0.5rem;
22
22
  }
23
23
 
24
24
  .mt-2 {
@@ -34,7 +34,7 @@
34
34
  }
35
35
 
36
36
  .text-success {
37
- color: $success-color !important
37
+ color: $success-color !important;
38
38
  }
39
39
 
40
40
  .text-center {
@@ -43,4 +43,4 @@
43
43
 
44
44
  .caption {
45
45
  font-size: $xs-font-size;
46
- }
46
+ }
@@ -1,29 +1,29 @@
1
- $white : #fff;
2
- $black : #000;
3
- $blue : #007bff;
4
- $green : #5fa757;
5
- $red : #c9252d;
6
- $grey : #6c757d;
7
- $light-gray : #f8f9fa;
8
- $dark-gray : #343a40;
9
- $error-color : $red;
10
- $success-test-color : $green;
11
- $text-color : $dark-gray;
12
- $primary-color : $blue;
13
- $input-border-color : $grey;
14
- $input-border-disabled-color : #ccc;
1
+ $white: #fff;
2
+ $black: #000;
3
+ $blue: #007bff;
4
+ $green: #5fa757;
5
+ $red: #c9252d;
6
+ $grey: #6c757d;
7
+ $light-gray: #f8f9fa;
8
+ $dark-gray: #343a40;
9
+ $error-color: $red;
10
+ $success-test-color: $green;
11
+ $text-color: $dark-gray;
12
+ $primary-color: $blue;
13
+ $input-border-color: $grey;
14
+ $input-border-disabled-color: #ccc;
15
15
  $input-border-disabled-bg-color: #eee;
16
- $success-color : #155724;
17
- $success-bg-color : #d4edda;
18
- $success-border-color : #c3e6cb;
19
- $danger-color : #721c24;
20
- $danger-bg-color : #f8d7da;
21
- $danger-border-color : #f5c6cb;
22
- $input-focus-h : 245;
23
- $input-focus-s : 100%;
24
- $input-focus-l : 42%;
25
- $font-size : 1rem;
26
- $sm-font-size : 0.875rem;
27
- $xs-font-size : 0.75rem;
28
- $border-radius : 4px;
29
- $size-bezel : 0.5rem;
16
+ $success-color: #155724;
17
+ $success-bg-color: #d4edda;
18
+ $success-border-color: #c3e6cb;
19
+ $danger-color: #721c24;
20
+ $danger-bg-color: #f8d7da;
21
+ $danger-border-color: #f5c6cb;
22
+ $input-focus-h: 245;
23
+ $input-focus-s: 100%;
24
+ $input-focus-l: 42%;
25
+ $font-size: 1rem;
26
+ $sm-font-size: 0.875rem;
27
+ $xs-font-size: 0.75rem;
28
+ $border-radius: 4px;
29
+ $size-bezel: 0.5rem;
@@ -1,21 +1,21 @@
1
1
  @import '../../assets/styles/variables.scss';
2
2
 
3
3
  .sdk-alert {
4
- position : relative;
5
- padding : .75rem 1.25rem;
4
+ position: relative;
5
+ padding: 0.75rem 1.25rem;
6
6
  margin-bottom: 1rem;
7
- border : 1px solid transparent;
8
- border-radius: .25rem;
7
+ border: 1px solid transparent;
8
+ border-radius: 0.25rem;
9
9
 
10
10
  &.danger {
11
- color : $danger-color;
11
+ color: $danger-color;
12
12
  background-color: $danger-bg-color;
13
- border-color : $danger-border-color;
13
+ border-color: $danger-border-color;
14
14
  }
15
15
 
16
16
  &.success {
17
- color : $success-color;
17
+ color: $success-color;
18
18
  background-color: $success-bg-color;
19
- border-color : $success-border-color;
19
+ border-color: $success-border-color;
20
20
  }
21
- }
21
+ }
@@ -1,48 +1,48 @@
1
- @use "sass:color";
1
+ @use 'sass:color';
2
2
 
3
3
  @import '../../assets/styles/variables.scss';
4
4
 
5
5
  .sdk-btn {
6
- appearance : button;
7
- -webkit-appearance : button;
8
- display : inline-block;
9
- padding : 6px 12px;
10
- margin-bottom : 0;
11
- border : 1px solid $input-border-color;
12
- border-radius : $border-radius;
13
- white-space : nowrap;
14
- vertical-align : middle;
15
- font-size : $sm-font-size;
16
- line-height : 1.42857143;
17
- font-weight : 400;
18
- text-align : center;
19
- background-image : none;
20
- background-color : $white;
21
- color : $text-color;
22
- cursor : pointer;
6
+ appearance: button;
7
+ -webkit-appearance: button;
8
+ display: inline-block;
9
+ padding: 6px 12px;
10
+ margin-bottom: 0;
11
+ border: 1px solid $input-border-color;
12
+ border-radius: $border-radius;
13
+ white-space: nowrap;
14
+ vertical-align: middle;
15
+ font-size: $sm-font-size;
16
+ line-height: 1.42857143;
17
+ font-weight: 400;
18
+ text-align: center;
19
+ background-image: none;
20
+ background-color: $white;
21
+ color: $text-color;
22
+ cursor: pointer;
23
23
  -webkit-user-select: none;
24
- -moz-user-select : none;
25
- -ms-user-select : none;
26
- user-select : none;
27
- -ms-touch-action : manipulation;
28
- touch-action : manipulation;
24
+ -moz-user-select: none;
25
+ -ms-user-select: none;
26
+ user-select: none;
27
+ -ms-touch-action: manipulation;
28
+ touch-action: manipulation;
29
29
 
30
30
  &.loading,
31
31
  &.disabled,
32
32
  &:disabled {
33
- opacity : 0.75;
33
+ opacity: 0.75;
34
34
  pointer-events: none;
35
35
  }
36
36
 
37
37
  &.primary-btn {
38
- color : $white;
38
+ color: $white;
39
39
  background-color: $primary-color;
40
- border-color : color.scale($primary-color, $lightness: -20%);
40
+ border-color: color.scale($primary-color, $lightness: -20%);
41
41
 
42
42
  &:hover,
43
43
  &:focus {
44
44
  background-color: color.scale($primary-color, $lightness: -10%);
45
- border-color : color.scale($primary-color, $lightness: -30%);
45
+ border-color: color.scale($primary-color, $lightness: -30%);
46
46
  }
47
47
  }
48
- }
48
+ }
@@ -19,7 +19,10 @@ type Props = {
19
19
  callback: (url: string | null, orderInfo?: OrderInfoType | null) => void;
20
20
  onBack: () => void;
21
21
  submitStartCallback?: (id: string) => void;
22
- userActionCallback?: (action: UserActionEnum, args: object | null | undefined) => void;
22
+ userActionCallback?: (
23
+ action: UserActionEnum,
24
+ args: object | null | undefined
25
+ ) => void;
23
26
  setContactCallback?: (contactInfo: ContactRequestType) => void;
24
27
  className?: string;
25
28
  backButtonText?: string;
@@ -45,9 +48,9 @@ type Props = {
45
48
  paymentMethods?: PaymentMethodEnum[];
46
49
  };
47
50
  invoiceLookupNotFoundText?: string;
48
- errorValidationTitleMsg?: string,
49
- errorValidationDenialOrderBlockingMsg?: string,
50
- errorValidationBlockingOffersMsg?: string,
51
+ errorValidationTitleMsg?: string;
52
+ errorValidationDenialOrderBlockingMsg?: string;
53
+ errorValidationBlockingOffersMsg?: string;
51
54
  };
52
55
 
53
56
  type EHFFormInputsType = {
@@ -84,7 +87,7 @@ const EHFForm: FC<Props> = ({
84
87
  invoiceLookupNotFoundText,
85
88
  errorValidationTitleMsg,
86
89
  errorValidationDenialOrderBlockingMsg,
87
- errorValidationBlockingOffersMsg
90
+ errorValidationBlockingOffersMsg,
88
91
  }) => {
89
92
  const methods = useForm<EHFFormInputsType>({
90
93
  defaultValues: {
@@ -126,7 +129,7 @@ const EHFForm: FC<Props> = ({
126
129
  invoiceLookupNotFoundText,
127
130
  errorValidationTitleMsg,
128
131
  errorValidationDenialOrderBlockingMsg,
129
- errorValidationBlockingOffersMsg
132
+ errorValidationBlockingOffersMsg,
130
133
  });
131
134
 
132
135
  const onSubmit: SubmitHandler<EHFFormInputsType> = async (
@@ -40,12 +40,14 @@ const AddressField: FC<Props> = ({
40
40
  {...register(name, {
41
41
  required: required ? errorReqMsg : false,
42
42
  })}
43
- {...(required ? {
44
- onBlur: () => {
45
- const newValue = value?.trim() || '';
46
- setValue(name, newValue);
47
- },
48
- } : '')}
43
+ {...(required
44
+ ? {
45
+ onBlur: () => {
46
+ const newValue = value?.trim() || '';
47
+ setValue(name, newValue);
48
+ },
49
+ }
50
+ : '')}
49
51
  />
50
52
  <label className="label-control" htmlFor={id}>
51
53
  {label} {required && <span className="text-error">*</span>}
@@ -24,7 +24,7 @@ const ToggleField: FC<Props> = ({
24
24
  label = '',
25
25
  errorReqMsg = 'This field is required!',
26
26
  errors,
27
- toggleCallback
27
+ toggleCallback,
28
28
  }) => {
29
29
  const { register } = useFormContext();
30
30
  const id = uuidv4();
@@ -46,7 +46,9 @@ const ToggleField: FC<Props> = ({
46
46
  {...register(name, {
47
47
  required: required ? errorReqMsg : false,
48
48
  })}
49
- onClick={(e) => toggleCallback?.(e.currentTarget.checked)}
49
+ onClick={(e) =>
50
+ toggleCallback?.(e.currentTarget.checked)
51
+ }
50
52
  />
51
53
  <span className="slider round"></span>
52
54
  </label>
@@ -1,27 +1,27 @@
1
1
  @import '../../assets/styles/variables.scss';
2
2
 
3
3
  .sdk-loader {
4
- border : 2px solid $light-gray;
5
- border-top : 2px solid transparent;
4
+ border: 2px solid $light-gray;
5
+ border-top: 2px solid transparent;
6
6
  border-radius: 50%;
7
- width : 16px;
8
- height : 16px;
9
- animation : spin 2s linear infinite;
7
+ width: 16px;
8
+ height: 16px;
9
+ animation: spin 2s linear infinite;
10
10
 
11
11
  &.size-md {
12
12
  border-width: 4px;
13
- width : 32px;
14
- height : 32px;
13
+ width: 32px;
14
+ height: 32px;
15
15
  }
16
16
 
17
17
  &.size-lg {
18
18
  border-width: 8px;
19
- width : 64px;
20
- height : 64px;
19
+ width: 64px;
20
+ height: 64px;
21
21
  }
22
22
 
23
23
  &.dark-color {
24
- border-color : $dark-gray;
24
+ border-color: $dark-gray;
25
25
  border-top-color: transparent;
26
26
  }
27
27
  }
@@ -34,4 +34,4 @@
34
34
  100% {
35
35
  transform: rotate(360deg);
36
36
  }
37
- }
37
+ }
@@ -20,7 +20,10 @@ type Props = {
20
20
  callback: (url: string | null, orderInfo?: OrderInfoType | null) => void;
21
21
  onBack: () => void;
22
22
  submitStartCallback?: (id: string) => void;
23
- userActionCallback?: (action: UserActionEnum, args: object | null | undefined) => void;
23
+ userActionCallback?: (
24
+ action: UserActionEnum,
25
+ args: object | null | undefined
26
+ ) => void;
24
27
  setContactCallback?: (contactInfo: ContactRequestType) => void;
25
28
  className?: string;
26
29
  backButtonText?: string;
@@ -46,9 +49,9 @@ type Props = {
46
49
  paymentMethods?: PaymentMethodEnum[];
47
50
  };
48
51
  invoiceLookupNotFoundText?: string;
49
- errorValidationTitleMsg?: string,
50
- errorValidationDenialOrderBlockingMsg?: string,
51
- errorValidationBlockingOffersMsg?: string,
52
+ errorValidationTitleMsg?: string;
53
+ errorValidationDenialOrderBlockingMsg?: string;
54
+ errorValidationBlockingOffersMsg?: string;
52
55
  };
53
56
 
54
57
  type OIOFormInputsType = {
@@ -88,7 +91,7 @@ const EHFForm: FC<Props> = ({
88
91
  invoiceLookupNotFoundText,
89
92
  errorValidationTitleMsg,
90
93
  errorValidationDenialOrderBlockingMsg,
91
- errorValidationBlockingOffersMsg
94
+ errorValidationBlockingOffersMsg,
92
95
  }) => {
93
96
  const methods = useForm<OIOFormInputsType>({
94
97
  defaultValues: {
@@ -134,7 +137,7 @@ const EHFForm: FC<Props> = ({
134
137
  invoiceLookupNotFoundText,
135
138
  errorValidationTitleMsg,
136
139
  errorValidationDenialOrderBlockingMsg,
137
- errorValidationBlockingOffersMsg
140
+ errorValidationBlockingOffersMsg,
138
141
  });
139
142
 
140
143
  const onSubmit: SubmitHandler<OIOFormInputsType> = async (
@@ -26,7 +26,10 @@ type Props = {
26
26
  callback: (url: string | null, orderInfo?: OrderInfoType | null) => void;
27
27
  updateFormData: (data: OrderFormInputsType) => void;
28
28
  submitStartCallback?: (id: string) => void;
29
- userActionCallback?: (action: UserActionEnum, args: object | null | undefined) => void;
29
+ userActionCallback?: (
30
+ action: UserActionEnum,
31
+ args: object | null | undefined
32
+ ) => void;
30
33
  setContactCallback?: (contactInfo: ContactRequestType) => void;
31
34
  templatePackageId: string;
32
35
  subscriberId?: string;
@@ -53,9 +56,9 @@ type Props = {
53
56
  fields?: OrderFormFiledType[];
54
57
  paymentMethods?: PaymentMethodEnum[];
55
58
  };
56
- errorValidationTitleMsg?: string,
57
- errorValidationDenialOrderBlockingMsg?: string,
58
- errorValidationBlockingOffersMsg?: string,
59
+ errorValidationTitleMsg?: string;
60
+ errorValidationDenialOrderBlockingMsg?: string;
61
+ errorValidationBlockingOffersMsg?: string;
59
62
  };
60
63
 
61
64
  const initialData = {
@@ -99,15 +102,14 @@ const OrderForm: FC<Props> = ({
99
102
  errorInvalidPhoneMsg = '',
100
103
  errorValidationTitleMsg,
101
104
  errorValidationDenialOrderBlockingMsg,
102
- errorValidationBlockingOffersMsg
105
+ errorValidationBlockingOffersMsg,
103
106
  }) => {
104
-
105
107
  if (!templatePackageId) {
106
- console.error('"templatePackageId" should be set' );
108
+ console.error('"templatePackageId" should be set');
107
109
  }
108
110
 
109
111
  if (!organizationId) {
110
- console.error('"organizationId" should be set' );
112
+ console.error('"organizationId" should be set');
111
113
  }
112
114
 
113
115
  if (!subscriberId) {
@@ -118,11 +120,11 @@ const OrderForm: FC<Props> = ({
118
120
  }
119
121
 
120
122
  if (!userId) {
121
- console.error('"userId" should be set' );
123
+ console.error('"userId" should be set');
122
124
  }
123
125
 
124
126
  if (!identityProviderId) {
125
- console.error('"identityProviderId" should be set' );
127
+ console.error('"identityProviderId" should be set');
126
128
  }
127
129
 
128
130
  const [orderFields, setOrderFields] = useState<OrderFormFiledType[]>(
@@ -187,7 +189,7 @@ const OrderForm: FC<Props> = ({
187
189
  invoiceOrderFields,
188
190
  errorValidationTitleMsg,
189
191
  errorValidationDenialOrderBlockingMsg,
190
- errorValidationBlockingOffersMsg
192
+ errorValidationBlockingOffersMsg,
191
193
  });
192
194
 
193
195
  const onSubmit: SubmitHandler<OrderFormInputsType> = async (
@@ -215,7 +217,9 @@ const OrderForm: FC<Props> = ({
215
217
  setValue('invoiceAddressSelection', false);
216
218
  }
217
219
 
218
- userActionCallback?.(UserActionEnum.SELECT_PAYMENT_METHOD, { paymentMethod: e.target.value });
220
+ userActionCallback?.(UserActionEnum.SELECT_PAYMENT_METHOD, {
221
+ paymentMethod: e.target.value,
222
+ });
219
223
  };
220
224
 
221
225
  const allowPaymentMethod = useMemo(() => {
@@ -311,7 +315,12 @@ const OrderForm: FC<Props> = ({
311
315
  label={
312
316
  invoiceAddressSelection?.label ?? 'Invoice Address'
313
317
  }
314
- toggleCallback={e => userActionCallback?.(UserActionEnum.TOGGLE_INVOICE_ADDRESS, { value: e })}
318
+ toggleCallback={(e) =>
319
+ userActionCallback?.(
320
+ UserActionEnum.TOGGLE_INVOICE_ADDRESS,
321
+ { value: e }
322
+ )
323
+ }
315
324
  />
316
325
  )}
317
326
  {showInvoiceFields && (
@@ -1,10 +1,10 @@
1
1
  @import '../../assets/styles/variables.scss';
2
2
 
3
3
  .sdk-order-form {
4
- max-width : 320px;
5
- margin : auto;
6
- display : flex;
4
+ max-width: 320px;
5
+ margin: auto;
6
+ display: flex;
7
7
  flex-direction: column;
8
- align-items : center;
9
- text-align : left;
10
- }
8
+ align-items: center;
9
+ text-align: left;
10
+ }
@@ -4,7 +4,11 @@ import { SubmitHandler } from 'react-hook-form';
4
4
  import { createSubscriber } from '../api/SubscribeApi';
5
5
  import { orderStart } from '../api/OrdersApi';
6
6
  import { invoiceLookup } from '../api/InvoiceApi';
7
- import { InvoiceLookupNetworkEnum, PaymentMethodEnum, UserActionEnum } from '../enums/general';
7
+ import {
8
+ InvoiceLookupNetworkEnum,
9
+ PaymentMethodEnum,
10
+ UserActionEnum,
11
+ } from '../enums/general';
8
12
  import { WRONG_MSG, PAYMENT_METHOD_DEFAULT } from '../constants/index';
9
13
  import { OrderFormInputsType, OrderInfoType } from '../types/order';
10
14
  import {
@@ -27,8 +31,13 @@ import {
27
31
  type Props = {
28
32
  callback: (url: string | null, orderInfo?: OrderInfoType | null) => void;
29
33
  submitStartCallback?: (id: string) => void;
30
- userActionCallback?: (action: UserActionEnum, args: object | null | undefined) => void;
31
- setContactCallback?: (contactInfo: ContactRequestType) => void;
34
+ userActionCallback?: (
35
+ action: UserActionEnum,
36
+ args: object | null | undefined
37
+ ) => void;
38
+ setContactCallback?: (
39
+ contactInfo: ContactRequestType
40
+ ) => void;
32
41
  templatePackageId: string;
33
42
  subscriberId?: string;
34
43
  userId?: string;
@@ -43,9 +52,9 @@ type Props = {
43
52
  invoiceAddressToggle?: boolean;
44
53
  invoiceOrderFields: OrderFormFiledType[];
45
54
  invoiceLookupNotFoundText?: string;
46
- errorValidationTitleMsg?: string,
47
- errorValidationDenialOrderBlockingMsg?: string,
48
- errorValidationBlockingOffersMsg?: string
55
+ errorValidationTitleMsg?: string;
56
+ errorValidationDenialOrderBlockingMsg?: string;
57
+ errorValidationBlockingOffersMsg?: string;
49
58
  };
50
59
 
51
60
  const useOrderForm = ({
@@ -69,7 +78,7 @@ const useOrderForm = ({
69
78
  invoiceLookupNotFoundText,
70
79
  errorValidationTitleMsg,
71
80
  errorValidationDenialOrderBlockingMsg,
72
- errorValidationBlockingOffersMsg
81
+ errorValidationBlockingOffersMsg,
73
82
  }: Props) => {
74
83
  const [loading, setLoading] = useState<boolean>(false);
75
84
  const [apiErrorMsg, setApiErrorMsg] = useState<string>('');
@@ -100,15 +109,20 @@ const useOrderForm = ({
100
109
  }
101
110
 
102
111
  // TODO: "recievesInvoice" should be deleted in the future
103
- const receivesInvoice = invoiceResponse?.receivesInvoice || invoiceResponse?.recievesInvoice;
112
+ const receivesInvoice =
113
+ invoiceResponse?.receivesInvoice ||
114
+ invoiceResponse?.recievesInvoice;
104
115
 
105
116
  if (invoiceResponse) {
106
- userActionCallback?.(UserActionEnum.SEARCH_ORGANIZATION_NUMBER, {
107
- organizationNumber: data.organizationNumber,
108
- cvr: data.cvr,
109
- gln: data.gln,
110
- found: !!receivesInvoice
111
- });
117
+ userActionCallback?.(
118
+ UserActionEnum.SEARCH_ORGANIZATION_NUMBER,
119
+ {
120
+ organizationNumber: data.organizationNumber,
121
+ cvr: data.cvr,
122
+ gln: data.gln,
123
+ found: !!receivesInvoice,
124
+ }
125
+ );
112
126
  }
113
127
 
114
128
  if (invoiceResponse && !receivesInvoice) {
@@ -138,6 +152,8 @@ const useOrderForm = ({
138
152
  sessionStorage.setItem('subscriberId', id); // For avoiding attempt of creating subscriber again
139
153
  }
140
154
 
155
+ console.log('Dette er en ny testversjon av OSDK');
156
+
141
157
  if (setContactCallback) {
142
158
  setContactCallback(contactModel);
143
159
  }
@@ -196,15 +212,16 @@ const useOrderForm = ({
196
212
  setApiErrorMsg(WRONG_MSG);
197
213
  setErrorsMsg([]);
198
214
  } catch (error) {
199
-
200
215
  const translations = {
201
216
  errorValidationTitleMsg,
202
217
  errorValidationBlockingOffersMsg,
203
- errorValidationDenialOrderBlockingMsg
218
+ errorValidationDenialOrderBlockingMsg,
204
219
  } as ErrorMessages;
205
220
 
206
221
  console.error(error);
207
- setApiErrorMsg(prepareErrorMessage(error as Error, undefined, translations));
222
+ setApiErrorMsg(
223
+ prepareErrorMessage(error as Error, undefined, translations)
224
+ );
208
225
  setErrorsMsg(
209
226
  prepareErrorsArrayMessage(
210
227
  (
package/src/index.tsx CHANGED
@@ -8,13 +8,12 @@ import App from './App';
8
8
  export const orderComponent = {
9
9
  root: null as Root | null,
10
10
  init: function (config: ConfigType) {
11
-
12
11
  if (!config.apiKey) {
13
- console.error('"apiKey" should be set' );
12
+ console.error('"apiKey" should be set');
14
13
  }
15
-
14
+
16
15
  if (!config.apiUrl) {
17
- console.error('"apiUrl" should be set' );
16
+ console.error('"apiUrl" should be set');
18
17
  }
19
18
 
20
19
  const domNode = document.getElementById(config.domElementId);
@@ -36,8 +36,12 @@ export type ContactRequestType = {
36
36
 
37
37
  export type ConfigType = {
38
38
  submitStartCallback?: (subscriberId: string) => void;
39
- userActionCallback?: (action: UserActionEnum, args: object | null | undefined) => void;
39
+ userActionCallback?: (
40
+ action: UserActionEnum,
41
+ args: object | null | undefined
42
+ ) => void;
40
43
  setContactCallback?: (contactInfo: ContactRequestType) => void;
44
+ cancelVippsCallback?: () => void;
41
45
  domElementId: string;
42
46
  moduleTitle?: string;
43
47
  templatePackageId: string;
@@ -1,7 +1,11 @@
1
1
  import { WRONG_MSG } from '../constants/index';
2
2
  import { ErrorsMsg } from '../types/general';
3
3
 
4
- export const prepareErrorMessage = (error: Error, defaultMsg?: string, translations?: ErrorMessages) => {
4
+ export const prepareErrorMessage = (
5
+ error: Error,
6
+ defaultMsg?: string,
7
+ translations?: ErrorMessages
8
+ ) => {
5
9
  if (typeof error === 'string') {
6
10
  try {
7
11
  const parsedError = JSON.parse(error);
@@ -10,12 +14,20 @@ export const prepareErrorMessage = (error: Error, defaultMsg?: string, translati
10
14
  return translateError(error, translations);
11
15
  }
12
16
  } else {
13
- const serverErrorMsg = (error as { message: string })?.message as string;
14
- return translateError(serverErrorMsg, translations) || defaultMsg || WRONG_MSG;
17
+ const serverErrorMsg = (error as { message: string })
18
+ ?.message as string;
19
+ return (
20
+ translateError(serverErrorMsg, translations) ||
21
+ defaultMsg ||
22
+ WRONG_MSG
23
+ );
15
24
  }
16
25
  };
17
26
 
18
- export const prepareErrorsArrayMessage = (errors: ErrorsMsg | null, translations?: ErrorMessages) => {
27
+ export const prepareErrorsArrayMessage = (
28
+ errors: ErrorsMsg | null,
29
+ translations?: ErrorMessages
30
+ ) => {
19
31
  const msg: string[] = [];
20
32
 
21
33
  if (errors) {
@@ -43,9 +55,9 @@ export function uuidv4() {
43
55
  }
44
56
 
45
57
  export type ErrorMessages = {
46
- errorValidationTitleMsg: string,
47
- errorValidationBlockingOffersMsg: string,
48
- errorValidationDenialOrderBlockingMsg: string,
58
+ errorValidationTitleMsg: string;
59
+ errorValidationBlockingOffersMsg: string;
60
+ errorValidationDenialOrderBlockingMsg: string;
49
61
  };
50
62
 
51
63
  const translateError = (errorMsg: string, translations?: ErrorMessages) => {
@@ -53,8 +65,7 @@ const translateError = (errorMsg: string, translations?: ErrorMessages) => {
53
65
  return errorMsg;
54
66
  }
55
67
 
56
- switch(errorMsg)
57
- {
68
+ switch (errorMsg) {
58
69
  case 'One or more validation errors occurred.':
59
70
  return translations?.errorValidationTitleMsg;
60
71
  case 'The order/subscription will not be created because the subscriber has a denial order blocking offers.':
@@ -62,6 +73,6 @@ const translateError = (errorMsg: string, translations?: ErrorMessages) => {
62
73
  case 'The order/subscription will not be created because the subscriber has a denial order blocking all.':
63
74
  return translations?.errorValidationDenialOrderBlockingMsg;
64
75
  default:
65
- return errorMsg;
76
+ return errorMsg;
66
77
  }
67
- }
78
+ };
@@ -15,7 +15,17 @@ type AgreementModelType = {
15
15
  };
16
16
 
17
17
  const mapToSwedbankLanguage = (language: string) => {
18
- const allowedLanguages = [ 'en-US', 'sv-SE', 'nb-NO', 'da-DK', 'fi-FI', 'en-GB', 'nn-NO', 'no-NO', 'se-NO' ];
18
+ const allowedLanguages = [
19
+ 'en-US',
20
+ 'sv-SE',
21
+ 'nb-NO',
22
+ 'da-DK',
23
+ 'fi-FI',
24
+ 'en-GB',
25
+ 'nn-NO',
26
+ 'no-NO',
27
+ 'se-NO',
28
+ ];
19
29
  if (allowedLanguages.includes(language)) {
20
30
  return language;
21
31
  }