import { EmitterSubscription } from 'react-native'; import { NativeRequestHandler } from '@/native-request-handler'; import { MockRequestHandler } from '@/mock'; import type { AdaptyMockConfig } from '@/mock/types'; import type { MethodName } from '@/types/bridge'; /** * Name of bridge package * React Native looks for a module with provided name * via NativeModules API * * Must be the same as string: * - iOS: RNAdapty.m & RNAdapty.swift. Also match in RCT_EXTERN_MODULE * - Android: AdaptyReactModule.kt (getName) */ export const MODULE_NAME = 'RNAdapty'; /** * Internal bridge handler - can be either Native or Mock depending on configuration */ let _bridge: | NativeRequestHandler | MockRequestHandler | null = null; /** * Initialize bridge with either native or mock handler * @param enableMock - Whether to use mock mode * @param mockConfig - Configuration for mock mode */ export function initBridge( enableMock: boolean = false, mockConfig?: AdaptyMockConfig, ): void { if (enableMock) { _bridge = new MockRequestHandler(mockConfig); } else { _bridge = new NativeRequestHandler(MODULE_NAME); } } /** * Check if bridge has been initialized * @returns true if bridge is initialized, false otherwise */ export function isBridgeInitialized(): boolean { return _bridge !== null; } /** * Reset bridge to null (for testing purposes only) * @internal */ export function resetBridge(): void { if (_bridge) { _bridge.removeAllEventListeners(); } _bridge = null; } /** * Bridge handler - automatically initializes with native handler if not yet initialized * For mock mode, call initBridge(true) in activate() before using */ export const $bridge = { get request() { if (!_bridge) initBridge(false); return _bridge!.request.bind(_bridge); }, addEventListener( event: Event, cb: (this: { rawValue: any }, data: CallbackData) => void | Promise, ): EmitterSubscription { if (!_bridge) initBridge(false); return _bridge!.addEventListener(event, cb); }, addRawEventListener< Event extends string, Cb extends (event: any) => void | Promise, >(event: Event, cb: Cb): EmitterSubscription { if (!_bridge) initBridge(false); return _bridge!.addRawEventListener(event, cb); }, removeAllEventListeners(): void { if (!_bridge) initBridge(false); return _bridge!.removeAllEventListeners(); }, /** * Provides access to internal bridge for testing purposes only * @internal */ get testBridge() { return _bridge; }, };