/** * Compatibility helper to use new arch events if available and fallback * to NativeEventEmitter or DeviceEventEmitter. * * Can be removed once we no longer need to support the old arch and use * the methods on NativeStripeSdkModule directly. */ import { DeviceEventEmitter, EventSubscription, NativeEventEmitter, Platform, } from 'react-native'; import type { EventEmitter } from 'react-native/Libraries/Types/CodegenTypes'; import NativeStripeSdkModule from './specs/NativeStripeSdkModule'; import NativeOnrampSdkModule from './specs/NativeOnrampSdkModule'; import { PaymentMethod } from './types'; import { UnsafeObject } from './specs/utils'; import { FinancialConnectionsEvent } from './types/FinancialConnections'; import { Result as ConfirmationTokenResult } from './types/ConfirmationToken'; const compatEventEmitter = Platform.OS === 'ios' ? new NativeEventEmitter(NativeStripeSdkModule as any) : DeviceEventEmitter; // This is a temporary compat layer for event emitters on new arch. // Versions before RN 0.80 crash sometimes when setting the event emitter callback. // Move this back to the NativeStripeSdkModule spec once we drop support for RN < 0.80. type Events = { onConfirmHandlerCallback: EventEmitter<{ paymentMethod: UnsafeObject; shouldSavePaymentMethod: boolean; }>; onConfirmationTokenHandlerCallback: EventEmitter<{ confirmationToken: UnsafeObject; }>; onFinancialConnectionsEvent: EventEmitter< UnsafeObject >; onOrderTrackingCallback: EventEmitter; onCustomerAdapterFetchPaymentMethodsCallback: EventEmitter; onCustomerAdapterAttachPaymentMethodCallback: EventEmitter<{ paymentMethodId: string; }>; onCustomerAdapterDetachPaymentMethodCallback: EventEmitter<{ paymentMethodId: string; }>; onCustomerAdapterSetSelectedPaymentOptionCallback: EventEmitter<{ paymentOption: string; }>; onCustomerAdapterFetchSelectedPaymentOptionCallback: EventEmitter; onCustomerAdapterSetupIntentClientSecretForCustomerAttachCallback: EventEmitter; onCustomerSessionProviderSetupIntentClientSecret: EventEmitter; onCustomerSessionProviderCustomerSessionClientSecret: EventEmitter; embeddedPaymentElementDidUpdateHeight: EventEmitter>; embeddedPaymentElementWillPresent: EventEmitter; embeddedPaymentElementDidUpdatePaymentOption: EventEmitter>; embeddedPaymentElementFormSheetConfirmComplete: EventEmitter< UnsafeObject >; embeddedPaymentElementRowSelectionImmediateAction: EventEmitter; embeddedPaymentElementLoadingFailed: EventEmitter>; embeddedPaymentElementUpdateComplete: EventEmitter>; onCustomPaymentMethodConfirmHandlerCallback: EventEmitter>; paymentMethodMessagingElementDidUpdateHeight: EventEmitter>; paymentMethodMessagingElementConfigureResult: EventEmitter>; }; export function addListener( event: EventT, handler: Parameters[0] ): EventSubscription { return compatEventEmitter.addListener(event, handler); } const compatOnrampEventEmitter = Platform.OS === 'ios' ? new NativeEventEmitter(NativeOnrampSdkModule as any) : DeviceEventEmitter; type OnrampEventMap = { onCheckoutClientSecretRequested: void; }; type OnrampEvents = keyof OnrampEventMap; export function addOnrampListener( event: EventT, handler: (params: OnrampEventMap[EventT]) => void ): EventSubscription { return compatOnrampEventEmitter.addListener(event, handler); }