@primer-io/react-native 0.12.5 → 0.15.1
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/android/build.gradle +2 -2
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +191 -152
- package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -2
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
- package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
- package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
- package/ios/DataModels/PrimerErrorRN.swift +32 -2
- package/ios/RNTPrimer.m +43 -0
- package/ios/RNTPrimer.swift +394 -0
- package/ios/ReactNative-Bridging-Header.h +1 -9
- package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
- package/lib/commonjs/Primer.js +221 -209
- package/lib/commonjs/Primer.js.map +1 -1
- package/lib/commonjs/RNPrimer.js +145 -0
- package/lib/commonjs/RNPrimer.js.map +1 -0
- package/lib/commonjs/index.js +1 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/primer-intent.js.map +1 -1
- package/lib/commonjs/models/utils/redirectScheme.js +4 -0
- package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
- package/lib/module/Primer.js +203 -209
- package/lib/module/Primer.js.map +1 -1
- package/lib/module/RNPrimer.js +136 -0
- package/lib/module/RNPrimer.js.map +1 -0
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/primer-intent.js.map +1 -1
- package/lib/module/models/utils/redirectScheme.js +2 -0
- package/lib/module/models/utils/redirectScheme.js.map +1 -0
- package/lib/typescript/Primer.d.ts +13 -0
- package/lib/typescript/RNPrimer.d.ts +24 -0
- package/lib/typescript/models/primer-callbacks.d.ts +7 -10
- package/lib/typescript/models/primer-config.d.ts +16 -13
- package/lib/typescript/models/primer-intent.d.ts +1 -1
- package/lib/typescript/models/primer-request.d.ts +2 -12
- package/lib/typescript/models/primer-settings.d.ts +3 -5
- package/lib/typescript/models/primer.d.ts +4 -4
- package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
- package/package.json +4 -1
- package/primer-io-react-native.podspec +2 -3
- package/src/Primer.ts +227 -177
- package/src/RNPrimer.ts +170 -0
- package/src/index.tsx +1 -0
- package/src/models/primer-callbacks.ts +9 -32
- package/src/models/primer-config.ts +23 -21
- package/src/models/primer-intent.ts +1 -1
- package/src/models/primer-request.ts +2 -16
- package/src/models/primer-settings.ts +3 -5
- package/src/models/primer.ts +5 -5
- package/src/models/utils/redirectScheme.ts +5 -0
- package/ios/PrimerRN+PrimerDelegate.swift +0 -147
- package/ios/PrimerRN.swift +0 -166
- package/ios/ReactNative.m +0 -34
package/src/Primer.ts
CHANGED
|
@@ -1,202 +1,252 @@
|
|
|
1
|
-
import { NativeModules } from 'react-native';
|
|
2
|
-
import type { ClientSessionActionsRequest } from './models/client-session-actions-request';
|
|
3
1
|
import type { PaymentInstrumentToken } from './models/payment-instrument-token';
|
|
4
2
|
import type { IPrimer } from './models/primer';
|
|
5
|
-
import type {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
OnResumeSuccessCallback,
|
|
10
|
-
OnTokenAddedToVaultCallback,
|
|
11
|
-
OnTokenizeSuccessCallback,
|
|
12
|
-
} from './models/primer-callbacks';
|
|
13
|
-
import type { PrimerConfig } from './models/primer-config';
|
|
14
|
-
import type { PrimerError } from './models/primer-error';
|
|
15
|
-
import type {
|
|
16
|
-
PrimerIntent,
|
|
17
|
-
PrimerPaymentMethodIntent,
|
|
18
|
-
} from './models/primer-intent';
|
|
19
|
-
import type { PrimerSettings } from './models/primer-settings';
|
|
20
|
-
import type { PrimerTheme } from './models/primer-theme';
|
|
21
|
-
import { parseCallback } from './utils';
|
|
22
|
-
|
|
23
|
-
const { PrimerRN: NativeModule } = NativeModules;
|
|
3
|
+
import type { IPrimerConfig } from './models/primer-config';
|
|
4
|
+
import type { PrimerPaymentMethodIntent } from './models/primer-intent';
|
|
5
|
+
import type { PrimerResumeHandler } from './models/primer-request';
|
|
6
|
+
import RNPrimer, { IPrimerError } from './RNPrimer';
|
|
24
7
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
configure(config);
|
|
45
|
-
NativeModule.initialize(token);
|
|
8
|
+
const resumeHandler: PrimerResumeHandler = {
|
|
9
|
+
handleNewClientToken: async (clientToken) => {
|
|
10
|
+
try {
|
|
11
|
+
await RNPrimer.handleNewClientToken(clientToken);
|
|
12
|
+
} catch (err) {
|
|
13
|
+
let primerError: IPrimerError;
|
|
14
|
+
if (err instanceof Error) {
|
|
15
|
+
primerError = {
|
|
16
|
+
errorId: "react-native-bridge",
|
|
17
|
+
errorDescription: err.message
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
primerError = {
|
|
21
|
+
errorId: "react-native-bridge",
|
|
22
|
+
errorDescription: "unknown error"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
await RNPrimer.handleError(primerError);
|
|
26
|
+
}
|
|
46
27
|
},
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
28
|
+
handleError: async (err) => {
|
|
29
|
+
try {
|
|
30
|
+
const primerError: IPrimerError = {
|
|
31
|
+
errorId: "react-native",
|
|
32
|
+
errorDescription: err.message
|
|
33
|
+
}
|
|
34
|
+
await RNPrimer.handleError(primerError);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
let primerError: IPrimerError;
|
|
37
|
+
if (err instanceof Error) {
|
|
38
|
+
primerError = {
|
|
39
|
+
errorId: "react-native-bridge",
|
|
40
|
+
errorDescription: err.message
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
primerError = {
|
|
44
|
+
errorId: "react-native-bridge",
|
|
45
|
+
errorDescription: "unknown error"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
await RNPrimer.handleError(primerError);
|
|
49
|
+
}
|
|
56
50
|
},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
51
|
+
handleSuccess: async () => {
|
|
52
|
+
try {
|
|
53
|
+
await RNPrimer.handleSuccess();
|
|
54
|
+
} catch (err) {
|
|
55
|
+
let primerError: IPrimerError;
|
|
56
|
+
if (err instanceof Error) {
|
|
57
|
+
primerError = {
|
|
58
|
+
errorId: "react-native-bridge",
|
|
59
|
+
errorDescription: err.message
|
|
60
|
+
}
|
|
61
|
+
} else {
|
|
62
|
+
primerError = {
|
|
63
|
+
errorId: "react-native-bridge",
|
|
64
|
+
errorDescription: "unknown error"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
await RNPrimer.handleError(primerError);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
68
70
|
}
|
|
69
71
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
export interface IClientSessionAction {
|
|
73
|
+
type:
|
|
74
|
+
| 'SELECT_PAYMENT_METHOD'
|
|
75
|
+
| 'UNSELECT_PAYMENT_METHOD'
|
|
76
|
+
| 'SET_BILLING_ADDRESS';
|
|
77
|
+
params?: IActionParams;
|
|
73
78
|
}
|
|
74
79
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
interface IActionParams {
|
|
81
|
+
billingAddress: Record<string, string | null>;
|
|
82
|
+
paymentMethodType?: string;
|
|
83
|
+
binData?: IBinData;
|
|
78
84
|
}
|
|
79
85
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
): void {
|
|
83
|
-
const data = JSON.stringify(intent);
|
|
84
|
-
NativeModule.configureIntent(data);
|
|
86
|
+
interface IBinData {
|
|
87
|
+
network: string;
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
const data = JSON.stringify(request);
|
|
89
|
-
NativeModule.resume(data);
|
|
90
|
-
}
|
|
90
|
+
export const PrimerNativeMapping: IPrimer = {
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
92
|
+
showUniversalCheckout(clientToken: string, config: IPrimerConfig): void {
|
|
93
|
+
RNPrimer.removeAllListeners();
|
|
94
|
+
|
|
95
|
+
if (config.settings || config.theme) {
|
|
96
|
+
RNPrimer.configure(config.settings || null, config.theme || null);
|
|
97
|
+
|
|
98
|
+
let implementedRNCallbacks: any = {
|
|
99
|
+
// isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
|
|
100
|
+
isTokenAddedToVaultImplemented: (config.onTokenAddedToVault !== undefined),
|
|
101
|
+
isOnResumeSuccessImplemented: (config.onResumeSuccess !== undefined),
|
|
102
|
+
isOnResumeErrorImplemented: (config.onError !== undefined),
|
|
103
|
+
isOnCheckoutDismissedImplemented: (config.onDismiss !== undefined),
|
|
104
|
+
isCheckoutFailedImplemented: (config.onError !== undefined),
|
|
105
|
+
isClientSessionActionsImplemented: (config.onClientSessionActions !== undefined)
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
RNPrimer.setImplementedRNCallbacks(implementedRNCallbacks)
|
|
109
|
+
.then(() => {
|
|
110
|
+
RNPrimer.addListener('onClientSessionActions', data => {
|
|
111
|
+
const clientSessionActions: IClientSessionAction[] = data;
|
|
112
|
+
if (config.onClientSessionActions) {
|
|
113
|
+
config.onClientSessionActions(clientSessionActions, resumeHandler);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
RNPrimer.addListener('onTokenizeSuccessCallback', data => {
|
|
118
|
+
const paymentInstrumentToken: PaymentInstrumentToken = data;
|
|
119
|
+
if (config.onTokenizeSuccess) {
|
|
120
|
+
config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
RNPrimer.addListener('onResumeSuccess', data => {
|
|
125
|
+
const resumeToken: string = data.resumeToken;
|
|
126
|
+
if (config.onResumeSuccess) {
|
|
127
|
+
config.onResumeSuccess(resumeToken, resumeHandler);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
RNPrimer.addListener('onCheckoutDismissed', _ => {
|
|
132
|
+
if (config.onDismiss) {
|
|
133
|
+
config.onDismiss();
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
RNPrimer.addListener('onError', data => {
|
|
138
|
+
const err: IPrimerError = data.error;
|
|
139
|
+
if (config.onError) {
|
|
140
|
+
config.onError(err, resumeHandler);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
RNPrimer.showUniversalCheckout(clientToken);
|
|
145
|
+
})
|
|
146
|
+
.catch( err => {
|
|
147
|
+
console.error(err);
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// RNPrimer.addListener('onClientTokenCallback', _ => {
|
|
152
|
+
// if (config.onClientTokenCallback) {
|
|
153
|
+
// config.onClientTokenCallback(resumeHandler);
|
|
154
|
+
// }
|
|
155
|
+
// });
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
showVaultManager(clientToken: string, config: IPrimerConfig): void {
|
|
159
|
+
RNPrimer.removeAllListeners();
|
|
160
|
+
|
|
161
|
+
if (config.settings || config.theme) {
|
|
162
|
+
RNPrimer.configure(config.settings || null, config.theme || null);
|
|
163
|
+
|
|
164
|
+
let implementedRNCallbacks: any = {
|
|
165
|
+
// isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
|
|
166
|
+
isTokenAddedToVaultImplemented: (config.onTokenAddedToVault !== undefined),
|
|
167
|
+
isOnResumeSuccessImplemented: (config.onResumeSuccess !== undefined),
|
|
168
|
+
isOnResumeErrorImplemented: (config.onError !== undefined),
|
|
169
|
+
isOnCheckoutDismissedImplemented: (config.onDismiss !== undefined),
|
|
170
|
+
isCheckoutFailedImplemented: (config.onError !== undefined),
|
|
171
|
+
isClientSessionActionsImplemented: (config.onClientSessionActions !== undefined)
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
RNPrimer.setImplementedRNCallbacks(implementedRNCallbacks);
|
|
108
175
|
}
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
176
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
177
|
+
// RNPrimer.addListener('onClientTokenCallback', _ => {
|
|
178
|
+
// if (config.onClientTokenCallback) {
|
|
179
|
+
// config.onClientTokenCallback(resumeHandler);
|
|
180
|
+
// }
|
|
181
|
+
// });
|
|
116
182
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
*/
|
|
122
|
-
function configureOnClientSessionActions(
|
|
123
|
-
callback?: OnClientSessionActionsCallback // defined by integrating developer.
|
|
124
|
-
) {
|
|
125
|
-
NativeModule.configureOnClientSessionActions((data: any) => {
|
|
126
|
-
try {
|
|
127
|
-
// parse the client session action JSON string.
|
|
128
|
-
const parsedData = JSON.parse(data) as ClientSessionActionsRequest;
|
|
129
|
-
|
|
130
|
-
if (!callback) {
|
|
131
|
-
/**
|
|
132
|
-
* if @param callback is undefined immediately call the native bridge
|
|
133
|
-
* and resume with null values. This will resume the SDK flow without
|
|
134
|
-
* triggering extra configuration API fetch calls.
|
|
135
|
-
*/
|
|
136
|
-
actionResume({ error: null, token: null });
|
|
183
|
+
RNPrimer.addListener('onClientSessionActions', data => {
|
|
184
|
+
const clientSessionActions: IClientSessionAction[] = data;
|
|
185
|
+
if (config.onClientSessionActions) {
|
|
186
|
+
config.onClientSessionActions(clientSessionActions, resumeHandler);
|
|
137
187
|
} else {
|
|
138
|
-
|
|
139
|
-
* send the parsed data back to the developer through the defined callback.
|
|
140
|
-
* The developer will determine how to resume the flow using one of the provided
|
|
141
|
-
* resume handlers.
|
|
142
|
-
*/
|
|
143
|
-
callback(parsedData, {
|
|
144
|
-
handleError: (error) => actionResume({ error, token: null }),
|
|
145
|
-
handleSuccess: () => actionResume({ error: null, token: null }),
|
|
146
|
-
handleNewClientToken: (token) => actionResume({ error: null, token }),
|
|
147
|
-
// deprecated, remove in next major version update.
|
|
148
|
-
resumeWithError: (error) => actionResume({ error, token: null }),
|
|
149
|
-
resumeWithSuccess: (token) => actionResume({ error: null, token }),
|
|
150
|
-
});
|
|
188
|
+
RNPrimer.handleSuccess();
|
|
151
189
|
}
|
|
190
|
+
});
|
|
152
191
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
}
|
|
192
|
+
RNPrimer.addListener('onTokenizeSuccessCallback', data => {
|
|
193
|
+
const paymentInstrumentToken: PaymentInstrumentToken = data;
|
|
194
|
+
if (config.onTokenizeSuccess) {
|
|
195
|
+
config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
161
198
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
handleError: (error) => resume({ error, token: null }),
|
|
169
|
-
handleSuccess: () => resume({ error: null, token: null }),
|
|
170
|
-
handleNewClientToken: (token) => resume({ error: null, token }),
|
|
171
|
-
// deprecated
|
|
172
|
-
resumeWithError: (error) => resume({ error, token: null }),
|
|
173
|
-
resumeWithSuccess: (token) => resume({ error: null, token }),
|
|
174
|
-
});
|
|
175
|
-
} catch (e) {
|
|
176
|
-
console.log('failed to parse json', e);
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
199
|
+
RNPrimer.addListener('onResumeSuccess', data => {
|
|
200
|
+
const resumeToken: string = data.resumeToken;
|
|
201
|
+
if (config.onResumeSuccess) {
|
|
202
|
+
config.onResumeSuccess(resumeToken, resumeHandler);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
180
205
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
});
|
|
187
|
-
}
|
|
206
|
+
RNPrimer.addListener('onCheckoutDismissed', () => {
|
|
207
|
+
if (config.onDismiss) {
|
|
208
|
+
config.onDismiss();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
188
211
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
212
|
+
RNPrimer.addListener('onError', data => {
|
|
213
|
+
const err: IPrimerError = data.error;
|
|
214
|
+
if (config.onError) {
|
|
215
|
+
config.onError(err, resumeHandler);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
192
218
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
parseCallback<PrimerError>(data, callback);
|
|
196
|
-
});
|
|
197
|
-
}
|
|
219
|
+
RNPrimer.showVaultManager(clientToken);
|
|
220
|
+
},
|
|
198
221
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
222
|
+
showPaymentMethod(
|
|
223
|
+
clientToken: string,
|
|
224
|
+
intent: PrimerPaymentMethodIntent,
|
|
225
|
+
config: IPrimerConfig
|
|
226
|
+
): void {
|
|
227
|
+
RNPrimer.removeAllListeners();
|
|
228
|
+
|
|
229
|
+
if (config.settings || config.theme) {
|
|
230
|
+
RNPrimer.configure(config.settings || null, config.theme || null);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
let implementedRNCallbacks: any = {
|
|
234
|
+
// isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
|
|
235
|
+
isTokenAddedToVaultImplemented: (config.onTokenAddedToVault !== undefined),
|
|
236
|
+
isOnResumeSuccessImplemented: (config.onResumeSuccess !== undefined),
|
|
237
|
+
isOnResumeErrorImplemented: (config.onError !== undefined),
|
|
238
|
+
isOnCheckoutDismissedImplemented: (config.onDismiss !== undefined),
|
|
239
|
+
isCheckoutFailedImplemented: (config.onError !== undefined),
|
|
240
|
+
isClientSessionActionsImplemented: (config.onClientSessionActions !== undefined)
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
RNPrimer.setImplementedRNCallbacks(implementedRNCallbacks);
|
|
244
|
+
RNPrimer.showPaymentMethod(clientToken, intent.paymentMethod, intent.vault === true ? "vault" : "checkout");
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
dispose(): void {
|
|
248
|
+
RNPrimer.removeAllListeners();
|
|
249
|
+
RNPrimer.dispose();
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
};
|
package/src/RNPrimer.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { NativeEventEmitter, NativeModules } from 'react-native';
|
|
2
|
+
import type { PrimerSettings } from './models/primer-settings';
|
|
3
|
+
import type { PrimerTheme } from './models/primer-theme';
|
|
4
|
+
|
|
5
|
+
const { NativePrimer } = NativeModules;
|
|
6
|
+
const eventEmitter = new NativeEventEmitter(NativePrimer);
|
|
7
|
+
|
|
8
|
+
type EventType =
|
|
9
|
+
| 'onClientTokenCallback'
|
|
10
|
+
| 'onClientSessionActions'
|
|
11
|
+
| 'onTokenizeSuccessCallback'
|
|
12
|
+
| 'onVaultSuccess'
|
|
13
|
+
| 'onResumeSuccess'
|
|
14
|
+
| 'onCheckoutDismissed'
|
|
15
|
+
| 'onError'
|
|
16
|
+
| 'detectImplementedRNCallbacks';
|
|
17
|
+
|
|
18
|
+
export interface IPrimerError {
|
|
19
|
+
errorId: string
|
|
20
|
+
errorDescription?: string
|
|
21
|
+
recoverySuggestion?: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const RNPrimer = {
|
|
25
|
+
///////////////////////////////////////////
|
|
26
|
+
// Event Emitter
|
|
27
|
+
///////////////////////////////////////////
|
|
28
|
+
addListener: (eventType: EventType, listener: (...args: any[]) => any) => {
|
|
29
|
+
eventEmitter.addListener(eventType, listener);
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
removeListener: (eventType: EventType, listener: (...args: any[]) => any) => {
|
|
33
|
+
eventEmitter.removeListener(eventType, listener);
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
removeAllListenersForEvent(eventType: EventType) {
|
|
37
|
+
eventEmitter.removeAllListeners(eventType);
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
removeAllListeners() {
|
|
41
|
+
eventEmitter.removeAllListeners('onClientTokenCallback');
|
|
42
|
+
eventEmitter.removeAllListeners('onClientSessionActions');
|
|
43
|
+
eventEmitter.removeAllListeners('onTokenizeSuccessCallback');
|
|
44
|
+
eventEmitter.removeAllListeners('onResumeSuccess');
|
|
45
|
+
eventEmitter.removeAllListeners('onCheckoutDismissed');
|
|
46
|
+
eventEmitter.removeAllListeners('onError');
|
|
47
|
+
eventEmitter.removeAllListeners('detectImplementedRNCallbacks');
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
///////////////////////////////////////////
|
|
51
|
+
// Native API
|
|
52
|
+
///////////////////////////////////////////
|
|
53
|
+
configure: (
|
|
54
|
+
settings: PrimerSettings | null,
|
|
55
|
+
theme: PrimerTheme | null
|
|
56
|
+
): Promise<void> => {
|
|
57
|
+
return new Promise(async (resolve, reject) => {
|
|
58
|
+
try {
|
|
59
|
+
if (settings === null && theme === null) {
|
|
60
|
+
// Do nothing, SDK will use default settings and theme.
|
|
61
|
+
} else if (settings && theme === null) {
|
|
62
|
+
await NativePrimer.configureWithSettings(JSON.stringify(settings));
|
|
63
|
+
} else if (settings === null && theme) {
|
|
64
|
+
await NativePrimer.configureWithTheme(JSON.stringify(theme));
|
|
65
|
+
} else {
|
|
66
|
+
await NativePrimer.configureWithSettings(JSON.stringify(settings));
|
|
67
|
+
await NativePrimer.configureWithTheme(JSON.stringify(theme));
|
|
68
|
+
}
|
|
69
|
+
resolve();
|
|
70
|
+
} catch (err) {
|
|
71
|
+
reject(err);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
showUniversalCheckout: (clientToken: string | undefined): Promise<void> => {
|
|
77
|
+
return new Promise(async (resolve, reject) => {
|
|
78
|
+
try {
|
|
79
|
+
if (clientToken) {
|
|
80
|
+
await NativePrimer.showUniversalCheckoutWithClientToken(clientToken);
|
|
81
|
+
} else {
|
|
82
|
+
await NativePrimer.showUniversalCheckout();
|
|
83
|
+
}
|
|
84
|
+
resolve();
|
|
85
|
+
} catch (err) {
|
|
86
|
+
reject(err);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
showVaultManager: (clientToken: string | undefined): Promise<void> => {
|
|
92
|
+
return new Promise(async (resolve, reject) => {
|
|
93
|
+
try {
|
|
94
|
+
if (clientToken) {
|
|
95
|
+
await NativePrimer.showVaultManager(clientToken);
|
|
96
|
+
} else {
|
|
97
|
+
await NativePrimer.showVaultManager();
|
|
98
|
+
}
|
|
99
|
+
resolve();
|
|
100
|
+
} catch (err) {
|
|
101
|
+
reject(err);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
showPaymentMethod: (
|
|
107
|
+
clientToken: string,
|
|
108
|
+
paymentMethodType: string,
|
|
109
|
+
intent: "checkout" | "vault"
|
|
110
|
+
): Promise<void> => {
|
|
111
|
+
return new Promise(async (resolve, reject) => {
|
|
112
|
+
try {
|
|
113
|
+
await NativePrimer.showPaymentMethod(clientToken, paymentMethodType, intent);
|
|
114
|
+
resolve();
|
|
115
|
+
} catch (err) {
|
|
116
|
+
reject(err);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
handleNewClientToken: (clientToken: string | undefined): Promise<void> => {
|
|
122
|
+
return new Promise(async (resolve, reject) => {
|
|
123
|
+
try {
|
|
124
|
+
await NativePrimer.handleNewClientToken(clientToken);
|
|
125
|
+
resolve();
|
|
126
|
+
} catch (err) {
|
|
127
|
+
reject(err);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
handleError: (err: IPrimerError): Promise<void> => {
|
|
133
|
+
return new Promise(async (resolve, reject) => {
|
|
134
|
+
try {
|
|
135
|
+
await NativePrimer.handleError(JSON.stringify(err));
|
|
136
|
+
resolve();
|
|
137
|
+
} catch (err) {
|
|
138
|
+
reject(err);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
handleSuccess: (): Promise<void> => {
|
|
144
|
+
return new Promise(async (resolve, reject) => {
|
|
145
|
+
try {
|
|
146
|
+
await NativePrimer.handleSuccess();
|
|
147
|
+
resolve();
|
|
148
|
+
} catch (err) {
|
|
149
|
+
reject(err);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
setImplementedRNCallbacks: (implementedRNCallbacks: any): Promise<void> => {
|
|
155
|
+
return new Promise(async (resolve, reject) => {
|
|
156
|
+
try {
|
|
157
|
+
await NativePrimer.setImplementedRNCallbacks(JSON.stringify(implementedRNCallbacks));
|
|
158
|
+
resolve();
|
|
159
|
+
} catch (err) {
|
|
160
|
+
reject(err);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
dispose: (): void => {
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export default RNPrimer;
|
package/src/index.tsx
CHANGED
|
@@ -1,37 +1,14 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { IPrimerError } from 'src/RNPrimer';
|
|
2
|
+
import type { IClientSessionAction } from 'src/Primer';
|
|
3
3
|
import type { PaymentInstrumentToken } from './payment-instrument-token';
|
|
4
|
-
import type { PrimerError } from './primer-error';
|
|
5
4
|
import type { PrimerResumeHandler } from './primer-request';
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
completion: PrimerResumeHandler
|
|
10
|
-
) => void;
|
|
11
|
-
|
|
12
|
-
export type OnResumeSuccessCallback = (
|
|
13
|
-
resumeToken: string,
|
|
14
|
-
resumeHandler: PrimerResumeHandler
|
|
15
|
-
) => void;
|
|
16
|
-
|
|
17
|
-
export type OnClientSessionActionsCallback = (
|
|
18
|
-
request: ClientSessionActionsRequest,
|
|
19
|
-
resumeHandler: PrimerResumeHandler
|
|
20
|
-
) => void;
|
|
21
|
-
|
|
22
|
-
export type OnDataChangeCallback = (
|
|
23
|
-
req: ActionRequest,
|
|
24
|
-
completion: PrimerResumeHandler
|
|
25
|
-
) => void;
|
|
26
|
-
|
|
27
|
-
export type OnTokenAddedToVaultCallback = (
|
|
28
|
-
paymentInstrumentToken: PaymentInstrumentToken
|
|
29
|
-
) => void;
|
|
6
|
+
// Not implemented
|
|
7
|
+
// export type OnClientTokenCallback = (resumeHandler: PrimerResumeHandler) => void;
|
|
30
8
|
|
|
9
|
+
export type OnClientSessionActionsCallback = (clientSessionActions: IClientSessionAction[], resumeHandler: PrimerResumeHandler | null) => void;
|
|
10
|
+
export type OnTokenizeSuccessCallback = (paymentInstrument: PaymentInstrumentToken, resumeHandler: PrimerResumeHandler) => void;
|
|
11
|
+
export type OnTokenAddedToVaultCallback = (paymentInstrument: PaymentInstrumentToken) => void;
|
|
12
|
+
export type OnResumeCallback = (resumeToken: string, resumeHandler: PrimerResumeHandler | null) => void;
|
|
13
|
+
export type OnPrimerErrorCallback = (err: IPrimerError, resumeHandler: PrimerResumeHandler) => void;
|
|
31
14
|
export type OnDismissCallback = () => void;
|
|
32
|
-
|
|
33
|
-
export type OnPrimerErrorCallback = (error: PrimerError) => void;
|
|
34
|
-
|
|
35
|
-
export type OnSavedPaymentInstrumentsFetchedCallback = (
|
|
36
|
-
paymentInstrumentTokens: PaymentInstrumentToken[]
|
|
37
|
-
) => void;
|