UNPKG

@adapty/react-native-ui

Version:

Extension to the Adapty SDK that allows you to easily add purchase screens to your application.

57 lines (47 loc) 1.58 kB
import type { EventHandlers } from './types'; import { $bridge } from './bridge'; import { EmitterSubscription } from 'react-native'; type EventName = keyof EventHandlers; // Emitting view ID is passed in JSON["_view_id"] // So that no all visible views would emit this event // Must be in every callback response in the form of UUID string // const KEY_VIEW = 'view_id'; /** * @remarks * View emitter wraps NativeEventEmitter * and provides several modifications: * - Synthetic type restrictions to avoid misspelling * - Safe data deserialization with SDK decoders * - Logging emitting and deserialization processes * - Filters out events for other views by _id * * @internal */ export class ViewEmitter { private viewId: string; constructor(viewId: string) { this.viewId = viewId; } public addListener( event: EventName, callback: EventHandlers[EventName], onRequestClose: () => Promise<void>, ): EmitterSubscription { // Native layer emits callbacks with serialized args // This function deserializes & decodes args // All native callbacks are expected to return only 1 arg const viewId = this.viewId; return $bridge.addEventListener(event, function (arg) { const eventView = this.rawValue['view'] ?? null; if (viewId !== eventView) { return; } const cb = callback as (argument: typeof arg) => boolean; const shouldClose = cb.apply(null, [arg]); if (shouldClose) { onRequestClose(); } }); } removeAllListeners = $bridge.removeAllEventListeners; }