@akinon/pz-masterpass-rest 2.0.0-beta.12 → 2.0.0-beta.14

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.
@@ -8,102 +8,111 @@ import {
8
8
  AddCardResponse
9
9
  } from '../types/account.types';
10
10
  import { store } from 'redux/store';
11
+ import { createSessionExpiredResponse, withUnhandledRejectionHandler } from '../utils/session-handler';
11
12
 
12
13
  export class AccountService {
13
- private get token(): string {
14
- return store.getState().masterpassRest.token || '';
15
- }
16
-
17
- private get merchantId(): string {
18
- return store.getState().masterpassRest.tokenData?.MerchantId || '';
19
- }
14
+ private _token: string;
15
+ private _merchantId: string;
20
16
 
21
- constructor() {
17
+ constructor(token?: string, merchantId?: string) {
18
+ this._token = token || store.getState().masterpassRest.token || '';
19
+ this._merchantId = merchantId || store.getState().masterpassRest.tokenData?.MerchantId || '';
22
20
  this.initialize();
23
21
  }
24
22
 
25
23
  private initialize(): void {
26
24
  if (!window.Masterpass) {
27
- console.error('window.Masterpass not available in AccountService');
28
25
  return;
29
26
  }
30
27
 
31
28
  if (window.Masterpass.setToken) {
32
- window.Masterpass.setToken(this.token);
29
+ window.Masterpass.setToken(this._token);
33
30
  }
34
31
 
35
32
  if (window.Masterpass.setMerchantId) {
36
- window.Masterpass.setMerchantId(this.merchantId);
33
+ window.Masterpass.setMerchantId(this._merchantId);
37
34
  }
38
35
  }
39
36
 
40
37
  accountAccess(request: AccountAccessRequest): Promise<AccountAccessResponse> {
41
- return new Promise((resolve, reject) => {
42
- try {
43
- this.initialize();
38
+ return withUnhandledRejectionHandler(
39
+ () => new Promise((resolve, reject) => {
40
+ try {
41
+ this.initialize();
44
42
 
45
- window.Masterpass.accountService.accountAccess(
46
- request,
47
- (statusCode: number, response: AccountAccessResponse) => {
48
- resolve(response);
49
- }
50
- );
51
- } catch (error) {
52
- console.error('AccountAccess error:', error);
53
- reject(error);
54
- }
55
- });
43
+ window.Masterpass.accountService.accountAccess(
44
+ request,
45
+ (statusCode: number, response: AccountAccessResponse) => {
46
+ resolve(response);
47
+ }
48
+ );
49
+ } catch (error) {
50
+ console.error('AccountAccess error:', error);
51
+ reject(error);
52
+ }
53
+ }),
54
+ createSessionExpiredResponse<AccountAccessResponse>()
55
+ );
56
56
  }
57
57
 
58
58
  linkToMerchant(request: {
59
59
  accountKey: string;
60
60
  }): Promise<LinkToMerchantResponseType> {
61
- return new Promise((resolve, reject) => {
62
- try {
63
- this.initialize();
61
+ return withUnhandledRejectionHandler(
62
+ () => new Promise((resolve, reject) => {
63
+ try {
64
+ this.initialize();
64
65
 
65
- window.Masterpass.accountService.linkToMerchant(
66
- request,
67
- (statusCode: number, response: LinkToMerchantResponseType) => {
68
- resolve(response);
69
- }
70
- );
71
- } catch (error) {
72
- reject(error);
73
- }
74
- });
66
+ window.Masterpass.accountService.linkToMerchant(
67
+ request,
68
+ (statusCode: number, response: LinkToMerchantResponseType) => {
69
+ resolve(response);
70
+ }
71
+ );
72
+ } catch (error) {
73
+ reject(error);
74
+ }
75
+ }),
76
+ createSessionExpiredResponse<LinkToMerchantResponseType>()
77
+ );
75
78
  }
76
79
 
77
80
  removeCard(req: RemoveCardRequest): Promise<RemoveCardServiceResponse> {
78
- return new Promise((resolve, reject) => {
79
- try {
80
- this.initialize();
81
- window.Masterpass.accountService.removeCard(
82
- req,
83
- (statusCode: number, response: RemoveCardServiceResponse) => {
84
- resolve(response);
85
- }
86
- );
87
- } catch (error) {
88
- reject(error);
89
- }
90
- });
81
+ return withUnhandledRejectionHandler(
82
+ () => new Promise((resolve, reject) => {
83
+ try {
84
+ this.initialize();
85
+ window.Masterpass.accountService.removeCard(
86
+ req,
87
+ (statusCode: number, response: RemoveCardServiceResponse) => {
88
+ resolve(response);
89
+ }
90
+ );
91
+ } catch (error) {
92
+ reject(error);
93
+ }
94
+ }),
95
+ createSessionExpiredResponse<RemoveCardServiceResponse>()
96
+ );
91
97
  }
92
98
 
93
99
  addCard(request: AddCardRequest): Promise<AddCardResponse> {
94
- return new Promise((resolve, reject) => {
95
- try {
96
- this.initialize();
100
+ return withUnhandledRejectionHandler(
101
+ () => new Promise((resolve, reject) => {
102
+ try {
103
+ this.initialize();
97
104
 
98
- window.Masterpass.accountService.addCard(
99
- request,
100
- (statusCode: number, response: AddCardResponse) => {
101
- resolve(response);
102
- }
103
- );
104
- } catch (error) {
105
- reject(error);
106
- }
107
- });
105
+ window.Masterpass.accountService.addCard(
106
+ request,
107
+ (statusCode: number, response: AddCardResponse) => {
108
+ resolve(response);
109
+ }
110
+ );
111
+ } catch (error) {
112
+ reject(error);
113
+ }
114
+ }),
115
+ createSessionExpiredResponse<AddCardResponse>()
116
+ );
108
117
  }
109
118
  }
@@ -5,6 +5,7 @@ import {
5
5
  MPResponse,
6
6
  type PaymentProcessRequest
7
7
  } from '../types/payment.types';
8
+ import { withUnhandledRejectionHandler } from '../utils/session-handler';
8
9
 
9
10
  export interface PaymentResponse {
10
11
  success: boolean;
@@ -13,119 +14,156 @@ export interface PaymentResponse {
13
14
  }
14
15
 
15
16
  export class PaymentService {
16
- private get token(): string {
17
- return store.getState().masterpassRest.token || '';
18
- }
19
-
20
- private get merchantId(): string {
21
- return store.getState().masterpassRest.tokenData?.MerchantId || '';
22
- }
17
+ private _token: string;
18
+ private _merchantId: string;
23
19
 
24
- constructor() {
20
+ constructor(token?: string, merchantId?: string) {
21
+ this._token = token || store.getState().masterpassRest.token || '';
22
+ this._merchantId =
23
+ merchantId || store.getState().masterpassRest.tokenData?.MerchantId || '';
25
24
  this.initialize();
26
25
  }
27
26
 
28
27
  private initialize(): void {
29
- window.Masterpass.setToken(this.token);
30
- window.Masterpass.setMerchantId(this.merchantId);
28
+ window.Masterpass.setToken(this._token);
29
+ window.Masterpass.setMerchantId(this._merchantId);
30
+ }
31
+
32
+ private extractErrorMessage(error: unknown, fallback: string): string {
33
+ if (error instanceof Error) return error.message;
34
+ if (typeof error === 'string') return error;
35
+ return fallback;
31
36
  }
32
37
 
33
38
  async processPayment(
34
39
  paymentData: PaymentProcessRequest
35
40
  ): Promise<PaymentResponse> {
36
- return new Promise((resolve) => {
37
- try {
38
- this.initialize();
41
+ return withUnhandledRejectionHandler(
42
+ () =>
43
+ new Promise((resolve) => {
44
+ try {
45
+ this.initialize();
39
46
 
40
- window.Masterpass.paymentService.payment(
41
- {
42
- requestReferenceNo: paymentData.requestReferenceNo,
43
- cvc: paymentData.cvc,
44
- cardAlias: paymentData.cardAlias,
45
- accountKey: paymentData.accountKey,
46
- amount: paymentData.amount,
47
- orderNo: paymentData.orderNo,
48
- currencyCode: paymentData.currencyCode,
49
- paymentType: paymentData.paymentType,
50
- acquirerIcaNumber: paymentData.acquirerIcaNumber,
51
- installmentCount: paymentData.installmentCount,
52
- authenticationMethod: paymentData.authenticationMethod,
53
- secure3DModel: paymentData.secure3DModel,
54
- terminalGroupId: paymentData.terminalGroupId
55
- },
56
- (statusCode, response) => {
57
- if (response && response.statusCode === 200) {
58
- resolve({
59
- success: true,
60
- data: response
61
- });
62
- } else {
63
- resolve({
64
- success: false,
65
- error: response?.description || 'Payment failed',
66
- data: response
67
- });
68
- }
47
+ window.Masterpass.paymentService.payment(
48
+ {
49
+ requestReferenceNo: paymentData.requestReferenceNo,
50
+ cvc: paymentData.cvc,
51
+ cardAlias: paymentData.cardAlias,
52
+ accountKey: paymentData.accountKey,
53
+ amount: paymentData.amount,
54
+ orderNo: paymentData.orderNo,
55
+ currencyCode: paymentData.currencyCode,
56
+ paymentType: paymentData.paymentType,
57
+ acquirerIcaNumber: paymentData.acquirerIcaNumber,
58
+ installmentCount: paymentData.installmentCount,
59
+ authenticationMethod: paymentData.authenticationMethod,
60
+ secure3DModel: paymentData.secure3DModel,
61
+ terminalGroupId: paymentData.terminalGroupId,
62
+ ...(paymentData.additionalFields || {})
63
+ },
64
+ (statusCode, response) => {
65
+ if (response && response.statusCode === 200) {
66
+ resolve({
67
+ success: true,
68
+ data: response
69
+ });
70
+ } else {
71
+ resolve({
72
+ success: false,
73
+ error: response?.description || 'Payment failed',
74
+ data: response
75
+ });
76
+ }
77
+ }
78
+ );
79
+ } catch (error) {
80
+ resolve({
81
+ success: false,
82
+ error: this.extractErrorMessage(error, 'Payment service initialization failed')
83
+ });
84
+ }
85
+ }),
86
+ {
87
+ success: false,
88
+ error: 'Session has expired',
89
+ data: {
90
+ statusCode: 401,
91
+ exception: {
92
+ code: 'TOKEN_HAS_EXPIRED',
93
+ message: 'Session has expired'
69
94
  }
70
- );
71
- } catch (error) {
72
- resolve({
73
- success: false,
74
- error: 'Payment service initialization failed'
75
- });
95
+ }
76
96
  }
77
- });
97
+ );
78
98
  }
79
99
 
80
100
  async directPayment(
81
101
  paymentData: DirectPaymentRequest
82
102
  ): Promise<PaymentResponse> {
83
- return new Promise((resolve) => {
84
- try {
85
- this.initialize();
103
+ return withUnhandledRejectionHandler(
104
+ () =>
105
+ new Promise((resolve) => {
106
+ try {
107
+ this.initialize();
86
108
 
87
- window.Masterpass.paymentService.directPayment(
88
- {
89
- requestReferenceNo: paymentData.requestReferenceNo,
90
- cvc: paymentData.cvc,
91
- cardNumber: paymentData.cardNumber,
92
- cardHolderName: paymentData.cardHolderName,
93
- expiryDate: paymentData.expiryDate,
94
- accountKey: paymentData.accountKey,
95
- amount: paymentData.amount,
96
- orderNo: paymentData.orderNo,
97
- currencyCode: paymentData.currencyCode,
98
- paymentType: paymentData.paymentType,
99
- acquirerIcaNumber: paymentData.acquirerIcaNumber,
100
- installmentCount: paymentData.installmentCount,
101
- authenticationMethod: paymentData.authenticationMethod,
102
- secure3DModel: paymentData.secure3DModel,
103
- terminalGroupId: paymentData.terminalGroupId
104
- },
105
- (statusCode: number, response: MPResponse<DirectPaymentResponse>) => {
106
- if (response && response.statusCode === 200) {
107
- resolve({
108
- success: true,
109
- data: response
110
- });
111
- } else {
112
- resolve({
113
- success: false,
114
- error:
115
- response?.result?.responseDescription ||
116
- response?.exception?.message ||
117
- 'Direct payment failed',
118
- data: response
119
- });
120
- }
109
+ window.Masterpass.paymentService.directPayment(
110
+ {
111
+ requestReferenceNo: paymentData.requestReferenceNo,
112
+ cvc: paymentData.cvc,
113
+ cardNumber: paymentData.cardNumber,
114
+ cardHolderName: paymentData.cardHolderName,
115
+ expiryDate: paymentData.expiryDate,
116
+ accountKey: paymentData.accountKey,
117
+ amount: paymentData.amount,
118
+ orderNo: paymentData.orderNo,
119
+ currencyCode: paymentData.currencyCode,
120
+ paymentType: paymentData.paymentType,
121
+ acquirerIcaNumber: paymentData.acquirerIcaNumber,
122
+ installmentCount: paymentData.installmentCount,
123
+ authenticationMethod: paymentData.authenticationMethod,
124
+ secure3DModel: paymentData.secure3DModel,
125
+ terminalGroupId: paymentData.terminalGroupId,
126
+ ...(paymentData.additionalFields || {})
127
+ },
128
+ (
129
+ statusCode: number,
130
+ response: MPResponse<DirectPaymentResponse>
131
+ ) => {
132
+ if (response && response.statusCode === 200) {
133
+ resolve({
134
+ success: true,
135
+ data: response
136
+ });
137
+ } else {
138
+ resolve({
139
+ success: false,
140
+ error:
141
+ response?.result?.responseDescription ||
142
+ response?.exception?.message ||
143
+ 'Direct payment failed',
144
+ data: response
145
+ });
146
+ }
147
+ }
148
+ );
149
+ } catch (error) {
150
+ resolve({
151
+ success: false,
152
+ error: this.extractErrorMessage(error, 'Direct payment service initialization failed')
153
+ });
154
+ }
155
+ }),
156
+ {
157
+ success: false,
158
+ error: 'Session has expired',
159
+ data: {
160
+ statusCode: 401,
161
+ exception: {
162
+ code: 'TOKEN_HAS_EXPIRED',
163
+ message: 'Session has expired'
121
164
  }
122
- );
123
- } catch (error) {
124
- resolve({
125
- success: false,
126
- error: 'Direct payment service initialization failed'
127
- });
165
+ }
128
166
  }
129
- });
167
+ );
130
168
  }
131
169
  }
@@ -1,60 +1,60 @@
1
1
  import { MPResponse } from '../types/payment.types';
2
2
  import { VerifyRequest, VerifyResponse } from '../types/verify.types';
3
3
  import { store } from 'redux/store';
4
+ import { createSessionExpiredResponse, withUnhandledRejectionHandler } from '../utils/session-handler';
4
5
 
5
6
  export class VerifyService {
6
- constructor() {
7
- this.initialize();
8
- }
7
+ private _token: string;
8
+ private _merchantId: string;
9
9
 
10
- private get token(): string {
11
- return store.getState().masterpassRest.token || '';
12
- }
13
-
14
- private get decodedToken(): any {
15
- return store.getState().masterpassRest.tokenData || '';
16
- }
17
-
18
- private get merchantId(): string {
19
- return store.getState().masterpassRest.tokenData?.MerchantId || '';
10
+ constructor(token?: string, merchantId?: string) {
11
+ this._token = token || store.getState().masterpassRest.token || '';
12
+ this._merchantId = merchantId || store.getState().masterpassRest.tokenData?.MerchantId || '';
13
+ this.initialize();
20
14
  }
21
15
 
22
16
  private initialize(): void {
23
- window.Masterpass.setToken(this.token);
24
- window.Masterpass.setMerchantId(this.merchantId);
17
+ window.Masterpass.setToken(this._token);
18
+ window.Masterpass.setMerchantId(this._merchantId);
25
19
  }
26
20
 
27
21
  verifyOtp(request: VerifyRequest): Promise<MPResponse<VerifyResponse>> {
28
- return new Promise((resolve, reject) => {
29
- try {
30
- this.initialize();
31
-
32
- window.Masterpass.verifyService.verifyOtp(
33
- request,
34
- (statusCode, response) => {
35
- resolve(response);
36
- }
37
- );
38
- } catch (error) {
39
- reject(error);
40
- }
41
- });
22
+ return withUnhandledRejectionHandler(
23
+ () => new Promise((resolve, reject) => {
24
+ try {
25
+ this.initialize();
26
+
27
+ window.Masterpass.verifyService.verifyOtp(
28
+ request,
29
+ (statusCode, response) => {
30
+ resolve(response);
31
+ }
32
+ );
33
+ } catch (error) {
34
+ reject(error);
35
+ }
36
+ }),
37
+ createSessionExpiredResponse<MPResponse<VerifyResponse>>()
38
+ );
42
39
  }
43
40
 
44
- resendOtp(): Promise<MPResponse<VerifyResponse>> {
45
- return new Promise((resolve, reject) => {
46
- try {
47
- this.initialize();
48
-
49
- window.Masterpass.verifyService.resendOtp(
50
- {token: this.token},
51
- (statusCode, response) => {
52
- resolve(response);
53
- }
54
- );
55
- } catch (error) {
56
- reject(error);
57
- }
58
- });
41
+ resendOtp(otpToken?: string): Promise<MPResponse<VerifyResponse>> {
42
+ return withUnhandledRejectionHandler(
43
+ () => new Promise((resolve, reject) => {
44
+ try {
45
+ this.initialize();
46
+
47
+ window.Masterpass.verifyService.resendOtp(
48
+ { token: otpToken || this._token },
49
+ (statusCode, response) => {
50
+ resolve(response);
51
+ }
52
+ );
53
+ } catch (error) {
54
+ reject(error);
55
+ }
56
+ }),
57
+ createSessionExpiredResponse<MPResponse<VerifyResponse>>()
58
+ );
59
59
  }
60
60
  }
@@ -51,8 +51,9 @@ export type LinkModalProps = {
51
51
  export type OTPModalProps = {
52
52
  open: boolean;
53
53
  onClose: () => void;
54
- onSubmit: (otp: string) => Promise<{ success: boolean; message?: string }>;
54
+ onSubmit: (otp: string) => Promise<{ success: boolean; requiresOTP?: boolean; message?: string }>;
55
55
  type: 'RTA' | 'OTP' | 'CVV';
56
+ responseCode?: string;
56
57
  description?: string;
57
58
  texts: MasterpassRestOptionTexts;
58
59
  };
@@ -91,6 +92,7 @@ export type MasterpassRestOptionRenderProps = {
91
92
  hasStoredCards: boolean;
92
93
  shouldShowDirectForm: boolean;
93
94
  cvc: string;
95
+ error: any;
94
96
 
95
97
  accountData: any;
96
98
  accountStatus: any;
@@ -249,12 +251,30 @@ export type MasterpassRestOptionTexts = {
249
251
  whatIsMasterpassLink?: string;
250
252
 
251
253
  rtaVerificationTitle?: string;
252
- cvvVerificationTitle?: string;
253
254
  rtaVerificationDescription?: string;
255
+ rtaVerificationPlaceholder?: string;
256
+
257
+ bankOtpVerificationTitle?: string;
258
+ bankOtpVerificationDescription?: string;
259
+ bankOtpVerificationPlaceholder?: string;
260
+
261
+ phoneVerificationTitle?: string;
262
+ phoneVerificationDescription?: string;
263
+ phoneVerificationPlaceholder?: string;
264
+
265
+ cvvVerificationTitle?: string;
254
266
  cvvVerificationDescription?: string;
267
+ cvvVerificationPlaceholder?: string;
268
+ cvvVerificationHelperText?: string;
269
+
255
270
  otpVerificationDescription?: string;
256
271
  verifyButton?: string;
257
272
  otpModalCancelButton?: string;
258
273
  otpModalErrorText?: string;
259
274
  otpModalResendOtpButton?: string;
275
+
276
+ sessionExpiredTitle?: string;
277
+ sessionExpiredMessage?: string;
278
+ sessionExpiredSecondaryMessage?: string;
279
+ sessionExpiredButton?: string;
260
280
  };
@@ -28,6 +28,7 @@ export interface PaymentProcessRequest {
28
28
  authenticationMethod: string;
29
29
  secure3DModel: string;
30
30
  terminalGroupId: string;
31
+ additionalFields?: any;
31
32
  }
32
33
 
33
34
  export interface OrderData {
@@ -79,10 +80,22 @@ export interface PaymentState {
79
80
  useThreeD: boolean;
80
81
  }
81
82
 
83
+ export type InformationModalType = 'warning' | 'error' | 'success' | 'info';
84
+
85
+ export interface InformationModalData {
86
+ type: InformationModalType;
87
+ title: string;
88
+ message: string;
89
+ secondaryMessage?: string;
90
+ buttonText: string;
91
+ }
92
+
82
93
  export interface ModalState {
83
94
  showLinkModal: boolean;
84
95
  showOTPModal: boolean;
85
96
  show3DSecureModal: boolean;
97
+ showInformationModal: boolean;
98
+ informationModalData: InformationModalData | null;
86
99
  otpType: OTPType;
87
100
  verificationData: any | null;
88
101
  cardToDelete: any | null;
@@ -105,6 +118,7 @@ export interface DirectPaymentRequest {
105
118
  authenticationMethod: string;
106
119
  secure3DModel: string;
107
120
  terminalGroupId: string;
121
+ additionalFields?: any;
108
122
  }
109
123
 
110
124
  export interface DirectPaymentResponse {
@@ -10,11 +10,11 @@ export const PAYMENT_CONSTANTS = {
10
10
 
11
11
  EXCEPTION_CODES: {
12
12
  ACCOUNT_NOT_FOUND: 'ACCOUNT_NOT_FOUND',
13
- ACCOUNT_NOT_LINKED_TO_MERCHANT: 'ACCOUNT_NOT_LINKED_TO_MERCHANT'
13
+ ACCOUNT_NOT_LINKED_TO_MERCHANT: 'ACCOUNT_NOT_LINKED_TO_MERCHANT',
14
+ TOKEN_HAS_EXPIRED: 'TOKEN_HAS_EXPIRED'
14
15
  },
15
16
 
16
17
  PAYMENT_CONFIG: {
17
- ACQUIRER_ICA_NUMBER: '2030',
18
18
  PAYMENT_TYPE: 'Sale'
19
19
  },
20
20
 
@@ -27,5 +27,5 @@ export const PAYMENT_CONSTANTS = {
27
27
  } as const;
28
28
 
29
29
  export const CALLBACK_PATHS = {
30
- RETURN: '/orders/masterpass-rest-callback/'
30
+ RETURN: '/orders/checkout/?page=MasterpassRestCompletePage&three_d_secure=true'
31
31
  } as const;