@adapty/capacitor
Version:
Official Adapty SDK for Capacitor
144 lines • 5.49 kB
JavaScript
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