UNPKG

@adapty/capacitor

Version:
144 lines 5.49 kB
import { parsePaywallEvent } from '../shared/coders/parse'; import { BaseViewEmitter } from './base-view-emitter'; /** * PaywallViewEmitter manages event handlers for paywall view events. * Each event type can have only one handler - new handlers replace existing ones. */ export class PaywallViewEmitter extends BaseViewEmitter { getEventConfig(event) { return HANDLER_TO_EVENT_CONFIG[event]; } parseEventData(rawEventData, ctx) { return parsePaywallEvent(rawEventData, ctx); } getPossibleHandlers(nativeEvent) { return NATIVE_EVENT_TO_HANDLERS[nativeEvent] || []; } extractCallbackArgs(handlerName, eventData) { return extractCallbackArgs(handlerName, eventData); } getEventViewId(eventData) { var _a, _b; return (_b = (_a = eventData === null || eventData === void 0 ? void 0 : eventData.view) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null; } shouldCallHandler(_handlerName, config, eventData) { var _a; if (config.propertyMap && ((_a = eventData === null || eventData === void 0 ? void 0 : eventData.action) === null || _a === void 0 ? void 0 : _a.type) !== config.propertyMap['action']) { return false; } return true; } getEmitterName() { return 'PaywallViewEmitter'; } } /** * Mapping of native events to event handlers * Each native event can trigger multiple handlers based on action type or other properties * * Event Flow: * 1. Native code sends event (e.g., "paywall_view_did_perform_action") * 2. ViewEmitter receives event and checks view ID match * 3. For events with propertyMap, filters by action type (e.g., action.type === "close") * 4. Calls appropriate handler function * 5. If handler returns true, requests paywall close */ const UI_EVENT_MAPPINGS = { // User actions like close button, back button, URL taps, custom actions paywall_view_did_perform_action: [ { handlerName: 'onCloseButtonPress', propertyMap: { action: 'close', }, }, { handlerName: 'onAndroidSystemBack', propertyMap: { action: 'system_back', }, }, { handlerName: 'onUrlPress', propertyMap: { action: 'open_url', }, }, { handlerName: 'onCustomAction', propertyMap: { action: 'custom', }, }, ], // Product selection events paywall_view_did_select_product: [{ handlerName: 'onProductSelected' }], // Purchase flow events paywall_view_did_start_purchase: [{ handlerName: 'onPurchaseStarted' }], paywall_view_did_finish_purchase: [{ handlerName: 'onPurchaseCompleted' }], paywall_view_did_fail_purchase: [{ handlerName: 'onPurchaseFailed' }], // Restore flow events paywall_view_did_start_restore: [{ handlerName: 'onRestoreStarted' }], paywall_view_did_finish_restore: [{ handlerName: 'onRestoreCompleted' }], paywall_view_did_fail_restore: [{ handlerName: 'onRestoreFailed' }], // Paywall lifecycle events paywall_view_did_appear: [{ handlerName: 'onPaywallShown' }], paywall_view_did_disappear: [{ handlerName: 'onPaywallClosed' }], // Error events paywall_view_did_fail_rendering: [{ handlerName: 'onRenderingFailed' }], paywall_view_did_fail_loading_products: [{ handlerName: 'onLoadingProductsFailed' }], // Web payment events paywall_view_did_finish_web_payment_navigation: [ { handlerName: 'onWebPaymentNavigationFinished' }, ], }; const HANDLER_TO_EVENT_CONFIG = Object.entries(UI_EVENT_MAPPINGS).reduce((acc, [nativeEvent, mappings]) => { mappings.forEach(({ handlerName, propertyMap }) => { acc[handlerName] = { nativeEvent, propertyMap, handlerName, }; }); return acc; }, {}); // Reverse mapping: nativeEvent -> EventName[] const NATIVE_EVENT_TO_HANDLERS = Object.entries(HANDLER_TO_EVENT_CONFIG).reduce((acc, [handlerName, config]) => { if (!acc[config.nativeEvent]) { acc[config.nativeEvent] = []; } acc[config.nativeEvent].push(handlerName); return acc; }, {}); function extractCallbackArgs(handlerName, eventArg) { var _a; switch (handlerName) { case 'onProductSelected': return [eventArg.product_id]; case 'onPurchaseStarted': return [eventArg.product]; case 'onPurchaseCompleted': return [eventArg.purchased_result, eventArg.product]; case 'onPurchaseFailed': return [eventArg.error, eventArg.product]; case 'onRestoreCompleted': return [eventArg.profile]; case 'onRestoreFailed': case 'onRenderingFailed': case 'onLoadingProductsFailed': return [eventArg.error]; case 'onCustomAction': case 'onUrlPress': return [(_a = eventArg.action) === null || _a === void 0 ? void 0 : _a.value]; case 'onWebPaymentNavigationFinished': return [eventArg.product, eventArg.error]; case 'onCloseButtonPress': case 'onAndroidSystemBack': case 'onPaywallShown': case 'onPaywallClosed': case 'onRestoreStarted': default: return []; } } //# sourceMappingURL=paywall-view-emitter.js.map