import type { PrimerSettings } from './models/PrimerSettings'; import type { PrimerImplementedRNCallbacks } from './models/PrimerImplementedRNCallbacks'; import type { EventSubscription } from 'react-native'; import NativePrimer from './specs/NativePrimer'; import { NativeEventEmitter, NativeModules } from 'react-native'; // Create the event emitter instance for old architecture const nativeEventEmitter = new NativeEventEmitter(NativeModules.NativePrimer); // Subscriptions let subscriptions: EventSubscription[] = []; type EventType = | 'onCheckoutComplete' | 'onBeforeClientSessionUpdate' | 'onClientSessionUpdate' | 'onBeforePaymentCreate' | 'onError' | 'onDismiss' | 'onTokenizeSuccess' | 'onResumeSuccess' | 'onResumePending' | 'onCheckoutReceivedAdditionalInfo' | 'detectImplementedRNCallbacks'; export interface IPrimerError { errorId: string; errorDescription?: string; recoverySuggestion?: string; } const RNPrimer = { /////////////////////////////////////////// // Event Emitter /////////////////////////////////////////// addListener(eventType: EventType, listener: (data: any) => void) { subscriptions.push(nativeEventEmitter.addListener(eventType, listener)); }, removeAllListeners() { subscriptions.forEach((subscription) => subscription.remove()); subscriptions = []; }, /////////////////////////////////////////// // Native API /////////////////////////////////////////// configure: (settings: PrimerSettings | undefined): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.configure(JSON.stringify(settings) || ''); resolve(); } catch (err) { reject(err); } }); }, showUniversalCheckout: (clientToken: string): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.showUniversalCheckoutWithClientToken(clientToken); resolve(); } catch (err) { reject(err); } }); }, showVaultManager: (clientToken: string): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.showVaultManagerWithClientToken(clientToken); resolve(); } catch (err) { reject(err); } }); }, showPaymentMethod: (paymentMethod: string, intent: string, clientToken: string): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.showPaymentMethod(paymentMethod, intent, clientToken); resolve(); } catch (err) { reject(err); } }); }, dismiss: (): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.dismiss(); resolve(); } catch (err) { reject(err); } }); }, cleanUp: (): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.cleanUp(); resolve(); } catch (err) { reject(err); } }); }, /////////////////////////////////////////// // DECISION HANDLERS /////////////////////////////////////////// // Tokenization Handlers handleTokenizationNewClientToken: (newClientToken: string): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handleTokenizationNewClientToken(newClientToken); resolve(); } catch (err) { reject(err); } }); }, handleTokenizationSuccess: (): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handleTokenizationSuccess(); resolve(); } catch (err) { reject(err); } }); }, handleTokenizationFailure: (errorMessage: string | null): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handleTokenizationFailure(errorMessage || ''); resolve(); } catch (err) { reject(err); } }); }, // Resume Handlers handleResumeWithNewClientToken: (newClientToken: string): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handleResumeWithNewClientToken(newClientToken); resolve(); } catch (err) { reject(err); } }); }, handleResumeSuccess: (): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handleResumeSuccess(); resolve(); } catch (err) { reject(err); } }); }, handleResumeFailure: (errorMessage: string | null): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handleResumeFailure(errorMessage || ''); resolve(); } catch (err) { reject(err); } }); }, // Payment Creation Handlers handlePaymentCreationAbort: (errorMessage: string | null): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handlePaymentCreationAbort(errorMessage || ''); resolve(); } catch (err) { reject(err); } }); }, handlePaymentCreationContinue: (): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.handlePaymentCreationContinue(); resolve(); } catch (err) { reject(err); } }); }, // Error Handler showErrorMessage: (errorMessage: string | null): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.showErrorMessage(errorMessage || ''); resolve(); } catch (err) { reject(err); } }); }, // HELPERS setImplementedRNCallbacks: (implementedRNCallbacks: PrimerImplementedRNCallbacks): Promise => { return new Promise(async (resolve, reject) => { try { await NativePrimer.setImplementedRNCallbacks(JSON.stringify(implementedRNCallbacks)); resolve(); } catch (err) { reject(err); } }); }, }; export default RNPrimer;