expo-helium 0.8.5 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,20 @@ export type OnLoadEventPayload = {
5
5
  export type HeliumPaywallSdkModuleEvents = {
6
6
  onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;
7
7
  onDelegateActionEvent: (params: DelegateActionEvent) => void;
8
+ paywallEventHandlers: (params: HeliumPaywallEvent) => void;
8
9
  };
9
10
  export type HeliumPaywallEvent = {
10
- type: string;
11
+ type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' | 'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' | 'productSelected' | 'purchasePressed' | 'purchaseSucceeded' | 'purchaseCancelled' | 'purchaseFailed' | 'purchaseRestored' | 'purchaseRestoreFailed' | 'purchasePending' | 'initializeStart' | 'paywallsDownloadSuccess' | 'paywallsDownloadError' | 'paywallWebViewRendered';
11
12
  triggerName?: string;
13
+ paywallName?: string;
14
+ /**
15
+ * @deprecated Use `paywallName` instead.
16
+ */
12
17
  paywallTemplateName?: string;
18
+ productId?: string;
19
+ /**
20
+ * @deprecated Use `productId` instead.
21
+ */
13
22
  productKey?: string;
14
23
  ctaName?: string;
15
24
  configId?: string;
@@ -20,7 +29,16 @@ export type HeliumPaywallEvent = {
20
29
  fontsDownloadTimeTakenMS?: number;
21
30
  bundleDownloadTimeMS?: number;
22
31
  dismissAll?: boolean;
32
+ isSecondTry?: boolean;
33
+ error?: string;
34
+ /**
35
+ * @deprecated Use `error` instead.
36
+ */
23
37
  errorDescription?: string;
38
+ /**
39
+ * Unix timestamp in seconds
40
+ */
41
+ timestamp?: number;
24
42
  };
25
43
  export type DelegateActionEvent = {
26
44
  type: 'purchase' | 'restore';
@@ -50,6 +68,33 @@ export declare function createCustomPurchaseConfig(callbacks: {
50
68
  makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;
51
69
  restorePurchases: () => Promise<boolean>;
52
70
  }): HeliumPurchaseConfig;
71
+ export type TriggerLoadingConfig = {
72
+ /** Whether to show loading state for this trigger. Set to nil to use the global `useLoadingState` setting. */
73
+ useLoadingState?: boolean;
74
+ /** Maximum seconds to show loading for this trigger. Set to nil to use the global `loadingBudget` setting. */
75
+ loadingBudget?: number;
76
+ };
77
+ export type HeliumPaywallLoadingConfig = {
78
+ /**
79
+ * Whether to show a loading state while fetching paywall configuration.
80
+ * When true, shows a loading view for up to `loadingBudget` seconds before falling back.
81
+ * Default: true
82
+ */
83
+ useLoadingState?: boolean;
84
+ /**
85
+ * Maximum time (in seconds) to show the loading state before displaying fallback.
86
+ * After this timeout, the fallback view will be shown even if the paywall is still downloading.
87
+ * Default: 2.0 seconds
88
+ */
89
+ loadingBudget?: number;
90
+ /**
91
+ * Optional per-trigger loading configuration overrides.
92
+ * Use this to customize loading behavior for specific triggers.
93
+ * Keys are trigger names, values are TriggerLoadingConfig instances.
94
+ * Example: Disable loading for "onboarding" trigger while keeping it for others.
95
+ */
96
+ perTriggerLoadingConfig?: Record<string, TriggerLoadingConfig>;
97
+ };
53
98
  export interface HeliumConfig {
54
99
  /** Your Helium API Key */
55
100
  apiKey: string;
@@ -57,8 +102,10 @@ export interface HeliumConfig {
57
102
  purchaseConfig: HeliumPurchaseConfig;
58
103
  /** Callback for receiving all Helium paywall events. */
59
104
  onHeliumPaywallEvent: (event: HeliumPaywallEvent) => void;
105
+ /** Fallback bundle in the rare situation that paywall is not ready to be shown. Highly recommended. See docs at https://docs.tryhelium.com/guides/fallback-bundle#react-native */
60
106
  fallbackBundle?: object;
61
- triggers?: string[];
107
+ /** Configure loading behavior for paywalls that are mid-download. */
108
+ paywallLoadingConfig?: HeliumPaywallLoadingConfig;
62
109
  customUserId?: string;
63
110
  customAPIEndpoint?: string;
64
111
  customUserTraits?: Record<string, any>;
@@ -72,11 +119,51 @@ export interface NativeHeliumConfig {
72
119
  revenueCatAppUserId?: string;
73
120
  fallbackBundleUrlString?: string;
74
121
  fallbackBundleString?: string;
122
+ paywallLoadingConfig?: HeliumPaywallLoadingConfig;
75
123
  }
124
+ export type PresentUpsellParams = {
125
+ triggerName: string;
126
+ /** Optional. This will be called when paywall fails to show due to an unsuccessful paywall download or if an invalid trigger is provided. */
127
+ onFallback?: () => void;
128
+ eventHandlers?: PaywallEventHandlers;
129
+ customPaywallTraits?: Record<string, any>;
130
+ };
76
131
  export interface PaywallInfo {
77
132
  paywallTemplateName: string;
78
133
  shouldShow: boolean;
79
134
  }
135
+ export interface PaywallEventHandlers {
136
+ onOpen?: (event: PaywallOpenEvent) => void;
137
+ onClose?: (event: PaywallCloseEvent) => void;
138
+ onDismissed?: (event: PaywallDismissedEvent) => void;
139
+ onPurchaseSucceeded?: (event: PurchaseSucceededEvent) => void;
140
+ }
141
+ export interface PaywallOpenEvent {
142
+ type: 'paywallOpen';
143
+ triggerName: string;
144
+ paywallName: string;
145
+ isSecondTry: boolean;
146
+ viewType?: 'presented' | 'embedded' | 'triggered';
147
+ }
148
+ export interface PaywallCloseEvent {
149
+ type: 'paywallClose';
150
+ triggerName: string;
151
+ paywallName: string;
152
+ isSecondTry: boolean;
153
+ }
154
+ export interface PaywallDismissedEvent {
155
+ type: 'paywallDismissed';
156
+ triggerName: string;
157
+ paywallName: string;
158
+ isSecondTry: boolean;
159
+ }
160
+ export interface PurchaseSucceededEvent {
161
+ type: 'purchaseSucceeded';
162
+ productId: string;
163
+ triggerName: string;
164
+ paywallName: string;
165
+ isSecondTry: boolean;
166
+ }
80
167
  export declare const HELIUM_CTA_NAMES: {
81
168
  SCHEDULE_CALL: string;
82
169
  SUBSCRIBE_BUTTON: string;
@@ -1 +1 @@
1
- {"version":3,"file":"HeliumPaywallSdk.types.d.ts","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HeliumPaywallSdk.types.d.ts","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeliumPaywallSdk.types.js","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"AAwDA,sDAAsD;AACtD,MAAM,UAAU,0BAA0B,CAAC,SAG1C;IACC,OAAO;QACL,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;KAC7C,CAAC;AACJ,CAAC;AAkCD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;CACrC,CAAA","sourcesContent":["import type { StyleProp, ViewStyle } from 'react-native';\n\nexport type OnLoadEventPayload = {\n url: string;\n};\n\nexport type HeliumPaywallSdkModuleEvents = {\n onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;\n onDelegateActionEvent: (params: DelegateActionEvent) => void;\n};\nexport type HeliumPaywallEvent = {\n type: string;\n triggerName?: string;\n paywallTemplateName?: string;\n productKey?: string;\n ctaName?: string;\n configId?: string;\n numAttempts?: number;\n downloadTimeTakenMS?: number;\n webviewRenderTimeTakenMS?: number;\n imagesDownloadTimeTakenMS?: number;\n fontsDownloadTimeTakenMS?: number;\n bundleDownloadTimeMS?: number;\n dismissAll?: boolean;\n errorDescription?: string;\n};\nexport type DelegateActionEvent = {\n type: 'purchase' | 'restore';\n productId?: string;\n};\n\nexport type HeliumPaywallSdkViewProps = {\n url: string;\n onLoad: (event: { nativeEvent: OnLoadEventPayload }) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport type HeliumTransactionStatus = 'purchased' | 'failed' | 'cancelled' | 'pending' | 'restored';\nexport type HeliumPurchaseResult = {\n status: HeliumTransactionStatus;\n error?: string; // Optional error message\n};\nexport type HeliumDownloadStatus = 'downloadSuccess' | 'downloadFailure' | 'inProgress' | 'notDownloadedYet';\n\n// --- Purchase Configuration Types ---\n\n/** Interface for providing custom purchase handling logic. */\n\nexport interface HeliumPurchaseConfig {\n makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;\n restorePurchases: () => Promise<boolean>;\n\n /** Optional RevenueCat API Key. If not provided, RevenueCat must be configured elsewhere. */\n apiKey?: string;\n}\n\n// Helper function for creating Custom Purchase Config\nexport function createCustomPurchaseConfig(callbacks: {\n makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;\n restorePurchases: () => Promise<boolean>;\n}): HeliumPurchaseConfig {\n return {\n makePurchase: callbacks.makePurchase,\n restorePurchases: callbacks.restorePurchases,\n };\n}\n\nexport interface HeliumConfig {\n /** Your Helium API Key */\n apiKey: string;\n /** Configuration for handling purchases. Can be custom functions or a pre-built handler config. */\n purchaseConfig: HeliumPurchaseConfig;\n /** Callback for receiving all Helium paywall events. */\n onHeliumPaywallEvent: (event: HeliumPaywallEvent) => void; // Still mandatory\n\n // Optional configurations\n fallbackBundle?: object;\n triggers?: string[];\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n}\n\nexport interface NativeHeliumConfig {\n apiKey: string;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n fallbackBundleUrlString?: string;\n fallbackBundleString?: string;\n}\n\nexport interface PaywallInfo {\n paywallTemplateName: string;\n shouldShow: boolean;\n}\n\nexport const HELIUM_CTA_NAMES = {\n SCHEDULE_CALL: 'schedule_call',\n SUBSCRIBE_BUTTON: 'subscribe_button',\n}\n"]}
1
+ {"version":3,"file":"HeliumPaywallSdk.types.js","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"AA+EA,sDAAsD;AACtD,MAAM,UAAU,0BAA0B,CAAC,SAG1C;IACC,OAAO;QACL,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;KAC7C,CAAC;AACJ,CAAC;AAiHD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;CACrC,CAAA","sourcesContent":["import type { StyleProp, ViewStyle } from 'react-native';\n\nexport type OnLoadEventPayload = {\n url: string;\n};\n\nexport type HeliumPaywallSdkModuleEvents = {\n onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;\n onDelegateActionEvent: (params: DelegateActionEvent) => void;\n paywallEventHandlers: (params: HeliumPaywallEvent) => void;\n};\nexport type HeliumPaywallEvent = {\n type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' |\n 'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' |\n 'productSelected' | 'purchasePressed' | 'purchaseSucceeded' |\n 'purchaseCancelled' | 'purchaseFailed' | 'purchaseRestored' |\n 'purchaseRestoreFailed' | 'purchasePending' | 'initializeStart' |\n 'paywallsDownloadSuccess' | 'paywallsDownloadError' | 'paywallWebViewRendered';\n triggerName?: string;\n paywallName?: string;\n /**\n * @deprecated Use `paywallName` instead.\n */\n paywallTemplateName?: string;\n productId?: string;\n /**\n * @deprecated Use `productId` instead.\n */\n productKey?: string;\n ctaName?: string;\n configId?: string;\n numAttempts?: number;\n downloadTimeTakenMS?: number;\n webviewRenderTimeTakenMS?: number;\n imagesDownloadTimeTakenMS?: number;\n fontsDownloadTimeTakenMS?: number;\n bundleDownloadTimeMS?: number;\n dismissAll?: boolean;\n isSecondTry?: boolean;\n error?: string;\n /**\n * @deprecated Use `error` instead.\n */\n errorDescription?: string;\n /**\n * Unix timestamp in seconds\n */\n timestamp?: number;\n};\nexport type DelegateActionEvent = {\n type: 'purchase' | 'restore';\n productId?: string;\n};\n\nexport type HeliumPaywallSdkViewProps = {\n url: string;\n onLoad: (event: { nativeEvent: OnLoadEventPayload }) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport type HeliumTransactionStatus = 'purchased' | 'failed' | 'cancelled' | 'pending' | 'restored';\nexport type HeliumPurchaseResult = {\n status: HeliumTransactionStatus;\n error?: string; // Optional error message\n};\nexport type HeliumDownloadStatus = 'downloadSuccess' | 'downloadFailure' | 'inProgress' | 'notDownloadedYet';\n\n// --- Purchase Configuration Types ---\n\n/** Interface for providing custom purchase handling logic. */\n\nexport interface HeliumPurchaseConfig {\n makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;\n restorePurchases: () => Promise<boolean>;\n\n /** Optional RevenueCat API Key. If not provided, RevenueCat must be configured elsewhere. */\n apiKey?: string;\n}\n\n// Helper function for creating Custom Purchase Config\nexport function createCustomPurchaseConfig(callbacks: {\n makePurchase: (productId: string) => Promise<HeliumPurchaseResult>;\n restorePurchases: () => Promise<boolean>;\n}): HeliumPurchaseConfig {\n return {\n makePurchase: callbacks.makePurchase,\n restorePurchases: callbacks.restorePurchases,\n };\n}\n\nexport type TriggerLoadingConfig = {\n /** Whether to show loading state for this trigger. Set to nil to use the global `useLoadingState` setting. */\n useLoadingState?: boolean;\n /** Maximum seconds to show loading for this trigger. Set to nil to use the global `loadingBudget` setting. */\n loadingBudget?: number;\n};\n\nexport type HeliumPaywallLoadingConfig = {\n /**\n * Whether to show a loading state while fetching paywall configuration.\n * When true, shows a loading view for up to `loadingBudget` seconds before falling back.\n * Default: true\n */\n useLoadingState?: boolean;\n /**\n * Maximum time (in seconds) to show the loading state before displaying fallback.\n * After this timeout, the fallback view will be shown even if the paywall is still downloading.\n * Default: 2.0 seconds\n */\n loadingBudget?: number;\n /**\n * Optional per-trigger loading configuration overrides.\n * Use this to customize loading behavior for specific triggers.\n * Keys are trigger names, values are TriggerLoadingConfig instances.\n * Example: Disable loading for \"onboarding\" trigger while keeping it for others.\n */\n perTriggerLoadingConfig?: Record<string, TriggerLoadingConfig>;\n};\n\nexport interface HeliumConfig {\n /** Your Helium API Key */\n apiKey: string;\n /** Configuration for handling purchases. Can be custom functions or a pre-built handler config. */\n purchaseConfig: HeliumPurchaseConfig;\n /** Callback for receiving all Helium paywall events. */\n onHeliumPaywallEvent: (event: HeliumPaywallEvent) => void; // Still mandatory\n\n // Optional configurations\n /** Fallback bundle in the rare situation that paywall is not ready to be shown. Highly recommended. See docs at https://docs.tryhelium.com/guides/fallback-bundle#react-native */\n fallbackBundle?: object;\n /** Configure loading behavior for paywalls that are mid-download. */\n paywallLoadingConfig?: HeliumPaywallLoadingConfig;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n}\n\nexport interface NativeHeliumConfig {\n apiKey: string;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n fallbackBundleUrlString?: string;\n fallbackBundleString?: string;\n paywallLoadingConfig?: HeliumPaywallLoadingConfig;\n}\n\nexport type PresentUpsellParams = {\n triggerName: string;\n /** Optional. This will be called when paywall fails to show due to an unsuccessful paywall download or if an invalid trigger is provided. */\n onFallback?: () => void;\n eventHandlers?: PaywallEventHandlers;\n customPaywallTraits?: Record<string, any>;\n};\n\nexport interface PaywallInfo {\n paywallTemplateName: string;\n shouldShow: boolean;\n}\n\n// Event handler types for per-presentation event handling\nexport interface PaywallEventHandlers {\n onOpen?: (event: PaywallOpenEvent) => void;\n onClose?: (event: PaywallCloseEvent) => void;\n onDismissed?: (event: PaywallDismissedEvent) => void;\n onPurchaseSucceeded?: (event: PurchaseSucceededEvent) => void;\n}\n\n// Typed event interfaces\nexport interface PaywallOpenEvent {\n type: 'paywallOpen';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n viewType?: 'presented' | 'embedded' | 'triggered';\n}\n\nexport interface PaywallCloseEvent {\n type: 'paywallClose';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PaywallDismissedEvent {\n type: 'paywallDismissed';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PurchaseSucceededEvent {\n type: 'purchaseSucceeded';\n productId: string;\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport const HELIUM_CTA_NAMES = {\n SCHEDULE_CALL: 'schedule_call',\n SUBSCRIBE_BUTTON: 'subscribe_button',\n}\n"]}
@@ -11,7 +11,7 @@ interface CanPresentUpsellResult {
11
11
  }
12
12
  declare class HeliumPaywallSdkModule extends NativeModule<HeliumPaywallSdkModuleEvents> {
13
13
  initialize(config: NativeHeliumConfig): void;
14
- presentUpsell(triggerName: string): void;
14
+ presentUpsell(triggerName: string, customPaywallTraits?: Record<string, any>): void;
15
15
  hideUpsell(): void;
16
16
  hideAllUpsells(): void;
17
17
  getDownloadStatus(): HeliumDownloadStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"HeliumPaywallSdkModule.d.ts","sourceRoot":"","sources":["../src/HeliumPaywallSdkModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAElC,UAAU,iBAAiB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,sBAAsB;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,OAAO,OAAO,sBAAuB,SAAQ,YAAY,CAAC,4BAA4B,CAAC;IACrF,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAE5C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAExC,UAAU,IAAI,IAAI;IAElB,cAAc,IAAI,IAAI;IAEtB,iBAAiB,IAAI,oBAAoB;IAEzC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB;IAEzD,wBAAwB,CACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,GACf,IAAI;IAEP,oBAAoB,CAClB,YAAY,EAAE,uBAAuB,EACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAEP,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAE3C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IAElD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAC3C;;AAGD,wBAA+E"}
1
+ {"version":3,"file":"HeliumPaywallSdkModule.d.ts","sourceRoot":"","sources":["../src/HeliumPaywallSdkModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAElC,UAAU,iBAAiB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,sBAAsB;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,OAAO,OAAO,sBAAuB,SAAQ,YAAY,CAAC,4BAA4B,CAAC;IACrF,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAE5C,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxC,IAAI;IAEP,UAAU,IAAI,IAAI;IAElB,cAAc,IAAI,IAAI;IAEtB,iBAAiB,IAAI,oBAAoB;IAEzC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB;IAEzD,wBAAwB,CACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,GACf,IAAI;IAEP,oBAAoB,CAClB,YAAY,EAAE,uBAAuB,EACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAEP,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAE3C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IAElD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAC3C;;AAGD,wBAA+E"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeliumPaywallSdkModule.js","sourceRoot":"","sources":["../src/HeliumPaywallSdkModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAmDzD,yDAAyD;AACzD,eAAe,mBAAmB,CAAyB,kBAAkB,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from \"expo\";\n\nimport {\n HeliumDownloadStatus,\n HeliumPaywallSdkModuleEvents,\n HeliumTransactionStatus,\n NativeHeliumConfig,\n} from \"./HeliumPaywallSdk.types\";\n\ninterface PaywallInfoResult {\n errorMsg?: string;\n templateName?: string;\n shouldShow?: boolean;\n}\n\ninterface CanPresentUpsellResult {\n canPresent?: boolean;\n reason?: string;\n}\n\ndeclare class HeliumPaywallSdkModule extends NativeModule<HeliumPaywallSdkModuleEvents> {\n initialize(config: NativeHeliumConfig): void;\n\n presentUpsell(triggerName: string): void;\n\n hideUpsell(): void;\n\n hideAllUpsells(): void;\n\n getDownloadStatus(): HeliumDownloadStatus;\n\n canPresentUpsell(trigger: string): CanPresentUpsellResult;\n\n fallbackOpenOrCloseEvent(\n trigger: string,\n isOpen: boolean,\n viewType: string,\n ): void;\n\n handlePurchaseResult(\n statusString: HeliumTransactionStatus,\n errorMsg?: string,\n ): void;\n\n handleRestoreResult(success: boolean): void;\n\n getPaywallInfo(trigger: string): PaywallInfoResult;\n\n handleDeepLink(urlString: string): boolean;\n}\n\n// This call loads the native module object from the JSI.\nexport default requireNativeModule<HeliumPaywallSdkModule>(\"HeliumPaywallSdk\");\n"]}
1
+ {"version":3,"file":"HeliumPaywallSdkModule.js","sourceRoot":"","sources":["../src/HeliumPaywallSdkModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAsDzD,yDAAyD;AACzD,eAAe,mBAAmB,CAAyB,kBAAkB,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from \"expo\";\n\nimport {\n HeliumDownloadStatus,\n HeliumPaywallSdkModuleEvents,\n HeliumTransactionStatus,\n NativeHeliumConfig,\n} from \"./HeliumPaywallSdk.types\";\n\ninterface PaywallInfoResult {\n errorMsg?: string;\n templateName?: string;\n shouldShow?: boolean;\n}\n\ninterface CanPresentUpsellResult {\n canPresent?: boolean;\n reason?: string;\n}\n\ndeclare class HeliumPaywallSdkModule extends NativeModule<HeliumPaywallSdkModuleEvents> {\n initialize(config: NativeHeliumConfig): void;\n\n presentUpsell(\n triggerName: string,\n customPaywallTraits?: Record<string, any>,\n ): void;\n\n hideUpsell(): void;\n\n hideAllUpsells(): void;\n\n getDownloadStatus(): HeliumDownloadStatus;\n\n canPresentUpsell(trigger: string): CanPresentUpsellResult;\n\n fallbackOpenOrCloseEvent(\n trigger: string,\n isOpen: boolean,\n viewType: string,\n ): void;\n\n handlePurchaseResult(\n statusString: HeliumTransactionStatus,\n errorMsg?: string,\n ): void;\n\n handleRestoreResult(success: boolean): void;\n\n getPaywallInfo(trigger: string): PaywallInfoResult;\n\n handleDeepLink(urlString: string): boolean;\n}\n\n// This call loads the native module object from the JSI.\nexport default requireNativeModule<HeliumPaywallSdkModule>(\"HeliumPaywallSdk\");\n"]}
package/build/index.d.ts CHANGED
@@ -1,11 +1,8 @@
1
- import { HeliumConfig, PaywallInfo } from "./HeliumPaywallSdk.types";
1
+ import { HeliumConfig, PaywallInfo, PresentUpsellParams } from "./HeliumPaywallSdk.types";
2
2
  export { default } from './HeliumPaywallSdkModule';
3
3
  export * from './HeliumPaywallSdk.types';
4
4
  export declare const initialize: (config: HeliumConfig) => void;
5
- export declare const presentUpsell: ({ triggerName, onFallback }: {
6
- triggerName: string;
7
- onFallback?: () => void;
8
- }) => void;
5
+ export declare const presentUpsell: ({ triggerName, onFallback, eventHandlers, customPaywallTraits, }: PresentUpsellParams) => void;
9
6
  export declare const hideUpsell: () => void;
10
7
  export declare const hideAllUpsells: () => void;
11
8
  export declare const getDownloadStatus: () => import("./HeliumPaywallSdk.types").HeliumDownloadStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEQ,WAAW,EAChC,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,cAAe,0BAA0B,CAAC;AAW1C,eAAO,MAAM,UAAU,GAAI,QAAQ,YAAY,SA2C9C,CAAC;AAyCF,eAAO,MAAM,aAAa,GAAI,6BAGG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,SAmBA,CAAC;AAEF,eAAO,MAAM,UAAU,YAAoC,CAAC;AAC5D,eAAO,MAAM,cAAc,YAAwC,CAAC;AACpE,eAAO,MAAM,iBAAiB,+DAA2C,CAAC;AAE1E,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,WAAW,GAAG,SAc9D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,GAAG,IAAI,YAOhD,CAAC;AAEF,OAAO,EAAC,0BAA0B,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAEtF,YAAY,EACV,uBAAuB,EACvB,YAAY,GACb,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAE8B,WAAW,EAAE,mBAAmB,EAC3E,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,cAAe,0BAA0B,CAAC;AAe1C,eAAO,MAAM,UAAU,GAAI,QAAQ,YAAY,SAgD9C,CAAC;AA4CF,eAAO,MAAM,aAAa,GAAI,kEAKG,mBAAmB,SAuBnD,CAAC;AAwDF,eAAO,MAAM,UAAU,YAAoC,CAAC;AAC5D,eAAO,MAAM,cAAc,YAAwC,CAAC;AACpE,eAAO,MAAM,iBAAiB,+DAA2C,CAAC;AAE1E,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,WAAW,GAAG,SAc9D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,GAAG,IAAI,YAOhD,CAAC;AAEF,OAAO,EAAC,0BAA0B,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAEtF,YAAY,EACV,uBAAuB,EACvB,YAAY,GACb,MAAM,0BAA0B,CAAC"}
package/build/index.js CHANGED
@@ -9,6 +9,9 @@ function addHeliumPaywallEventListener(listener) {
9
9
  function addDelegateActionEventListener(listener) {
10
10
  return HeliumPaywallSdkModule.addListener('onDelegateActionEvent', listener);
11
11
  }
12
+ function addPaywallEventHandlersListener(listener) {
13
+ return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);
14
+ }
12
15
  let isInitialized = false;
13
16
  export const initialize = (config) => {
14
17
  if (isInitialized) {
@@ -17,6 +20,7 @@ export const initialize = (config) => {
17
20
  isInitialized = true;
18
21
  HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');
19
22
  HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');
23
+ HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');
20
24
  // Set up listener for paywall events
21
25
  addHeliumPaywallEventListener((event) => {
22
26
  config.onHeliumPaywallEvent(event);
@@ -49,6 +53,9 @@ export const initialize = (config) => {
49
53
  }
50
54
  }
51
55
  });
56
+ addPaywallEventHandlersListener((event) => {
57
+ callPaywallEventHandlers(event);
58
+ });
52
59
  nativeInitializeAsync(config).catch(error => {
53
60
  console.error('[Helium] Initialization failed:', error);
54
61
  });
@@ -79,11 +86,14 @@ const nativeInitializeAsync = async (config) => {
79
86
  revenueCatAppUserId: config.revenueCatAppUserId,
80
87
  fallbackBundleUrlString: fallbackBundleUrlString,
81
88
  fallbackBundleString: fallbackBundleString,
89
+ paywallLoadingConfig: config.paywallLoadingConfig,
82
90
  };
83
91
  // Initialize the native module
84
92
  HeliumPaywallSdkModule.initialize(nativeConfig);
85
93
  };
86
- export const presentUpsell = ({ triggerName, onFallback }) => {
94
+ let paywallEventHandlers;
95
+ let presentOnFallback;
96
+ export const presentUpsell = ({ triggerName, onFallback, eventHandlers, customPaywallTraits, }) => {
87
97
  const { canPresent, reason } = HeliumPaywallSdkModule.canPresentUpsell(triggerName);
88
98
  if (!canPresent) {
89
99
  console.log(`[Helium] Cannot present trigger "${triggerName}". Reason: ${reason}`);
@@ -92,14 +102,71 @@ export const presentUpsell = ({ triggerName, onFallback }) => {
92
102
  return;
93
103
  }
94
104
  try {
95
- HeliumPaywallSdkModule.presentUpsell(triggerName);
105
+ paywallEventHandlers = eventHandlers;
106
+ presentOnFallback = onFallback;
107
+ HeliumPaywallSdkModule.presentUpsell(triggerName, customPaywallTraits);
96
108
  }
97
109
  catch (error) {
98
110
  console.log('Helium present error', error);
111
+ paywallEventHandlers = undefined;
112
+ presentOnFallback = undefined;
99
113
  onFallback?.();
100
114
  HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');
101
115
  }
102
116
  };
117
+ function callPaywallEventHandlers(event) {
118
+ if (paywallEventHandlers) {
119
+ switch (event.type) {
120
+ case 'paywallOpen':
121
+ paywallEventHandlers?.onOpen?.({
122
+ type: 'paywallOpen',
123
+ triggerName: event.triggerName ?? 'unknown',
124
+ paywallName: event.paywallName ?? 'unknown',
125
+ isSecondTry: event.isSecondTry ?? false,
126
+ viewType: 'presented',
127
+ });
128
+ break;
129
+ case 'paywallClose':
130
+ paywallEventHandlers?.onClose?.({
131
+ type: 'paywallClose',
132
+ triggerName: event.triggerName ?? 'unknown',
133
+ paywallName: event.paywallName ?? 'unknown',
134
+ isSecondTry: event.isSecondTry ?? false,
135
+ });
136
+ if (!event.isSecondTry) {
137
+ paywallEventHandlers = undefined;
138
+ }
139
+ presentOnFallback = undefined;
140
+ break;
141
+ case 'paywallDismissed':
142
+ paywallEventHandlers?.onDismissed?.({
143
+ type: 'paywallDismissed',
144
+ triggerName: event.triggerName ?? 'unknown',
145
+ paywallName: event.paywallName ?? 'unknown',
146
+ isSecondTry: event.isSecondTry ?? false,
147
+ });
148
+ break;
149
+ case 'purchaseSucceeded':
150
+ paywallEventHandlers?.onPurchaseSucceeded?.({
151
+ type: 'purchaseSucceeded',
152
+ productId: event.productId ?? 'unknown',
153
+ triggerName: event.triggerName ?? 'unknown',
154
+ paywallName: event.paywallName ?? 'unknown',
155
+ isSecondTry: event.isSecondTry ?? false,
156
+ });
157
+ break;
158
+ case 'paywallSkipped':
159
+ paywallEventHandlers = undefined;
160
+ presentOnFallback = undefined;
161
+ break;
162
+ case 'paywallOpenFailed':
163
+ paywallEventHandlers = undefined;
164
+ presentOnFallback?.();
165
+ presentOnFallback = undefined;
166
+ break;
167
+ }
168
+ }
169
+ }
103
170
  export const hideUpsell = HeliumPaywallSdkModule.hideUpsell;
104
171
  export const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;
105
172
  export const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DelegateActionEvent,\n HeliumConfig,\n HeliumPaywallEvent,\n NativeHeliumConfig, PaywallInfo,\n} from \"./HeliumPaywallSdk.types\";\nimport HeliumPaywallSdkModule from \"./HeliumPaywallSdkModule\";\nimport { EventSubscription } from 'expo-modules-core';\nimport * as ExpoFileSystem from 'expo-file-system';\n\nexport { default } from './HeliumPaywallSdkModule';\n// export { default as HeliumPaywallSdkView } from './HeliumPaywallSdkView';\nexport * from './HeliumPaywallSdk.types';\n\nfunction addHeliumPaywallEventListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onHeliumPaywallEvent', listener);\n}\n\nfunction addDelegateActionEventListener(listener: (event: DelegateActionEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onDelegateActionEvent', listener);\n}\n\nlet isInitialized = false;\nexport const initialize = (config: HeliumConfig) => {\n if (isInitialized) {\n return;\n }\n isInitialized = true;\n\n HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');\n HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');\n\n // Set up listener for paywall events\n addHeliumPaywallEventListener((event) => {\n config.onHeliumPaywallEvent(event);\n });\n\n // Set up delegate action listener for purchase and restore operations\n addDelegateActionEventListener(async (event) => {\n try {\n if (event.type === 'purchase') {\n if (event.productId) {\n const result = await config.purchaseConfig.makePurchase(event.productId);\n HeliumPaywallSdkModule.handlePurchaseResult(result.status, result.error);\n } else {\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No product ID for purchase event.');\n }\n }\n else if (event.type === 'restore') {\n const success = await config.purchaseConfig.restorePurchases();\n HeliumPaywallSdkModule.handleRestoreResult(success);\n }\n } catch (error) {\n // Send failure result based on action type\n if (event.type === 'purchase') {\n console.log('[Helium] Unexpected error: ', error);\n HeliumPaywallSdkModule.handlePurchaseResult('failed');\n } else if (event.type === 'restore') {\n HeliumPaywallSdkModule.handleRestoreResult(false);\n }\n }\n });\n\n nativeInitializeAsync(config).catch(error => {\n console.error('[Helium] Initialization failed:', error);\n });\n};\n\nconst nativeInitializeAsync = async (config: HeliumConfig) => {\n let fallbackBundleUrlString;\n let fallbackBundleString;\n if (config.fallbackBundle) {\n try {\n const jsonContent = JSON.stringify(config.fallbackBundle);\n\n // Write to documents directory\n fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-fallback.json`;\n // This is ASYNC but that's ok because helium initialize in swift code is async anyways.\n await ExpoFileSystem.writeAsStringAsync(\n fallbackBundleUrlString,\n jsonContent\n );\n } catch (error) {\n // Fallback to string approach if unexpected error occurs\n console.log(\n '[Helium] expo-file-system not available, attempting to pass fallback bundle as string.'\n );\n fallbackBundleString = JSON.stringify(config.fallbackBundle);\n }\n }\n\n\n // Create native config object\n const nativeConfig: NativeHeliumConfig = {\n apiKey: config.apiKey,\n customUserId: config.customUserId,\n customAPIEndpoint: config.customAPIEndpoint,\n customUserTraits: config.customUserTraits,\n revenueCatAppUserId: config.revenueCatAppUserId,\n fallbackBundleUrlString: fallbackBundleUrlString,\n fallbackBundleString: fallbackBundleString,\n };\n\n // Initialize the native module\n HeliumPaywallSdkModule.initialize(nativeConfig);\n};\n\nexport const presentUpsell = ({\n triggerName,\n onFallback\n }: {\n triggerName: string;\n onFallback?: () => void;\n}) => {\n const { canPresent, reason } = HeliumPaywallSdkModule.canPresentUpsell(triggerName);\n\n if (!canPresent) {\n console.log(\n `[Helium] Cannot present trigger \"${triggerName}\". Reason: ${reason}`\n );\n onFallback?.();\n HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');\n return;\n }\n\n try {\n HeliumPaywallSdkModule.presentUpsell(triggerName);\n } catch (error) {\n console.log('Helium present error', error);\n onFallback?.();\n HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');\n }\n};\n\nexport const hideUpsell = HeliumPaywallSdkModule.hideUpsell;\nexport const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;\nexport const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;\n\nexport const getPaywallInfo = (trigger: string): PaywallInfo | undefined => {\n const result = HeliumPaywallSdkModule.getPaywallInfo(trigger);\n if (!result) {\n console.log('[Helium] getPaywallInfo unexpected error.');\n return;\n }\n if (result.errorMsg) {\n console.log(`[Helium] ${result.errorMsg}`);\n return;\n }\n return {\n paywallTemplateName: result.templateName ?? 'unknown template',\n shouldShow: result.shouldShow ?? true,\n };\n};\n\nexport const handleDeepLink = (url: string | null) => {\n if (url) {\n const handled = HeliumPaywallSdkModule.handleDeepLink(url);\n console.log('[Helium] Handled deep link:', handled);\n return handled;\n }\n return false;\n};\n\nexport {createCustomPurchaseConfig, HELIUM_CTA_NAMES} from './HeliumPaywallSdk.types';\n\nexport type {\n HeliumTransactionStatus,\n HeliumConfig,\n} from './HeliumPaywallSdk.types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DelegateActionEvent,\n HeliumConfig,\n HeliumPaywallEvent,\n NativeHeliumConfig, PaywallEventHandlers, PaywallInfo, PresentUpsellParams,\n} from \"./HeliumPaywallSdk.types\";\nimport HeliumPaywallSdkModule from \"./HeliumPaywallSdkModule\";\nimport { EventSubscription } from 'expo-modules-core';\nimport * as ExpoFileSystem from 'expo-file-system';\n\nexport { default } from './HeliumPaywallSdkModule';\n// export { default as HeliumPaywallSdkView } from './HeliumPaywallSdkView';\nexport * from './HeliumPaywallSdk.types';\n\nfunction addHeliumPaywallEventListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onHeliumPaywallEvent', listener);\n}\n\nfunction addDelegateActionEventListener(listener: (event: DelegateActionEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onDelegateActionEvent', listener);\n}\n\nfunction addPaywallEventHandlersListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);\n}\n\nlet isInitialized = false;\nexport const initialize = (config: HeliumConfig) => {\n if (isInitialized) {\n return;\n }\n isInitialized = true;\n\n HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');\n HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');\n HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');\n\n // Set up listener for paywall events\n addHeliumPaywallEventListener((event) => {\n config.onHeliumPaywallEvent(event);\n });\n\n // Set up delegate action listener for purchase and restore operations\n addDelegateActionEventListener(async (event) => {\n try {\n if (event.type === 'purchase') {\n if (event.productId) {\n const result = await config.purchaseConfig.makePurchase(event.productId);\n HeliumPaywallSdkModule.handlePurchaseResult(result.status, result.error);\n } else {\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No product ID for purchase event.');\n }\n }\n else if (event.type === 'restore') {\n const success = await config.purchaseConfig.restorePurchases();\n HeliumPaywallSdkModule.handleRestoreResult(success);\n }\n } catch (error) {\n // Send failure result based on action type\n if (event.type === 'purchase') {\n console.log('[Helium] Unexpected error: ', error);\n HeliumPaywallSdkModule.handlePurchaseResult('failed');\n } else if (event.type === 'restore') {\n HeliumPaywallSdkModule.handleRestoreResult(false);\n }\n }\n });\n\n addPaywallEventHandlersListener((event) => {\n callPaywallEventHandlers(event);\n });\n\n nativeInitializeAsync(config).catch(error => {\n console.error('[Helium] Initialization failed:', error);\n });\n};\n\nconst nativeInitializeAsync = async (config: HeliumConfig) => {\n let fallbackBundleUrlString;\n let fallbackBundleString;\n if (config.fallbackBundle) {\n try {\n const jsonContent = JSON.stringify(config.fallbackBundle);\n\n // Write to documents directory\n fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-fallback.json`;\n // This is ASYNC but that's ok because helium initialize in swift code is async anyways.\n await ExpoFileSystem.writeAsStringAsync(\n fallbackBundleUrlString,\n jsonContent\n );\n } catch (error) {\n // Fallback to string approach if unexpected error occurs\n console.log(\n '[Helium] expo-file-system not available, attempting to pass fallback bundle as string.'\n );\n fallbackBundleString = JSON.stringify(config.fallbackBundle);\n }\n }\n\n\n // Create native config object\n const nativeConfig: NativeHeliumConfig = {\n apiKey: config.apiKey,\n customUserId: config.customUserId,\n customAPIEndpoint: config.customAPIEndpoint,\n customUserTraits: config.customUserTraits,\n revenueCatAppUserId: config.revenueCatAppUserId,\n fallbackBundleUrlString: fallbackBundleUrlString,\n fallbackBundleString: fallbackBundleString,\n paywallLoadingConfig: config.paywallLoadingConfig,\n };\n\n // Initialize the native module\n HeliumPaywallSdkModule.initialize(nativeConfig);\n};\n\nlet paywallEventHandlers: PaywallEventHandlers | undefined;\nlet presentOnFallback: (() => void) | undefined;\nexport const presentUpsell = ({\n triggerName,\n onFallback,\n eventHandlers,\n customPaywallTraits,\n }: PresentUpsellParams) => {\n const {canPresent, reason} = HeliumPaywallSdkModule.canPresentUpsell(triggerName);\n\n if (!canPresent) {\n console.log(\n `[Helium] Cannot present trigger \"${triggerName}\". Reason: ${reason}`\n );\n onFallback?.();\n HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');\n return;\n }\n\n try {\n paywallEventHandlers = eventHandlers;\n presentOnFallback = onFallback;\n HeliumPaywallSdkModule.presentUpsell(triggerName, customPaywallTraits);\n } catch (error) {\n console.log('Helium present error', error);\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n onFallback?.();\n HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');\n }\n};\n\nfunction callPaywallEventHandlers(event: HeliumPaywallEvent) {\n if (paywallEventHandlers) {\n switch (event.type) {\n case 'paywallOpen':\n paywallEventHandlers?.onOpen?.({\n type: 'paywallOpen',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n viewType: 'presented',\n });\n break;\n case 'paywallClose':\n paywallEventHandlers?.onClose?.({\n type: 'paywallClose',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n if (!event.isSecondTry) {\n paywallEventHandlers = undefined;\n }\n presentOnFallback = undefined;\n break;\n case 'paywallDismissed':\n paywallEventHandlers?.onDismissed?.({\n type: 'paywallDismissed',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'purchaseSucceeded':\n paywallEventHandlers?.onPurchaseSucceeded?.({\n type: 'purchaseSucceeded',\n productId: event.productId ?? 'unknown',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'paywallSkipped':\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n break;\n case 'paywallOpenFailed':\n paywallEventHandlers = undefined;\n presentOnFallback?.();\n presentOnFallback = undefined;\n break;\n }\n }\n}\n\nexport const hideUpsell = HeliumPaywallSdkModule.hideUpsell;\nexport const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;\nexport const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;\n\nexport const getPaywallInfo = (trigger: string): PaywallInfo | undefined => {\n const result = HeliumPaywallSdkModule.getPaywallInfo(trigger);\n if (!result) {\n console.log('[Helium] getPaywallInfo unexpected error.');\n return;\n }\n if (result.errorMsg) {\n console.log(`[Helium] ${result.errorMsg}`);\n return;\n }\n return {\n paywallTemplateName: result.templateName ?? 'unknown template',\n shouldShow: result.shouldShow ?? true,\n };\n};\n\nexport const handleDeepLink = (url: string | null) => {\n if (url) {\n const handled = HeliumPaywallSdkModule.handleDeepLink(url);\n console.log('[Helium] Handled deep link:', handled);\n return handled;\n }\n return false;\n};\n\nexport {createCustomPurchaseConfig, HELIUM_CTA_NAMES} from './HeliumPaywallSdk.types';\n\nexport type {\n HeliumTransactionStatus,\n HeliumConfig,\n} from './HeliumPaywallSdk.types';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"revenuecat.d.ts","sourceRoot":"","sources":["../../src/revenuecat/revenuecat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAE,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAGrF,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,oBAAoB,CAOvB;AAED,qBAAa,uBAAuB;IAChC,OAAO,CAAC,yBAAyB,CAAwC;IACzE,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,OAAO,CAAC,yBAAyB,CAA6C;gBAElE,MAAM,CAAC,EAAE,MAAM;YAQb,wBAAwB;YAyBxB,wBAAwB;IAQhC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA+EpE,OAAO,CAAC,eAAe;IAMjB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;CAS7C"}
1
+ {"version":3,"file":"revenuecat.d.ts","sourceRoot":"","sources":["../../src/revenuecat/revenuecat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,oBAAoB,EAAE,oBAAoB,EAAC,MAAM,2BAA2B,CAAC;AAGrF,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,oBAAoB,CAOvB;AAED,qBAAa,uBAAuB;IAChC,OAAO,CAAC,yBAAyB,CAAwC;IACzE,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,OAAO,CAAC,yBAAyB,CAA6C;gBAElE,MAAM,CAAC,EAAE,MAAM;YAOb,wBAAwB;YAyBxB,wBAAwB;IAQhC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA+EpE,OAAO,CAAC,eAAe;IAMjB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;CAS7C"}
@@ -17,8 +17,6 @@ export class RevenueCatHeliumHandler {
17
17
  if (apiKey) {
18
18
  Purchases.configure({ apiKey });
19
19
  }
20
- else {
21
- }
22
20
  this.initializePackageMapping();
23
21
  }
24
22
  async initializePackageMapping() {
@@ -1 +1 @@
1
- {"version":3,"file":"revenuecat.js","sourceRoot":"","sources":["../../src/revenuecat/revenuecat.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAC,oBAAoB,EAAwB,MAAM,wBAAwB,CAAC;AAI9F,8BAA8B;AAC9B,MAAM,UAAU,8BAA8B,CAAC,MAE9C;IACG,MAAM,SAAS,GAAG,IAAI,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,MAAM;QACtB,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QACpD,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;KAC7D,CAAC;AACN,CAAC;AAED,MAAM,OAAO,uBAAuB;IACxB,yBAAyB,GAAqC,EAAE,CAAC;IACjE,oBAAoB,GAAY,KAAK,CAAC;IACtC,qBAAqB,GAAyB,IAAI,CAAC;IAEnD,yBAAyB,GAA0C,EAAE,CAAC;IAE9E,YAAY,MAAe;QACvB,IAAI,MAAM,EAAE,CAAC;YACT,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;QACR,CAAC;QACD,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,wBAAwB;QAClC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,qBAAqB,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,qBAAqB,GAAG,CAAC,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;gBACjD,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC;gBACnC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjD,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAqB,EAAE,EAAE;wBACzD,IAAI,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;4BAC1B,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;wBACjE,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;gBACD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YACtC,CAAC;oBAAS,CAAC;gBACN,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACvC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;QACJ,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,wBAAwB;QAClC,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,qBAAqB,CAAC;QACrC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QAChC,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAiC,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;QACpF,IAAI,SAA4C,CAAC;QACjD,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,0BAA0B;YAC1B,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,sBAAsB;gBACtB,IAAI,CAAC;oBACD,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC5D,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClE,CAAC;gBAAC,MAAM,CAAC;oBACL,mCAAmC;gBACvC,CAAC;gBACD,IAAI,SAAS,EAAE,CAAC;oBACZ,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;gBAC1D,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACD,IAAI,YAA0B,CAAC;YAC/B,IAAI,GAAG,EAAE,CAAC;gBACN,YAAY,GAAG,CAAC,MAAM,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;YACvE,CAAC;iBAAM,IAAI,SAAS,EAAE,CAAC;gBACnB,YAAY,GAAG,CAAC,MAAM,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACL,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gDAAgD,SAAS,EAAE,EAAE,CAAC;YACnG,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC/D,IAAI,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,gGAAgG;gBAChG,2CAA2C;gBAC3C,8EAA8E;gBAC9E,4EAA4E;gBAC5E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,sFAAsF,EAAE,CAAC;YAC/H,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,cAAc,GAAG,KAAuB,CAAC;YAE/C,IAAI,cAAc,EAAE,IAAI,KAAK,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;gBACtE,gDAAgD;gBAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC3B,6DAA6D;oBAC7D,MAAM,cAAc,GAA+B,CAAC,mBAAiC,EAAE,EAAE;wBACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;wBACtE,IAAI,QAAQ,EAAE,CAAC;4BACX,YAAY,CAAC,SAAS,CAAC,CAAC;4BACxB,+CAA+C;4BAC/C,SAAS,CAAC,gCAAgC,CAAC,cAAc,CAAC,CAAC;4BAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;wBACrC,CAAC;oBACL,CAAC,CAAC;oBAEF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC7B,0DAA0D;wBAC3D,SAAS,CAAC,gCAAgC,CAAC,cAAc,CAAC,CAAC;wBAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBACnC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAET,mBAAmB;oBACnB,SAAS,CAAC,6BAA6B,CAAC,cAAc,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACP,CAAC;YAED,IAAI,cAAc,EAAE,IAAI,KAAK,oBAAoB,CAAC,wBAAwB,EAAE,CAAC;gBACzE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YACnC,CAAC;YAED,sBAAsB;YACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,IAAI,6BAA6B,EAAE,CAAC;QACjG,CAAC;IACL,CAAC;IAED,kEAAkE;IAC1D,eAAe,CAAC,YAA0B,EAAE,SAAiB;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAqC,EAAE,EAAE,CAAC,WAAW,CAAC,iBAAiB,KAAK,SAAS,CAAC;eACzI,YAAY,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC;eACpD,YAAY,CAAC,8BAA8B,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1E,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;CACJ","sourcesContent":["import Purchases, {PURCHASES_ERROR_CODE, PurchasesStoreProduct} from 'react-native-purchases';\nimport type { PurchasesError, PurchasesPackage, CustomerInfoUpdateListener, CustomerInfo, PurchasesEntitlementInfo } from 'react-native-purchases';\nimport {HeliumPurchaseConfig, HeliumPurchaseResult} from \"../HeliumPaywallSdk.types\";\n\n// Rename the factory function\nexport function createRevenueCatPurchaseConfig(config?: {\n apiKey?: string;\n}): HeliumPurchaseConfig {\n const rcHandler = new RevenueCatHeliumHandler(config?.apiKey);\n return {\n apiKey: config?.apiKey,\n makePurchase: rcHandler.makePurchase.bind(rcHandler),\n restorePurchases: rcHandler.restorePurchases.bind(rcHandler),\n };\n}\n\nexport class RevenueCatHeliumHandler {\n private productIdToPackageMapping: Record<string, PurchasesPackage> = {};\n private isMappingInitialized: boolean = false;\n private initializationPromise: Promise<void> | null = null;\n\n private rcProductToPackageMapping: Record<string, PurchasesStoreProduct> = {};\n\n constructor(apiKey?: string) {\n if (apiKey) {\n Purchases.configure({ apiKey });\n } else {\n }\n this.initializePackageMapping();\n }\n\n private async initializePackageMapping(): Promise<void> {\n if (this.initializationPromise) {\n return this.initializationPromise;\n }\n this.initializationPromise = (async () => {\n try {\n const offerings = await Purchases.getOfferings();\n const allOfferings = offerings.all;\n for (const offering of Object.values(allOfferings)) {\n offering.availablePackages.forEach((pkg: PurchasesPackage) => {\n if (pkg.product?.identifier) {\n this.productIdToPackageMapping[pkg.product.identifier] = pkg;\n }\n });\n }\n this.isMappingInitialized = true;\n } catch (error) {\n this.isMappingInitialized = false;\n } finally {\n this.initializationPromise = null;\n }\n })();\n return this.initializationPromise;\n }\n\n private async ensureMappingInitialized(): Promise<void> {\n if (!this.isMappingInitialized && !this.initializationPromise) {\n await this.initializePackageMapping();\n } else if (this.initializationPromise) {\n await this.initializationPromise;\n }\n }\n\n async makePurchase(productId: string): Promise<HeliumPurchaseResult> {\n await this.ensureMappingInitialized();\n\n const pkg: PurchasesPackage | undefined = this.productIdToPackageMapping[productId];\n let rcProduct: PurchasesStoreProduct | undefined;\n if (!pkg) {\n // Use cached if available\n rcProduct = this.rcProductToPackageMapping[productId];\n if (!rcProduct) {\n // Try to retrieve now\n try {\n const rcProducts = await Purchases.getProducts([productId]);\n rcProduct = rcProducts.length > 0 ? rcProducts[0] : undefined;\n } catch {\n // 'failed' status will be returned\n }\n if (rcProduct) {\n this.rcProductToPackageMapping[productId] = rcProduct;\n }\n }\n }\n\n try {\n let customerInfo: CustomerInfo;\n if (pkg) {\n customerInfo = (await Purchases.purchasePackage(pkg)).customerInfo;\n } else if (rcProduct) {\n customerInfo = (await Purchases.purchaseStoreProduct(rcProduct)).customerInfo;\n } else {\n return { status: 'failed', error: `RevenueCat Product/Package not found for ID: ${productId}` };\n }\n const isActive = this.isProductActive(customerInfo, productId);\n if (isActive) {\n return { status: 'purchased' };\n } else {\n // This case might occur if the purchase succeeded but the entitlement wasn't immediately active\n // or if a different product became active.\n // Consider if polling/listening might be needed here too, similar to pending.\n // For now, returning failed as the specific product isn't confirmed active.\n return { status: 'failed', error: 'Purchase possibly complete but entitlement/subscription not active for this product.' };\n }\n } catch (error) {\n const purchasesError = error as PurchasesError;\n\n if (purchasesError?.code === PURCHASES_ERROR_CODE.PAYMENT_PENDING_ERROR) {\n // Wait for a terminal state for up to 5 seconds\n return new Promise((resolve) => {\n // Define the listener function separately to remove it later\n const updateListener: CustomerInfoUpdateListener = (updatedCustomerInfo: CustomerInfo) => {\n const isActive = this.isProductActive(updatedCustomerInfo, productId);\n if (isActive) {\n clearTimeout(timeoutId);\n // Remove listener using the function reference\n Purchases.removeCustomerInfoUpdateListener(updateListener);\n resolve({ status: 'purchased' });\n }\n };\n\n const timeoutId = setTimeout(() => {\n // Remove listener using the function reference on timeout\n Purchases.removeCustomerInfoUpdateListener(updateListener);\n resolve({ status: 'pending' });\n }, 5000);\n\n // Add the listener\n Purchases.addCustomerInfoUpdateListener(updateListener);\n });\n }\n\n if (purchasesError?.code === PURCHASES_ERROR_CODE.PURCHASE_CANCELLED_ERROR) {\n return { status: 'cancelled' };\n }\n\n // Handle other errors\n return { status: 'failed', error: purchasesError?.message || 'RevenueCat purchase failed.' };\n }\n }\n\n // Helper function to check if a product is active in CustomerInfo\n private isProductActive(customerInfo: CustomerInfo, productId: string): boolean {\n return Object.values(customerInfo.entitlements.active).some((entitlement: PurchasesEntitlementInfo) => entitlement.productIdentifier === productId)\n || customerInfo.activeSubscriptions.includes(productId)\n || customerInfo.allPurchasedProductIdentifiers.includes(productId);\n }\n\n async restorePurchases(): Promise<boolean> {\n try {\n const customerInfo = await Purchases.restorePurchases();\n const isActive = Object.keys(customerInfo.entitlements.active).length > 0;\n return isActive;\n } catch (error) {\n return false;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"revenuecat.js","sourceRoot":"","sources":["../../src/revenuecat/revenuecat.ts"],"names":[],"mappings":"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","sourcesContent":["import Purchases, {PURCHASES_ERROR_CODE, PurchasesStoreProduct} from 'react-native-purchases';\nimport type { PurchasesError, PurchasesPackage, CustomerInfoUpdateListener, CustomerInfo, PurchasesEntitlementInfo } from 'react-native-purchases';\nimport {HeliumPurchaseConfig, HeliumPurchaseResult} from \"../HeliumPaywallSdk.types\";\n\n// Rename the factory function\nexport function createRevenueCatPurchaseConfig(config?: {\n apiKey?: string;\n}): HeliumPurchaseConfig {\n const rcHandler = new RevenueCatHeliumHandler(config?.apiKey);\n return {\n apiKey: config?.apiKey,\n makePurchase: rcHandler.makePurchase.bind(rcHandler),\n restorePurchases: rcHandler.restorePurchases.bind(rcHandler),\n };\n}\n\nexport class RevenueCatHeliumHandler {\n private productIdToPackageMapping: Record<string, PurchasesPackage> = {};\n private isMappingInitialized: boolean = false;\n private initializationPromise: Promise<void> | null = null;\n\n private rcProductToPackageMapping: Record<string, PurchasesStoreProduct> = {};\n\n constructor(apiKey?: string) {\n if (apiKey) {\n Purchases.configure({ apiKey });\n }\n this.initializePackageMapping();\n }\n\n private async initializePackageMapping(): Promise<void> {\n if (this.initializationPromise) {\n return this.initializationPromise;\n }\n this.initializationPromise = (async () => {\n try {\n const offerings = await Purchases.getOfferings();\n const allOfferings = offerings.all;\n for (const offering of Object.values(allOfferings)) {\n offering.availablePackages.forEach((pkg: PurchasesPackage) => {\n if (pkg.product?.identifier) {\n this.productIdToPackageMapping[pkg.product.identifier] = pkg;\n }\n });\n }\n this.isMappingInitialized = true;\n } catch (error) {\n this.isMappingInitialized = false;\n } finally {\n this.initializationPromise = null;\n }\n })();\n return this.initializationPromise;\n }\n\n private async ensureMappingInitialized(): Promise<void> {\n if (!this.isMappingInitialized && !this.initializationPromise) {\n await this.initializePackageMapping();\n } else if (this.initializationPromise) {\n await this.initializationPromise;\n }\n }\n\n async makePurchase(productId: string): Promise<HeliumPurchaseResult> {\n await this.ensureMappingInitialized();\n\n const pkg: PurchasesPackage | undefined = this.productIdToPackageMapping[productId];\n let rcProduct: PurchasesStoreProduct | undefined;\n if (!pkg) {\n // Use cached if available\n rcProduct = this.rcProductToPackageMapping[productId];\n if (!rcProduct) {\n // Try to retrieve now\n try {\n const rcProducts = await Purchases.getProducts([productId]);\n rcProduct = rcProducts.length > 0 ? rcProducts[0] : undefined;\n } catch {\n // 'failed' status will be returned\n }\n if (rcProduct) {\n this.rcProductToPackageMapping[productId] = rcProduct;\n }\n }\n }\n\n try {\n let customerInfo: CustomerInfo;\n if (pkg) {\n customerInfo = (await Purchases.purchasePackage(pkg)).customerInfo;\n } else if (rcProduct) {\n customerInfo = (await Purchases.purchaseStoreProduct(rcProduct)).customerInfo;\n } else {\n return { status: 'failed', error: `RevenueCat Product/Package not found for ID: ${productId}` };\n }\n const isActive = this.isProductActive(customerInfo, productId);\n if (isActive) {\n return { status: 'purchased' };\n } else {\n // This case might occur if the purchase succeeded but the entitlement wasn't immediately active\n // or if a different product became active.\n // Consider if polling/listening might be needed here too, similar to pending.\n // For now, returning failed as the specific product isn't confirmed active.\n return { status: 'failed', error: 'Purchase possibly complete but entitlement/subscription not active for this product.' };\n }\n } catch (error) {\n const purchasesError = error as PurchasesError;\n\n if (purchasesError?.code === PURCHASES_ERROR_CODE.PAYMENT_PENDING_ERROR) {\n // Wait for a terminal state for up to 5 seconds\n return new Promise((resolve) => {\n // Define the listener function separately to remove it later\n const updateListener: CustomerInfoUpdateListener = (updatedCustomerInfo: CustomerInfo) => {\n const isActive = this.isProductActive(updatedCustomerInfo, productId);\n if (isActive) {\n clearTimeout(timeoutId);\n // Remove listener using the function reference\n Purchases.removeCustomerInfoUpdateListener(updateListener);\n resolve({ status: 'purchased' });\n }\n };\n\n const timeoutId = setTimeout(() => {\n // Remove listener using the function reference on timeout\n Purchases.removeCustomerInfoUpdateListener(updateListener);\n resolve({ status: 'pending' });\n }, 5000);\n\n // Add the listener\n Purchases.addCustomerInfoUpdateListener(updateListener);\n });\n }\n\n if (purchasesError?.code === PURCHASES_ERROR_CODE.PURCHASE_CANCELLED_ERROR) {\n return { status: 'cancelled' };\n }\n\n // Handle other errors\n return { status: 'failed', error: purchasesError?.message || 'RevenueCat purchase failed.' };\n }\n }\n\n // Helper function to check if a product is active in CustomerInfo\n private isProductActive(customerInfo: CustomerInfo, productId: string): boolean {\n return Object.values(customerInfo.entitlements.active).some((entitlement: PurchasesEntitlementInfo) => entitlement.productIdentifier === productId)\n || customerInfo.activeSubscriptions.includes(productId)\n || customerInfo.allPurchasedProductIdentifiers.includes(productId);\n }\n\n async restorePurchases(): Promise<boolean> {\n try {\n const customerInfo = await Purchases.restorePurchases();\n const isActive = Object.keys(customerInfo.entitlements.active).length > 0;\n return isActive;\n } catch (error) {\n return false;\n }\n }\n}\n"]}
@@ -19,7 +19,7 @@ Pod::Spec.new do |s|
19
19
  s.static_framework = true
20
20
 
21
21
  s.dependency 'ExpoModulesCore'
22
- s.dependency 'Helium', '2.3.0'
22
+ s.dependency 'Helium', '3.0.3'
23
23
 
24
24
  # Swift/Objective-C compatibility
25
25
  s.pod_target_xcconfig = {
@@ -56,18 +56,45 @@ public class HeliumPaywallSdkModule: Module {
56
56
  // ])
57
57
 
58
58
  // Defines event names that the module can send to JavaScript.
59
- Events("onHeliumPaywallEvent", "onDelegateActionEvent")
59
+ Events("onHeliumPaywallEvent", "onDelegateActionEvent", "paywallEventHandlers")
60
60
 
61
61
  // todo use Record here? https://docs.expo.dev/modules/module-api/#records
62
62
  Function("initialize") { (config: [String : Any]) in
63
63
  let userTraitsMap = config["customUserTraits"] as? [String : Any]
64
64
  let fallbackBundleURLString = config["fallbackBundleUrlString"] as? String
65
65
  let fallbackBundleString = config["fallbackBundleString"] as? String
66
+
67
+ let paywallLoadingConfig = config["paywallLoadingConfig"] as? [String: Any]
68
+ let useLoadingState = paywallLoadingConfig?["useLoadingState"] as? Bool ?? true
69
+ let loadingBudget = paywallLoadingConfig?["loadingBudget"] as? TimeInterval ?? 2.0
70
+
71
+ var perTriggerLoadingConfig: [String: TriggerLoadingConfig]? = nil
72
+ if let perTriggerDict = paywallLoadingConfig?["perTriggerLoadingConfig"] as? [String: [String: Any]] {
73
+ var triggerConfigs: [String: TriggerLoadingConfig] = [:]
74
+ for (trigger, config) in perTriggerDict {
75
+ triggerConfigs[trigger] = TriggerLoadingConfig(
76
+ useLoadingState: config["useLoadingState"] as? Bool,
77
+ loadingBudget: config["loadingBudget"] as? TimeInterval
78
+ )
79
+ }
80
+ perTriggerLoadingConfig = triggerConfigs
81
+ }
66
82
 
67
83
  // Create delegate with closures that send events to JavaScript
68
84
  let delegate = InternalDelegate(
69
85
  eventHandler: { [weak self] event in
70
- self?.sendEvent("onHeliumPaywallEvent", event.toDictionary())
86
+ var eventDict = event.toDictionary()
87
+ // Add deprecated fields for backwards compatibility
88
+ if let paywallName = eventDict["paywallName"] {
89
+ eventDict["paywallTemplateName"] = paywallName
90
+ }
91
+ if let error = eventDict["error"] {
92
+ eventDict["errorDescription"] = error
93
+ }
94
+ if let productId = eventDict["productId"] {
95
+ eventDict["productKey"] = productId
96
+ }
97
+ self?.sendEvent("onHeliumPaywallEvent", eventDict)
71
98
  },
72
99
  purchaseHandler: { [weak self] productId in
73
100
  guard let self else { return .failed(PurchaseError.purchaseFailed(errorMsg: "Module not active!")) }
@@ -128,12 +155,16 @@ public class HeliumPaywallSdkModule: Module {
128
155
  Helium.shared.initialize(
129
156
  apiKey: config["apiKey"] as? String ?? "",
130
157
  heliumPaywallDelegate: delegate,
131
- fallbackPaywall: FallbackView(),
158
+ fallbackConfig: HeliumFallbackConfig.withMultipleFallbacks(
159
+ fallbackBundle: fallbackBundleURL,
160
+ useLoadingState: useLoadingState,
161
+ loadingBudget: loadingBudget,
162
+ perTriggerLoadingConfig: perTriggerLoadingConfig
163
+ ),
132
164
  customUserId: config["customUserId"] as? String,
133
165
  customAPIEndpoint: config["customAPIEndpoint"] as? String,
134
166
  customUserTraits: userTraitsMap != nil ? HeliumUserTraits(userTraitsMap!) : nil,
135
- revenueCatAppUserId: config["revenueCatAppUserId"] as? String,
136
- fallbackBundleURL: fallbackBundleURL
167
+ revenueCatAppUserId: config["revenueCatAppUserId"] as? String
137
168
  )
138
169
  }
139
170
 
@@ -174,8 +205,25 @@ public class HeliumPaywallSdkModule: Module {
174
205
  continuation.resume(returning: success)
175
206
  }
176
207
 
177
- Function("presentUpsell") { (trigger: String) in
178
- Helium.shared.presentUpsell(trigger: trigger)
208
+ Function("presentUpsell") { (trigger: String, customPaywallTraits: [String: Any]?) in
209
+ Helium.shared.presentUpsell(
210
+ trigger: trigger,
211
+ eventHandlers: PaywallEventHandlers.withHandlers(
212
+ onOpen: { [weak self] event in
213
+ self?.sendEvent("paywallEventHandlers", event.toDictionary())
214
+ },
215
+ onClose: { [weak self] event in
216
+ self?.sendEvent("paywallEventHandlers", event.toDictionary())
217
+ },
218
+ onDismissed: { [weak self] event in
219
+ self?.sendEvent("paywallEventHandlers", event.toDictionary())
220
+ },
221
+ onPurchaseSucceeded: { [weak self] event in
222
+ self?.sendEvent("paywallEventHandlers", event.toDictionary())
223
+ }
224
+ ),
225
+ customPaywallTraits: customPaywallTraits
226
+ )
179
227
  }
180
228
 
181
229
  Function("hideUpsell") {
@@ -221,10 +269,17 @@ public class HeliumPaywallSdkModule: Module {
221
269
  let canPresent: Bool
222
270
  let reason: String
223
271
 
272
+ let useLoading = Helium.shared.loadingStateEnabledFor(trigger: trigger)
273
+ let downloadInProgress = Helium.shared.getDownloadStatus() == .inProgress
274
+
224
275
  if paywallsLoaded && hasTrigger {
225
276
  // Normal case - paywall is ready
226
277
  canPresent = true
227
278
  reason = "ready"
279
+ } else if downloadInProgress && useLoading {
280
+ // Loading case - paywall still downloading
281
+ canPresent = true
282
+ reason = "loading"
228
283
  } else if HeliumFallbackViewManager.shared.getFallbackInfo(trigger: trigger) != nil {
229
284
  // Fallback is available (via downloaded bundle)
230
285
  canPresent = true
@@ -274,12 +329,12 @@ public class HeliumPaywallSdkModule: Module {
274
329
  }
275
330
 
276
331
  fileprivate class InternalDelegate: HeliumPaywallDelegate {
277
- private let eventHandler: (HeliumPaywallEvent) -> Void
332
+ private let eventHandler: (HeliumEvent) -> Void
278
333
  private let purchaseHandler: (String) async -> HeliumPaywallTransactionStatus
279
334
  private let restoreHandler: () async -> Bool
280
335
 
281
336
  init(
282
- eventHandler: @escaping (HeliumPaywallEvent) -> Void,
337
+ eventHandler: @escaping (HeliumEvent) -> Void,
283
338
  purchaseHandler: @escaping (String) async -> HeliumPaywallTransactionStatus,
284
339
  restoreHandler: @escaping () async -> Bool
285
340
  ) {
@@ -296,43 +351,7 @@ fileprivate class InternalDelegate: HeliumPaywallDelegate {
296
351
  return await restoreHandler()
297
352
  }
298
353
 
299
- public func onHeliumPaywallEvent(event: HeliumPaywallEvent) {
354
+ func onPaywallEvent(_ event: any HeliumEvent) {
300
355
  eventHandler(event)
301
356
  }
302
357
  }
303
-
304
- fileprivate struct FallbackView: View {
305
- @Environment(\.presentationMode) var presentationMode
306
-
307
- var body: some View {
308
- VStack(spacing: 20) {
309
- Spacer()
310
-
311
- Text("Fallback Paywall")
312
- .font(.title)
313
- .fontWeight(.bold)
314
-
315
- Text("Something went wrong loading the paywall. Make sure you used the right trigger.")
316
- .font(.body)
317
- .multilineTextAlignment(.center)
318
- .foregroundColor(.secondary)
319
-
320
- Spacer()
321
-
322
- Button(action: {
323
- presentationMode.wrappedValue.dismiss()
324
- }) {
325
- Text("Close")
326
- .font(.headline)
327
- .foregroundColor(.white)
328
- .frame(maxWidth: .infinity)
329
- .padding()
330
- .background(Color.blue)
331
- .cornerRadius(10)
332
- }
333
- .padding(.horizontal, 40)
334
- .padding(.bottom, 40)
335
- }
336
- .padding()
337
- }
338
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-helium",
3
- "version": "0.8.5",
3
+ "version": "3.0.3",
4
4
  "description": "Helium paywalls expo sdk",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -7,11 +7,25 @@ export type OnLoadEventPayload = {
7
7
  export type HeliumPaywallSdkModuleEvents = {
8
8
  onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;
9
9
  onDelegateActionEvent: (params: DelegateActionEvent) => void;
10
+ paywallEventHandlers: (params: HeliumPaywallEvent) => void;
10
11
  };
11
12
  export type HeliumPaywallEvent = {
12
- type: string;
13
+ type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' |
14
+ 'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' |
15
+ 'productSelected' | 'purchasePressed' | 'purchaseSucceeded' |
16
+ 'purchaseCancelled' | 'purchaseFailed' | 'purchaseRestored' |
17
+ 'purchaseRestoreFailed' | 'purchasePending' | 'initializeStart' |
18
+ 'paywallsDownloadSuccess' | 'paywallsDownloadError' | 'paywallWebViewRendered';
13
19
  triggerName?: string;
20
+ paywallName?: string;
21
+ /**
22
+ * @deprecated Use `paywallName` instead.
23
+ */
14
24
  paywallTemplateName?: string;
25
+ productId?: string;
26
+ /**
27
+ * @deprecated Use `productId` instead.
28
+ */
15
29
  productKey?: string;
16
30
  ctaName?: string;
17
31
  configId?: string;
@@ -22,7 +36,16 @@ export type HeliumPaywallEvent = {
22
36
  fontsDownloadTimeTakenMS?: number;
23
37
  bundleDownloadTimeMS?: number;
24
38
  dismissAll?: boolean;
39
+ isSecondTry?: boolean;
40
+ error?: string;
41
+ /**
42
+ * @deprecated Use `error` instead.
43
+ */
25
44
  errorDescription?: string;
45
+ /**
46
+ * Unix timestamp in seconds
47
+ */
48
+ timestamp?: number;
26
49
  };
27
50
  export type DelegateActionEvent = {
28
51
  type: 'purchase' | 'restore';
@@ -65,6 +88,35 @@ export function createCustomPurchaseConfig(callbacks: {
65
88
  };
66
89
  }
67
90
 
91
+ export type TriggerLoadingConfig = {
92
+ /** Whether to show loading state for this trigger. Set to nil to use the global `useLoadingState` setting. */
93
+ useLoadingState?: boolean;
94
+ /** Maximum seconds to show loading for this trigger. Set to nil to use the global `loadingBudget` setting. */
95
+ loadingBudget?: number;
96
+ };
97
+
98
+ export type HeliumPaywallLoadingConfig = {
99
+ /**
100
+ * Whether to show a loading state while fetching paywall configuration.
101
+ * When true, shows a loading view for up to `loadingBudget` seconds before falling back.
102
+ * Default: true
103
+ */
104
+ useLoadingState?: boolean;
105
+ /**
106
+ * Maximum time (in seconds) to show the loading state before displaying fallback.
107
+ * After this timeout, the fallback view will be shown even if the paywall is still downloading.
108
+ * Default: 2.0 seconds
109
+ */
110
+ loadingBudget?: number;
111
+ /**
112
+ * Optional per-trigger loading configuration overrides.
113
+ * Use this to customize loading behavior for specific triggers.
114
+ * Keys are trigger names, values are TriggerLoadingConfig instances.
115
+ * Example: Disable loading for "onboarding" trigger while keeping it for others.
116
+ */
117
+ perTriggerLoadingConfig?: Record<string, TriggerLoadingConfig>;
118
+ };
119
+
68
120
  export interface HeliumConfig {
69
121
  /** Your Helium API Key */
70
122
  apiKey: string;
@@ -74,8 +126,10 @@ export interface HeliumConfig {
74
126
  onHeliumPaywallEvent: (event: HeliumPaywallEvent) => void; // Still mandatory
75
127
 
76
128
  // Optional configurations
129
+ /** Fallback bundle in the rare situation that paywall is not ready to be shown. Highly recommended. See docs at https://docs.tryhelium.com/guides/fallback-bundle#react-native */
77
130
  fallbackBundle?: object;
78
- triggers?: string[];
131
+ /** Configure loading behavior for paywalls that are mid-download. */
132
+ paywallLoadingConfig?: HeliumPaywallLoadingConfig;
79
133
  customUserId?: string;
80
134
  customAPIEndpoint?: string;
81
135
  customUserTraits?: Record<string, any>;
@@ -90,13 +144,61 @@ export interface NativeHeliumConfig {
90
144
  revenueCatAppUserId?: string;
91
145
  fallbackBundleUrlString?: string;
92
146
  fallbackBundleString?: string;
147
+ paywallLoadingConfig?: HeliumPaywallLoadingConfig;
93
148
  }
94
149
 
150
+ export type PresentUpsellParams = {
151
+ triggerName: string;
152
+ /** Optional. This will be called when paywall fails to show due to an unsuccessful paywall download or if an invalid trigger is provided. */
153
+ onFallback?: () => void;
154
+ eventHandlers?: PaywallEventHandlers;
155
+ customPaywallTraits?: Record<string, any>;
156
+ };
157
+
95
158
  export interface PaywallInfo {
96
159
  paywallTemplateName: string;
97
160
  shouldShow: boolean;
98
161
  }
99
162
 
163
+ // Event handler types for per-presentation event handling
164
+ export interface PaywallEventHandlers {
165
+ onOpen?: (event: PaywallOpenEvent) => void;
166
+ onClose?: (event: PaywallCloseEvent) => void;
167
+ onDismissed?: (event: PaywallDismissedEvent) => void;
168
+ onPurchaseSucceeded?: (event: PurchaseSucceededEvent) => void;
169
+ }
170
+
171
+ // Typed event interfaces
172
+ export interface PaywallOpenEvent {
173
+ type: 'paywallOpen';
174
+ triggerName: string;
175
+ paywallName: string;
176
+ isSecondTry: boolean;
177
+ viewType?: 'presented' | 'embedded' | 'triggered';
178
+ }
179
+
180
+ export interface PaywallCloseEvent {
181
+ type: 'paywallClose';
182
+ triggerName: string;
183
+ paywallName: string;
184
+ isSecondTry: boolean;
185
+ }
186
+
187
+ export interface PaywallDismissedEvent {
188
+ type: 'paywallDismissed';
189
+ triggerName: string;
190
+ paywallName: string;
191
+ isSecondTry: boolean;
192
+ }
193
+
194
+ export interface PurchaseSucceededEvent {
195
+ type: 'purchaseSucceeded';
196
+ productId: string;
197
+ triggerName: string;
198
+ paywallName: string;
199
+ isSecondTry: boolean;
200
+ }
201
+
100
202
  export const HELIUM_CTA_NAMES = {
101
203
  SCHEDULE_CALL: 'schedule_call',
102
204
  SUBSCRIBE_BUTTON: 'subscribe_button',
@@ -21,7 +21,10 @@ interface CanPresentUpsellResult {
21
21
  declare class HeliumPaywallSdkModule extends NativeModule<HeliumPaywallSdkModuleEvents> {
22
22
  initialize(config: NativeHeliumConfig): void;
23
23
 
24
- presentUpsell(triggerName: string): void;
24
+ presentUpsell(
25
+ triggerName: string,
26
+ customPaywallTraits?: Record<string, any>,
27
+ ): void;
25
28
 
26
29
  hideUpsell(): void;
27
30
 
package/src/index.ts CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  DelegateActionEvent,
3
3
  HeliumConfig,
4
4
  HeliumPaywallEvent,
5
- NativeHeliumConfig, PaywallInfo,
5
+ NativeHeliumConfig, PaywallEventHandlers, PaywallInfo, PresentUpsellParams,
6
6
  } from "./HeliumPaywallSdk.types";
7
7
  import HeliumPaywallSdkModule from "./HeliumPaywallSdkModule";
8
8
  import { EventSubscription } from 'expo-modules-core';
@@ -20,6 +20,10 @@ function addDelegateActionEventListener(listener: (event: DelegateActionEvent) =
20
20
  return HeliumPaywallSdkModule.addListener('onDelegateActionEvent', listener);
21
21
  }
22
22
 
23
+ function addPaywallEventHandlersListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {
24
+ return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);
25
+ }
26
+
23
27
  let isInitialized = false;
24
28
  export const initialize = (config: HeliumConfig) => {
25
29
  if (isInitialized) {
@@ -29,6 +33,7 @@ export const initialize = (config: HeliumConfig) => {
29
33
 
30
34
  HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');
31
35
  HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');
36
+ HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');
32
37
 
33
38
  // Set up listener for paywall events
34
39
  addHeliumPaywallEventListener((event) => {
@@ -61,6 +66,10 @@ export const initialize = (config: HeliumConfig) => {
61
66
  }
62
67
  });
63
68
 
69
+ addPaywallEventHandlersListener((event) => {
70
+ callPaywallEventHandlers(event);
71
+ });
72
+
64
73
  nativeInitializeAsync(config).catch(error => {
65
74
  console.error('[Helium] Initialization failed:', error);
66
75
  });
@@ -99,20 +108,22 @@ const nativeInitializeAsync = async (config: HeliumConfig) => {
99
108
  revenueCatAppUserId: config.revenueCatAppUserId,
100
109
  fallbackBundleUrlString: fallbackBundleUrlString,
101
110
  fallbackBundleString: fallbackBundleString,
111
+ paywallLoadingConfig: config.paywallLoadingConfig,
102
112
  };
103
113
 
104
114
  // Initialize the native module
105
115
  HeliumPaywallSdkModule.initialize(nativeConfig);
106
116
  };
107
117
 
118
+ let paywallEventHandlers: PaywallEventHandlers | undefined;
119
+ let presentOnFallback: (() => void) | undefined;
108
120
  export const presentUpsell = ({
109
121
  triggerName,
110
- onFallback
111
- }: {
112
- triggerName: string;
113
- onFallback?: () => void;
114
- }) => {
115
- const { canPresent, reason } = HeliumPaywallSdkModule.canPresentUpsell(triggerName);
122
+ onFallback,
123
+ eventHandlers,
124
+ customPaywallTraits,
125
+ }: PresentUpsellParams) => {
126
+ const {canPresent, reason} = HeliumPaywallSdkModule.canPresentUpsell(triggerName);
116
127
 
117
128
  if (!canPresent) {
118
129
  console.log(
@@ -124,14 +135,72 @@ export const presentUpsell = ({
124
135
  }
125
136
 
126
137
  try {
127
- HeliumPaywallSdkModule.presentUpsell(triggerName);
138
+ paywallEventHandlers = eventHandlers;
139
+ presentOnFallback = onFallback;
140
+ HeliumPaywallSdkModule.presentUpsell(triggerName, customPaywallTraits);
128
141
  } catch (error) {
129
142
  console.log('Helium present error', error);
143
+ paywallEventHandlers = undefined;
144
+ presentOnFallback = undefined;
130
145
  onFallback?.();
131
146
  HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');
132
147
  }
133
148
  };
134
149
 
150
+ function callPaywallEventHandlers(event: HeliumPaywallEvent) {
151
+ if (paywallEventHandlers) {
152
+ switch (event.type) {
153
+ case 'paywallOpen':
154
+ paywallEventHandlers?.onOpen?.({
155
+ type: 'paywallOpen',
156
+ triggerName: event.triggerName ?? 'unknown',
157
+ paywallName: event.paywallName ?? 'unknown',
158
+ isSecondTry: event.isSecondTry ?? false,
159
+ viewType: 'presented',
160
+ });
161
+ break;
162
+ case 'paywallClose':
163
+ paywallEventHandlers?.onClose?.({
164
+ type: 'paywallClose',
165
+ triggerName: event.triggerName ?? 'unknown',
166
+ paywallName: event.paywallName ?? 'unknown',
167
+ isSecondTry: event.isSecondTry ?? false,
168
+ });
169
+ if (!event.isSecondTry) {
170
+ paywallEventHandlers = undefined;
171
+ }
172
+ presentOnFallback = undefined;
173
+ break;
174
+ case 'paywallDismissed':
175
+ paywallEventHandlers?.onDismissed?.({
176
+ type: 'paywallDismissed',
177
+ triggerName: event.triggerName ?? 'unknown',
178
+ paywallName: event.paywallName ?? 'unknown',
179
+ isSecondTry: event.isSecondTry ?? false,
180
+ });
181
+ break;
182
+ case 'purchaseSucceeded':
183
+ paywallEventHandlers?.onPurchaseSucceeded?.({
184
+ type: 'purchaseSucceeded',
185
+ productId: event.productId ?? 'unknown',
186
+ triggerName: event.triggerName ?? 'unknown',
187
+ paywallName: event.paywallName ?? 'unknown',
188
+ isSecondTry: event.isSecondTry ?? false,
189
+ });
190
+ break;
191
+ case 'paywallSkipped':
192
+ paywallEventHandlers = undefined;
193
+ presentOnFallback = undefined;
194
+ break;
195
+ case 'paywallOpenFailed':
196
+ paywallEventHandlers = undefined;
197
+ presentOnFallback?.();
198
+ presentOnFallback = undefined;
199
+ break;
200
+ }
201
+ }
202
+ }
203
+
135
204
  export const hideUpsell = HeliumPaywallSdkModule.hideUpsell;
136
205
  export const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;
137
206
  export const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;
@@ -24,7 +24,6 @@ export class RevenueCatHeliumHandler {
24
24
  constructor(apiKey?: string) {
25
25
  if (apiKey) {
26
26
  Purchases.configure({ apiKey });
27
- } else {
28
27
  }
29
28
  this.initializePackageMapping();
30
29
  }