@adapty/capacitor 3.11.1-beta.0 → 3.15.0

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.
Files changed (93) hide show
  1. package/AdaptyCapacitor.podspec +3 -3
  2. package/Package.swift +1 -1
  3. package/README.md +45 -29
  4. package/android/build.gradle +4 -3
  5. package/android/src/main/kotlin/com/adapty/plugin/capacitor/AdaptyCapacitorImplementation.kt +2 -0
  6. package/dist/esm/adapty.d.ts +752 -6
  7. package/dist/esm/adapty.js +755 -8
  8. package/dist/esm/adapty.js.map +1 -1
  9. package/dist/esm/index.d.ts +2 -1
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/shared/coders/adapty-configuration.js +25 -14
  12. package/dist/esm/shared/coders/adapty-configuration.js.map +1 -1
  13. package/dist/esm/shared/coders/adapty-identify-params.d.ts +11 -0
  14. package/dist/esm/shared/coders/adapty-identify-params.js +19 -0
  15. package/dist/esm/shared/coders/adapty-identify-params.js.map +1 -0
  16. package/dist/esm/shared/coders/adapty-paywall-product.d.ts +1 -1
  17. package/dist/esm/shared/coders/adapty-paywall-product.js +12 -0
  18. package/dist/esm/shared/coders/adapty-paywall-product.js.map +1 -1
  19. package/dist/esm/shared/coders/adapty-purchase-params.js +0 -8
  20. package/dist/esm/shared/coders/adapty-purchase-params.js.map +1 -1
  21. package/dist/esm/shared/coders/adapty-purchase-result.js +18 -2
  22. package/dist/esm/shared/coders/adapty-purchase-result.js.map +1 -1
  23. package/dist/esm/shared/coders/adapty-ui-create-onboarding-view-params.d.ts +8 -0
  24. package/dist/esm/shared/coders/adapty-ui-create-onboarding-view-params.js +10 -0
  25. package/dist/esm/shared/coders/adapty-ui-create-onboarding-view-params.js.map +1 -0
  26. package/dist/esm/shared/coders/adapty-ui-create-paywall-view-params.d.ts +18 -0
  27. package/dist/esm/shared/coders/adapty-ui-create-paywall-view-params.js +142 -0
  28. package/dist/esm/shared/coders/adapty-ui-create-paywall-view-params.js.map +1 -0
  29. package/dist/esm/shared/coders/parse-onboarding.d.ts +3 -0
  30. package/dist/esm/shared/coders/parse-onboarding.js +86 -0
  31. package/dist/esm/shared/coders/parse-onboarding.js.map +1 -0
  32. package/dist/esm/shared/coders/parse-paywall.d.ts +4 -0
  33. package/dist/esm/shared/coders/parse-paywall.js +141 -0
  34. package/dist/esm/shared/coders/parse-paywall.js.map +1 -0
  35. package/dist/esm/shared/coders/parse.d.ts +0 -2
  36. package/dist/esm/shared/coders/parse.js +0 -75
  37. package/dist/esm/shared/coders/parse.js.map +1 -1
  38. package/dist/esm/shared/coders/product-reference.js +10 -0
  39. package/dist/esm/shared/coders/product-reference.js.map +1 -1
  40. package/dist/esm/shared/coders/utils.d.ts +18 -0
  41. package/dist/esm/shared/coders/utils.js +50 -0
  42. package/dist/esm/shared/coders/utils.js.map +1 -0
  43. package/dist/esm/shared/types/index.d.ts +16 -0
  44. package/dist/esm/shared/types/index.js +5 -0
  45. package/dist/esm/shared/types/index.js.map +1 -1
  46. package/dist/esm/shared/types/inputs.d.ts +47 -14
  47. package/dist/esm/shared/types/inputs.js.map +1 -1
  48. package/dist/esm/shared/types/onboarding-events.d.ts +60 -0
  49. package/dist/esm/shared/types/onboarding-events.js +11 -0
  50. package/dist/esm/shared/types/onboarding-events.js.map +1 -0
  51. package/dist/esm/shared/types/paywall-events.d.ts +84 -0
  52. package/dist/esm/shared/types/paywall-events.js +16 -0
  53. package/dist/esm/shared/types/paywall-events.js.map +1 -0
  54. package/dist/esm/shared/utils/platform.d.ts +2 -0
  55. package/dist/esm/shared/utils/platform.js +5 -0
  56. package/dist/esm/shared/utils/platform.js.map +1 -0
  57. package/dist/esm/types/adapty-plugin.d.ts +2 -1
  58. package/dist/esm/types/adapty-plugin.js.map +1 -1
  59. package/dist/esm/ui-builder/base-view-emitter.d.ts +14 -20
  60. package/dist/esm/ui-builder/base-view-emitter.js +95 -73
  61. package/dist/esm/ui-builder/base-view-emitter.js.map +1 -1
  62. package/dist/esm/ui-builder/create-onboarding-view.d.ts +32 -0
  63. package/dist/esm/ui-builder/create-onboarding-view.js +36 -0
  64. package/dist/esm/ui-builder/create-onboarding-view.js.map +1 -0
  65. package/dist/esm/ui-builder/create-paywall-view.d.ts +25 -0
  66. package/dist/esm/ui-builder/create-paywall-view.js +29 -0
  67. package/dist/esm/ui-builder/create-paywall-view.js.map +1 -0
  68. package/dist/esm/ui-builder/index.d.ts +6 -37
  69. package/dist/esm/ui-builder/index.js +4 -41
  70. package/dist/esm/ui-builder/index.js.map +1 -1
  71. package/dist/esm/ui-builder/onboarding-view-controller.d.ts +103 -17
  72. package/dist/esm/ui-builder/onboarding-view-controller.js +112 -22
  73. package/dist/esm/ui-builder/onboarding-view-controller.js.map +1 -1
  74. package/dist/esm/ui-builder/onboarding-view-emitter.d.ts +10 -24
  75. package/dist/esm/ui-builder/onboarding-view-emitter.js +49 -56
  76. package/dist/esm/ui-builder/onboarding-view-emitter.js.map +1 -1
  77. package/dist/esm/ui-builder/paywall-view-controller.d.ts +130 -30
  78. package/dist/esm/ui-builder/paywall-view-controller.js +141 -71
  79. package/dist/esm/ui-builder/paywall-view-controller.js.map +1 -1
  80. package/dist/esm/ui-builder/paywall-view-emitter.d.ts +8 -28
  81. package/dist/esm/ui-builder/paywall-view-emitter.js +86 -118
  82. package/dist/esm/ui-builder/paywall-view-emitter.js.map +1 -1
  83. package/dist/esm/ui-builder/types.d.ts +89 -4
  84. package/dist/esm/ui-builder/types.js +3 -3
  85. package/dist/esm/ui-builder/types.js.map +1 -1
  86. package/dist/esm/version.d.ts +1 -1
  87. package/dist/esm/version.js +1 -1
  88. package/dist/esm/version.js.map +1 -1
  89. package/dist/plugin.cjs.js +1896 -556
  90. package/dist/plugin.cjs.js.map +1 -1
  91. package/dist/plugin.js +1896 -556
  92. package/dist/plugin.js.map +1 -1
  93. package/package.json +2 -2
@@ -1,38 +1,7 @@
1
- import type { AdaptyOnboarding, AdaptyPaywall } from '../shared/types';
2
- import { OnboardingViewController } from './onboarding-view-controller';
3
- import { PaywallViewController } from './paywall-view-controller';
4
- import type { CreatePaywallViewParamsInput } from './types';
5
- export { PaywallViewController, OnboardingViewController };
6
- export type { CreatePaywallViewParamsInput };
7
- export type { AdaptyUiView, AdaptyUiDialogConfig, AdaptyUiDialogActionType, EventHandlers } from './types';
1
+ export { PaywallViewController } from './paywall-view-controller';
2
+ export { OnboardingViewController } from './onboarding-view-controller';
3
+ export type { CreatePaywallViewParamsInput, CreateOnboardingViewParamsInput } from './types';
4
+ export type { AdaptyCustomAsset, AdaptyUiView, AdaptyUiDialogConfig, AdaptyUiDialogActionType, AdaptyIOSPresentationStyle, EventHandlers, } from './types';
8
5
  export type { OnboardingEventHandlers } from './types';
9
- /**
10
- * Creates a paywall view controller.
11
- * You can use it to further configure a view or present it.
12
- *
13
- * @see {@link https://adapty.io/docs/capacitor-present-paywalls | [DOC] Creating a paywall view}
14
- *
15
- * @param {AdaptyPaywall} paywall - paywall that you want to present.
16
- * @param {CreatePaywallViewParamsInput | undefined} [params] - additional params.
17
- * @returns {Promise<PaywallViewController>} ViewController — A promise that resolves to a ViewController instance.
18
- *
19
- * @example
20
- * ```ts
21
- * const paywall = await adapty.getPaywall("MY_PAYWALL");
22
- * const view = await createPaywallView(paywall);
23
- * view.present();
24
- * ```
25
- *
26
- * @throws {AdaptyError} — If paywall is not found,
27
- * does not have a no-code view configured
28
- * or if there is an error while creating a view.
29
- */
30
- export declare function createPaywallView(paywall: AdaptyPaywall, params?: CreatePaywallViewParamsInput): Promise<PaywallViewController>;
31
- /**
32
- * Creates an onboarding view controller.
33
- * You can use it to further configure a view or present it.
34
- *
35
- * @param {AdaptyOnboarding} onboarding - onboarding that you want to present.
36
- * @returns {Promise<OnboardingViewController>} ViewController — A promise that resolves to a ViewController instance.
37
- */
38
- export declare function createOnboardingView(onboarding: AdaptyOnboarding): Promise<OnboardingViewController>;
6
+ export { createPaywallView } from './create-paywall-view';
7
+ export { createOnboardingView } from './create-onboarding-view';
@@ -1,43 +1,6 @@
1
- import { Adapty } from '../adapty';
2
- import { OnboardingViewController } from './onboarding-view-controller';
3
- import { PaywallViewController } from './paywall-view-controller';
4
- const adaptyPlugin = new Adapty();
5
1
  // Export UI types and classes for convenience
6
- export { PaywallViewController, OnboardingViewController };
7
- /**
8
- * Creates a paywall view controller.
9
- * You can use it to further configure a view or present it.
10
- *
11
- * @see {@link https://adapty.io/docs/capacitor-present-paywalls | [DOC] Creating a paywall view}
12
- *
13
- * @param {AdaptyPaywall} paywall - paywall that you want to present.
14
- * @param {CreatePaywallViewParamsInput | undefined} [params] - additional params.
15
- * @returns {Promise<PaywallViewController>} ViewController — A promise that resolves to a ViewController instance.
16
- *
17
- * @example
18
- * ```ts
19
- * const paywall = await adapty.getPaywall("MY_PAYWALL");
20
- * const view = await createPaywallView(paywall);
21
- * view.present();
22
- * ```
23
- *
24
- * @throws {AdaptyError} — If paywall is not found,
25
- * does not have a no-code view configured
26
- * or if there is an error while creating a view.
27
- */
28
- export async function createPaywallView(paywall, params = {}) {
29
- const controller = await PaywallViewController.create(paywall, params, adaptyPlugin);
30
- return controller;
31
- }
32
- /**
33
- * Creates an onboarding view controller.
34
- * You can use it to further configure a view or present it.
35
- *
36
- * @param {AdaptyOnboarding} onboarding - onboarding that you want to present.
37
- * @returns {Promise<OnboardingViewController>} ViewController — A promise that resolves to a ViewController instance.
38
- */
39
- export async function createOnboardingView(onboarding) {
40
- const controller = await OnboardingViewController.create(onboarding, adaptyPlugin);
41
- return controller;
42
- }
2
+ export { PaywallViewController } from './paywall-view-controller';
3
+ export { OnboardingViewController } from './onboarding-view-controller';
4
+ export { createPaywallView } from './create-paywall-view';
5
+ export { createOnboardingView } from './create-onboarding-view';
43
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui-builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,MAAM,YAAY,GAAG,IAAI,MAAM,EAAE,CAAC;AAElC,8CAA8C;AAC9C,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,CAAC;AAK3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAsB,EACtB,SAAuC,EAAE;IAEzC,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAErF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAA4B;IACrE,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACnF,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { Adapty } from '../adapty';\nimport type { AdaptyOnboarding, AdaptyPaywall } from '../shared/types';\n\nimport { OnboardingViewController } from './onboarding-view-controller';\nimport { PaywallViewController } from './paywall-view-controller';\nimport type { CreatePaywallViewParamsInput } from './types';\n\nconst adaptyPlugin = new Adapty();\n\n// Export UI types and classes for convenience\nexport { PaywallViewController, OnboardingViewController };\nexport type { CreatePaywallViewParamsInput };\nexport type { AdaptyUiView, AdaptyUiDialogConfig, AdaptyUiDialogActionType, EventHandlers } from './types';\nexport type { OnboardingEventHandlers } from './types';\n\n/**\n * Creates a paywall view controller.\n * You can use it to further configure a view or present it.\n *\n * @see {@link https://adapty.io/docs/capacitor-present-paywalls | [DOC] Creating a paywall view}\n *\n * @param {AdaptyPaywall} paywall - paywall that you want to present.\n * @param {CreatePaywallViewParamsInput | undefined} [params] - additional params.\n * @returns {Promise<PaywallViewController>} ViewController — A promise that resolves to a ViewController instance.\n *\n * @example\n * ```ts\n * const paywall = await adapty.getPaywall(\"MY_PAYWALL\");\n * const view = await createPaywallView(paywall);\n * view.present();\n * ```\n *\n * @throws {AdaptyError} If paywall is not found,\n * does not have a no-code view configured\n * or if there is an error while creating a view.\n */\nexport async function createPaywallView(\n paywall: AdaptyPaywall,\n params: CreatePaywallViewParamsInput = {},\n): Promise<PaywallViewController> {\n const controller = await PaywallViewController.create(paywall, params, adaptyPlugin);\n\n return controller;\n}\n\n/**\n * Creates an onboarding view controller.\n * You can use it to further configure a view or present it.\n *\n * @param {AdaptyOnboarding} onboarding - onboarding that you want to present.\n * @returns {Promise<OnboardingViewController>} ViewController — A promise that resolves to a ViewController instance.\n */\nexport async function createOnboardingView(onboarding: AdaptyOnboarding): Promise<OnboardingViewController> {\n const controller = await OnboardingViewController.create(onboarding, adaptyPlugin);\n return controller;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui-builder/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAYxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["// Export UI types and classes for convenience\nexport { PaywallViewController } from './paywall-view-controller';\nexport { OnboardingViewController } from './onboarding-view-controller';\nexport type { CreatePaywallViewParamsInput, CreateOnboardingViewParamsInput } from './types';\nexport type {\n AdaptyCustomAsset,\n AdaptyUiView,\n AdaptyUiDialogConfig,\n AdaptyUiDialogActionType,\n AdaptyIOSPresentationStyle,\n EventHandlers,\n} from './types';\nexport type { OnboardingEventHandlers } from './types';\n\nexport { createPaywallView } from './create-paywall-view';\nexport { createOnboardingView } from './create-onboarding-view';\n"]}
@@ -1,8 +1,15 @@
1
1
  import type { Adapty } from '../adapty';
2
2
  import type { AdaptyOnboarding } from '../shared/types';
3
- import type { OnboardingEventHandlers } from './types';
3
+ import type { OnboardingEventHandlers, AdaptyIOSPresentationStyle, CreateOnboardingViewParamsInput } from './types';
4
+ export declare const DEFAULT_ONBOARDING_PARAMS: CreateOnboardingViewParamsInput;
4
5
  /**
5
- * Provides methods to control created onboarding view
6
+ * Controller for managing onboarding views.
7
+ *
8
+ * @remarks
9
+ * This class provides methods to present, dismiss, and handle events for onboarding views
10
+ * created with the Onboarding Builder. Create instances using the {@link createOnboardingView} function
11
+ * rather than directly constructing this class.
12
+ *
6
13
  * @public
7
14
  */
8
15
  export declare class OnboardingViewController {
@@ -15,7 +22,7 @@ export declare class OnboardingViewController {
15
22
  * and creates reference between native controller and JS instance
16
23
  * @internal
17
24
  */
18
- static create(onboarding: AdaptyOnboarding, adaptyPlugin: Adapty): Promise<OnboardingViewController>;
25
+ static create(onboarding: AdaptyOnboarding, adaptyPlugin: Adapty, params?: CreateOnboardingViewParamsInput): Promise<OnboardingViewController>;
19
26
  /**
20
27
  * Since constructors in JS cannot be async, it is not
21
28
  * preferred to create ViewControllers in direct way.
@@ -25,44 +32,123 @@ export declare class OnboardingViewController {
25
32
  */
26
33
  private constructor();
27
34
  /**
28
- * Presents an onboarding view as a full-screen modal
35
+ * Presents the onboarding view as a modal screen.
29
36
  *
30
37
  * @remarks
31
- * Calling `present` upon already visible onboarding view
32
- * would result in an error
38
+ * Calling `present` on an already visible onboarding view will result in an error.
39
+ * The onboarding will be displayed with the configured presentation style on iOS.
40
+ * On Android, the onboarding is always presented as a full-screen activity.
33
41
  *
34
- * @throws {AdaptyError}
42
+ * @param options - Optional presentation options
43
+ * @param options.iosPresentationStyle - iOS presentation style. Available options: `'full_screen'` (default) or `'page_sheet'`. Only affects iOS platform.
44
+ * @returns A promise that resolves when the onboarding is presented.
45
+ * @throws {@link AdaptyError} if the view reference is invalid or the view is already presented.
46
+ *
47
+ * @example
48
+ * Present with default full-screen style
49
+ * ```typescript
50
+ * import { adapty, createOnboardingView } from '@adapty/capacitor';
51
+ *
52
+ * const onboarding = await adapty.getOnboarding({ placementId: 'YOUR_PLACEMENT_ID' });
53
+ * const view = await createOnboardingView(onboarding);
54
+ * await view.present();
55
+ * ```
56
+ *
57
+ * @example
58
+ * Present with page sheet style on iOS
59
+ * ```typescript
60
+ * await view.present({ iosPresentationStyle: 'page_sheet' });
61
+ * ```
35
62
  */
36
- present(): Promise<void>;
63
+ present(options?: {
64
+ iosPresentationStyle?: AdaptyIOSPresentationStyle;
65
+ }): Promise<void>;
37
66
  /**
38
- * Dismisses an onboarding view
67
+ * Dismisses the onboarding view.
68
+ *
69
+ * @remarks
70
+ * This method closes the onboarding and cleans up associated resources.
71
+ * After dismissing, the view controller instance cannot be reused.
72
+ *
73
+ * @returns A promise that resolves when the onboarding is dismissed.
74
+ * @throws {@link AdaptyError} if the view reference is invalid.
39
75
  *
40
- * @throws {AdaptyError}
76
+ * @example
77
+ * ```typescript
78
+ * import { createOnboardingView } from '@adapty/capacitor';
79
+ *
80
+ * const view = await createOnboardingView(onboarding);
81
+ * await view.present();
82
+ * // ... later
83
+ * await view.dismiss();
84
+ * ```
41
85
  */
42
86
  dismiss(): Promise<void>;
43
87
  private onRequestClose;
44
88
  /**
45
- * Register event handlers for UI events
89
+ * Registers event handlers for onboarding UI events.
46
90
  *
47
91
  * @remarks
48
92
  * Each event type can have only one handler — new handlers replace existing ones.
49
- * Default handlers are registered in {@link OnboardingViewController.create} and provide standard closing behavior:
50
- * - `onClose`
93
+ * Default handlers are registered automatically in {@link createOnboardingView} and provide standard closing behavior:
94
+ * - `onClose` - closes the onboarding when the close button is pressed or system back is used
51
95
  *
96
+ * If you want to override the `onClose` listener, we strongly recommend returning `true`
97
+ * from your custom listener to retain default closing behavior.
52
98
  *
53
99
  * Calling this method multiple times will replace previously registered handlers for provided events.
54
100
  *
55
- * @param {Partial<OnboardingEventHandlers>} eventHandlers - set of event handling callbacks
56
- * @returns {() => void} unsubscribe - function to unsubscribe all listeners
101
+ * @see {@link https://adapty.io/docs/capacitor-handling-onboarding-events | Handling Onboarding Events}
102
+ *
103
+ * @param eventHandlers - Set of event handling callbacks. Only provided handlers will be registered or updated.
104
+ * @returns A promise that resolves to an unsubscribe function that removes all registered listeners.
105
+ *
106
+ * @example
107
+ * Register custom event handlers
108
+ * ```typescript
109
+ * import { createOnboardingView } from '@adapty/capacitor';
110
+ *
111
+ * const view = await createOnboardingView(onboarding);
112
+ *
113
+ * const unsubscribe = await view.setEventHandlers({
114
+ * onClose: () => {
115
+ * console.log('Onboarding closed');
116
+ * // Return true to keep default closing behavior
117
+ * return true;
118
+ * },
119
+ * onActionPerformed: (action) => {
120
+ * console.log('Action performed:', action.name);
121
+ * },
122
+ * onProductSelected: (product) => {
123
+ * console.log('Product selected:', product.vendorProductId);
124
+ * }
125
+ * });
126
+ *
127
+ * await view.present();
128
+ *
129
+ * // Later, unsubscribe all handlers
130
+ * unsubscribe();
131
+ * ```
57
132
  */
58
133
  setEventHandlers(eventHandlers?: Partial<OnboardingEventHandlers>): Promise<() => void>;
59
134
  /**
60
- * Clears all registered event handlers
135
+ * Clears all registered event handlers.
61
136
  *
62
137
  * @remarks
63
138
  * This method removes all previously registered event handlers.
64
139
  * After calling this method, no event handlers will be active
65
- * until you call `setEventHandlers` again.
140
+ * until you call {@link setEventHandlers} again.
141
+ *
142
+ * Use this after dismiss to remove all event handlers.
143
+ *
144
+ * @example
145
+ * ```typescript
146
+ * const view = await createOnboardingView(onboarding);
147
+ * await view.setEventHandlers({ onClose: handleClose });
148
+ *
149
+ * // Later, clear all handlers
150
+ * view.clearEventHandlers();
151
+ * ```
66
152
  */
67
153
  clearEventHandlers(): void;
68
154
  }
@@ -1,12 +1,23 @@
1
1
  import { AdaptyError } from '../shared/adapty-error';
2
2
  import { AdaptyOnboardingCoder } from '../shared/coders/adapty-onboarding';
3
+ import { AdaptyUICreateOnboardingViewParamsCoder } from '../shared/coders/adapty-ui-create-onboarding-view-params';
3
4
  import { LogContext, Log } from '../shared/logger';
5
+ import { WebPresentation } from '../shared/types';
4
6
  import { mapValues } from '../shared/utils/map-values';
5
7
  import { withErrorContext } from '../shared/utils/with-error-context';
6
8
  import { OnboardingViewEmitter } from './onboarding-view-emitter';
7
9
  import { DEFAULT_ONBOARDING_EVENT_HANDLERS } from './types';
10
+ export const DEFAULT_ONBOARDING_PARAMS = {
11
+ externalUrlsPresentation: WebPresentation.BrowserInApp,
12
+ };
8
13
  /**
9
- * Provides methods to control created onboarding view
14
+ * Controller for managing onboarding views.
15
+ *
16
+ * @remarks
17
+ * This class provides methods to present, dismiss, and handle events for onboarding views
18
+ * created with the Onboarding Builder. Create instances using the {@link createOnboardingView} function
19
+ * rather than directly constructing this class.
20
+ *
10
21
  * @public
11
22
  */
12
23
  export class OnboardingViewController {
@@ -16,17 +27,16 @@ export class OnboardingViewController {
16
27
  * and creates reference between native controller and JS instance
17
28
  * @internal
18
29
  */
19
- static async create(onboarding, adaptyPlugin) {
30
+ static async create(onboarding, adaptyPlugin, params = {}) {
20
31
  const controller = new OnboardingViewController(adaptyPlugin);
21
32
  const ctx = new LogContext();
22
33
  const methodKey = 'adapty_ui_create_onboarding_view';
23
34
  const log = ctx.call({ methodName: methodKey });
24
- log.start(() => ({ onboarding }));
35
+ log.start(() => ({ onboarding, params }));
25
36
  const coder = new AdaptyOnboardingCoder();
26
- const data = {
27
- method: methodKey,
28
- onboarding: coder.encode(onboarding),
29
- };
37
+ const paramsWithDefaults = Object.assign(Object.assign({}, DEFAULT_ONBOARDING_PARAMS), params);
38
+ const encodedParams = new AdaptyUICreateOnboardingViewParamsCoder().encode(paramsWithDefaults);
39
+ const data = Object.assign({ method: methodKey, onboarding: coder.encode(onboarding) }, encodedParams);
30
40
  const result = (await controller.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log));
31
41
  controller.id = result.id;
32
42
  await controller.setEventHandlers(DEFAULT_ONBOARDING_EVENT_HANDLERS);
@@ -53,32 +63,69 @@ export class OnboardingViewController {
53
63
  this.adaptyPlugin = adaptyPlugin;
54
64
  }
55
65
  /**
56
- * Presents an onboarding view as a full-screen modal
66
+ * Presents the onboarding view as a modal screen.
57
67
  *
58
68
  * @remarks
59
- * Calling `present` upon already visible onboarding view
60
- * would result in an error
69
+ * Calling `present` on an already visible onboarding view will result in an error.
70
+ * The onboarding will be displayed with the configured presentation style on iOS.
71
+ * On Android, the onboarding is always presented as a full-screen activity.
72
+ *
73
+ * @param options - Optional presentation options
74
+ * @param options.iosPresentationStyle - iOS presentation style. Available options: `'full_screen'` (default) or `'page_sheet'`. Only affects iOS platform.
75
+ * @returns A promise that resolves when the onboarding is presented.
76
+ * @throws {@link AdaptyError} if the view reference is invalid or the view is already presented.
77
+ *
78
+ * @example
79
+ * Present with default full-screen style
80
+ * ```typescript
81
+ * import { adapty, createOnboardingView } from '@adapty/capacitor';
82
+ *
83
+ * const onboarding = await adapty.getOnboarding({ placementId: 'YOUR_PLACEMENT_ID' });
84
+ * const view = await createOnboardingView(onboarding);
85
+ * await view.present();
86
+ * ```
61
87
  *
62
- * @throws {AdaptyError}
88
+ * @example
89
+ * Present with page sheet style on iOS
90
+ * ```typescript
91
+ * await view.present({ iosPresentationStyle: 'page_sheet' });
92
+ * ```
63
93
  */
64
- async present() {
94
+ async present(options = {}) {
95
+ var _a;
65
96
  const ctx = new LogContext();
66
97
  const methodKey = 'adapty_ui_present_onboarding_view';
67
98
  const log = ctx.call({ methodName: methodKey });
68
- log.start(() => ({ _id: this.id }));
99
+ log.start(() => ({ _id: this.id, iosPresentationStyle: options.iosPresentationStyle }));
69
100
  if (this.id === null) {
70
101
  throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });
71
102
  }
72
103
  const data = {
73
104
  method: methodKey,
74
105
  id: this.id,
106
+ ios_presentation_style: (_a = options.iosPresentationStyle) !== null && _a !== void 0 ? _a : 'full_screen',
75
107
  };
76
108
  await this.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log);
77
109
  }
78
110
  /**
79
- * Dismisses an onboarding view
111
+ * Dismisses the onboarding view.
112
+ *
113
+ * @remarks
114
+ * This method closes the onboarding and cleans up associated resources.
115
+ * After dismissing, the view controller instance cannot be reused.
116
+ *
117
+ * @returns A promise that resolves when the onboarding is dismissed.
118
+ * @throws {@link AdaptyError} if the view reference is invalid.
80
119
  *
81
- * @throws {AdaptyError}
120
+ * @example
121
+ * ```typescript
122
+ * import { createOnboardingView } from '@adapty/capacitor';
123
+ *
124
+ * const view = await createOnboardingView(onboarding);
125
+ * await view.present();
126
+ * // ... later
127
+ * await view.dismiss();
128
+ * ```
82
129
  */
83
130
  async dismiss() {
84
131
  const ctx = new LogContext();
@@ -94,20 +141,52 @@ export class OnboardingViewController {
94
141
  destroy: true,
95
142
  };
96
143
  await this.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log);
144
+ this.clearEventHandlers();
97
145
  }
98
146
  /**
99
- * Register event handlers for UI events
147
+ * Registers event handlers for onboarding UI events.
100
148
  *
101
149
  * @remarks
102
150
  * Each event type can have only one handler — new handlers replace existing ones.
103
- * Default handlers are registered in {@link OnboardingViewController.create} and provide standard closing behavior:
104
- * - `onClose`
151
+ * Default handlers are registered automatically in {@link createOnboardingView} and provide standard closing behavior:
152
+ * - `onClose` - closes the onboarding when the close button is pressed or system back is used
105
153
  *
154
+ * If you want to override the `onClose` listener, we strongly recommend returning `true`
155
+ * from your custom listener to retain default closing behavior.
106
156
  *
107
157
  * Calling this method multiple times will replace previously registered handlers for provided events.
108
158
  *
109
- * @param {Partial<OnboardingEventHandlers>} eventHandlers - set of event handling callbacks
110
- * @returns {() => void} unsubscribe - function to unsubscribe all listeners
159
+ * @see {@link https://adapty.io/docs/capacitor-handling-onboarding-events | Handling Onboarding Events}
160
+ *
161
+ * @param eventHandlers - Set of event handling callbacks. Only provided handlers will be registered or updated.
162
+ * @returns A promise that resolves to an unsubscribe function that removes all registered listeners.
163
+ *
164
+ * @example
165
+ * Register custom event handlers
166
+ * ```typescript
167
+ * import { createOnboardingView } from '@adapty/capacitor';
168
+ *
169
+ * const view = await createOnboardingView(onboarding);
170
+ *
171
+ * const unsubscribe = await view.setEventHandlers({
172
+ * onClose: () => {
173
+ * console.log('Onboarding closed');
174
+ * // Return true to keep default closing behavior
175
+ * return true;
176
+ * },
177
+ * onActionPerformed: (action) => {
178
+ * console.log('Action performed:', action.name);
179
+ * },
180
+ * onProductSelected: (product) => {
181
+ * console.log('Product selected:', product.vendorProductId);
182
+ * }
183
+ * });
184
+ *
185
+ * await view.present();
186
+ *
187
+ * // Later, unsubscribe all handlers
188
+ * unsubscribe();
189
+ * ```
111
190
  */
112
191
  async setEventHandlers(eventHandlers = {}) {
113
192
  var _a;
@@ -146,12 +225,23 @@ export class OnboardingViewController {
146
225
  return unsubscribe;
147
226
  }
148
227
  /**
149
- * Clears all registered event handlers
228
+ * Clears all registered event handlers.
150
229
  *
151
230
  * @remarks
152
231
  * This method removes all previously registered event handlers.
153
232
  * After calling this method, no event handlers will be active
154
- * until you call `setEventHandlers` again.
233
+ * until you call {@link setEventHandlers} again.
234
+ *
235
+ * Use this after dismiss to remove all event handlers.
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * const view = await createOnboardingView(onboarding);
240
+ * await view.setEventHandlers({ onClose: handleClose });
241
+ *
242
+ * // Later, clear all handlers
243
+ * view.clearEventHandlers();
244
+ * ```
155
245
  */
156
246
  clearEventHandlers() {
157
247
  Log.info('clearEventHandlers', () => 'Clearing all onboarding event handlers for view', () => ({ id: this.id }));
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding-view-controller.js","sourceRoot":"","sources":["../../../src/ui-builder/onboarding-view-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Adapty } from '../adapty';\nimport { AdaptyError } from '../shared/adapty-error';\nimport { AdaptyOnboardingCoder } from '../shared/coders/adapty-onboarding';\nimport { LogContext, Log } from '../shared/logger';\nimport type { AdaptyOnboarding } from '../shared/types';\nimport type { components } from '../shared/types/api';\nimport { mapValues } from '../shared/utils/map-values';\nimport { withErrorContext } from '../shared/utils/with-error-context';\n\nimport { OnboardingViewEmitter } from './onboarding-view-emitter';\nimport { DEFAULT_ONBOARDING_EVENT_HANDLERS } from './types';\nimport type { AdaptyUiView, OnboardingEventHandlers } from './types';\n\ntype Req = components['requests'];\n\n/**\n * Provides methods to control created onboarding view\n * @public\n */\nexport class OnboardingViewController {\n private id: string | null = null;\n private adaptyPlugin: Adapty;\n private viewEmitter: OnboardingViewEmitter | null = null;\n\n /**\n * Intended way to create a OnboardingViewController instance.\n * It prepares a native controller to be presented\n * and creates reference between native controller and JS instance\n * @internal\n */\n static async create(onboarding: AdaptyOnboarding, adaptyPlugin: Adapty): Promise<OnboardingViewController> {\n const controller = new OnboardingViewController(adaptyPlugin);\n\n const ctx = new LogContext();\n const methodKey = 'adapty_ui_create_onboarding_view';\n const log = ctx.call({ methodName: methodKey });\n log.start(() => ({ onboarding }));\n\n const coder = new AdaptyOnboardingCoder();\n const data: Req['AdaptyUICreateOnboardingView.Request'] = {\n method: methodKey,\n onboarding: coder.encode(onboarding),\n };\n\n const result = (await controller.adaptyPlugin.handleMethodCall(\n methodKey,\n JSON.stringify(data),\n ctx,\n log,\n )) as AdaptyUiView;\n controller.id = result.id;\n\n await controller.setEventHandlers(DEFAULT_ONBOARDING_EVENT_HANDLERS);\n\n return controller;\n }\n\n /**\n * Since constructors in JS cannot be async, it is not\n * preferred to create ViewControllers in direct way.\n * Consider using @link{OnboardingViewController.create} instead\n *\n * @internal\n */\n private constructor(adaptyPlugin: Adapty) {\n this.adaptyPlugin = adaptyPlugin;\n }\n\n /**\n * Presents an onboarding view as a full-screen modal\n *\n * @remarks\n * Calling `present` upon already visible onboarding view\n * would result in an error\n *\n * @throws {AdaptyError}\n */\n public async present(): Promise<void> {\n const ctx = new LogContext();\n const methodKey = 'adapty_ui_present_onboarding_view';\n const log = ctx.call({ methodName: methodKey });\n log.start(() => ({ _id: this.id }));\n\n if (this.id === null) {\n throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });\n }\n\n const data: Req['AdaptyUIPresentOnboardingView.Request'] = {\n method: methodKey,\n id: this.id,\n };\n\n await this.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log);\n }\n\n /**\n * Dismisses an onboarding view\n *\n * @throws {AdaptyError}\n */\n public async dismiss(): Promise<void> {\n const ctx = new LogContext();\n const methodKey = 'adapty_ui_dismiss_onboarding_view';\n const log = ctx.call({ methodName: methodKey });\n log.start(() => ({ _id: this.id }));\n\n if (this.id === null) {\n throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });\n }\n\n const data: Req['AdaptyUIDismissOnboardingView.Request'] = {\n method: methodKey,\n id: this.id,\n destroy: true,\n };\n\n await this.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log);\n }\n\n private onRequestClose = async () => {\n try {\n await this.dismiss();\n } catch (error) {\n Log.warn(\n 'setEventHandlers',\n () => 'Failed to dismiss onboarding',\n () => ({ error }),\n );\n }\n };\n\n /**\n * Register event handlers for UI events\n *\n * @remarks\n * Each event type can have only one handler — new handlers replace existing ones.\n * Default handlers are registered in {@link OnboardingViewController.create} and provide standard closing behavior:\n * - `onClose`\n *\n *\n * Calling this method multiple times will replace previously registered handlers for provided events.\n *\n * @param {Partial<OnboardingEventHandlers>} eventHandlers - set of event handling callbacks\n * @returns {() => void} unsubscribe - function to unsubscribe all listeners\n */\n public async setEventHandlers(eventHandlers: Partial<OnboardingEventHandlers> = {}): Promise<() => void> {\n const ctx = new LogContext();\n const log = ctx.call({ methodName: 'setEventHandlers' });\n log.start(() => ({ _id: this.id }));\n\n if (this.id === null) {\n throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });\n }\n\n Log.verbose(\n 'setEventHandlers',\n () => 'Registering onboarding event handlers for view',\n () => ({ id: this.id }),\n );\n\n const viewEmitter = this.viewEmitter ?? new OnboardingViewEmitter(this.id);\n this.viewEmitter = viewEmitter;\n\n const wrappedErrorLogEventHandlers = mapValues(eventHandlers, (handler, eventName) =>\n handler && typeof handler === 'function'\n ? withErrorContext(handler, eventName as string, 'OnboardingViewController')\n : undefined,\n );\n\n // Merge with defaults to ensure default behavior is preserved after unsubscribe/resubscribe cycles\n const finalEventHandlers: Partial<OnboardingEventHandlers> = {\n ...DEFAULT_ONBOARDING_EVENT_HANDLERS,\n ...wrappedErrorLogEventHandlers,\n };\n\n for (const [eventName, handler] of Object.entries(finalEventHandlers)) {\n if (handler && typeof handler === 'function') {\n try {\n await viewEmitter.addListener(eventName as keyof OnboardingEventHandlers, handler, this.onRequestClose);\n Log.verbose(\n 'setEventHandlers',\n () => 'Registered onboarding handler',\n () => ({ eventName }),\n );\n } catch (error) {\n Log.error(\n 'setEventHandlers',\n () => `Failed to register onboarding handler for ${eventName}`,\n () => ({ error }),\n );\n }\n }\n }\n\n const unsubscribe = () => {\n Log.info(\n 'setEventHandlers',\n () => 'Unsubscribing onboarding event handlers for view',\n () => ({ id: this.id }),\n );\n if (this.viewEmitter) {\n this.viewEmitter.removeAllListeners();\n this.viewEmitter = null;\n }\n };\n\n return unsubscribe;\n }\n\n /**\n * Clears all registered event handlers\n *\n * @remarks\n * This method removes all previously registered event handlers.\n * After calling this method, no event handlers will be active\n * until you call `setEventHandlers` again.\n */\n public clearEventHandlers(): void {\n Log.info(\n 'clearEventHandlers',\n () => 'Clearing all onboarding event handlers for view',\n () => ({ id: this.id }),\n );\n\n if (this.viewEmitter) {\n this.viewEmitter.removeAllListeners();\n this.viewEmitter = null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"onboarding-view-controller.js","sourceRoot":"","sources":["../../../src/ui-builder/onboarding-view-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Adapty } from '../adapty';\nimport { AdaptyError } from '../shared/adapty-error';\nimport { AdaptyOnboardingCoder } from '../shared/coders/adapty-onboarding';\nimport { AdaptyUICreateOnboardingViewParamsCoder } from '../shared/coders/adapty-ui-create-onboarding-view-params';\nimport { LogContext, Log } from '../shared/logger';\nimport { WebPresentation } from '../shared/types';\nimport type { AdaptyOnboarding } from '../shared/types';\nimport type { components } from '../shared/types/api';\nimport { mapValues } from '../shared/utils/map-values';\nimport { withErrorContext } from '../shared/utils/with-error-context';\n\nimport { OnboardingViewEmitter } from './onboarding-view-emitter';\nimport { DEFAULT_ONBOARDING_EVENT_HANDLERS } from './types';\nimport type {\n AdaptyUiView,\n OnboardingEventHandlers,\n AdaptyIOSPresentationStyle,\n CreateOnboardingViewParamsInput,\n} from './types';\n\ntype Req = components['requests'];\n\nexport const DEFAULT_ONBOARDING_PARAMS: CreateOnboardingViewParamsInput = {\n externalUrlsPresentation: WebPresentation.BrowserInApp,\n};\n\n/**\n * Controller for managing onboarding views.\n *\n * @remarks\n * This class provides methods to present, dismiss, and handle events for onboarding views\n * created with the Onboarding Builder. Create instances using the {@link createOnboardingView} function\n * rather than directly constructing this class.\n *\n * @public\n */\nexport class OnboardingViewController {\n private id: string | null = null;\n private adaptyPlugin: Adapty;\n private viewEmitter: OnboardingViewEmitter | null = null;\n\n /**\n * Intended way to create a OnboardingViewController instance.\n * It prepares a native controller to be presented\n * and creates reference between native controller and JS instance\n * @internal\n */\n static async create(\n onboarding: AdaptyOnboarding,\n adaptyPlugin: Adapty,\n params: CreateOnboardingViewParamsInput = {},\n ): Promise<OnboardingViewController> {\n const controller = new OnboardingViewController(adaptyPlugin);\n\n const ctx = new LogContext();\n const methodKey = 'adapty_ui_create_onboarding_view';\n const log = ctx.call({ methodName: methodKey });\n log.start(() => ({ onboarding, params }));\n\n const coder = new AdaptyOnboardingCoder();\n const paramsWithDefaults = { ...DEFAULT_ONBOARDING_PARAMS, ...params };\n const encodedParams = new AdaptyUICreateOnboardingViewParamsCoder().encode(paramsWithDefaults);\n\n const data: Req['AdaptyUICreateOnboardingView.Request'] = {\n method: methodKey,\n onboarding: coder.encode(onboarding),\n ...encodedParams,\n };\n\n const result = (await controller.adaptyPlugin.handleMethodCall(\n methodKey,\n JSON.stringify(data),\n ctx,\n log,\n )) as AdaptyUiView;\n controller.id = result.id;\n\n await controller.setEventHandlers(DEFAULT_ONBOARDING_EVENT_HANDLERS);\n\n return controller;\n }\n\n /**\n * Since constructors in JS cannot be async, it is not\n * preferred to create ViewControllers in direct way.\n * Consider using @link{OnboardingViewController.create} instead\n *\n * @internal\n */\n private constructor(adaptyPlugin: Adapty) {\n this.adaptyPlugin = adaptyPlugin;\n }\n\n /**\n * Presents the onboarding view as a modal screen.\n *\n * @remarks\n * Calling `present` on an already visible onboarding view will result in an error.\n * The onboarding will be displayed with the configured presentation style on iOS.\n * On Android, the onboarding is always presented as a full-screen activity.\n *\n * @param options - Optional presentation options\n * @param options.iosPresentationStyle - iOS presentation style. Available options: `'full_screen'` (default) or `'page_sheet'`. Only affects iOS platform.\n * @returns A promise that resolves when the onboarding is presented.\n * @throws {@link AdaptyError} if the view reference is invalid or the view is already presented.\n *\n * @example\n * Present with default full-screen style\n * ```typescript\n * import { adapty, createOnboardingView } from '@adapty/capacitor';\n *\n * const onboarding = await adapty.getOnboarding({ placementId: 'YOUR_PLACEMENT_ID' });\n * const view = await createOnboardingView(onboarding);\n * await view.present();\n * ```\n *\n * @example\n * Present with page sheet style on iOS\n * ```typescript\n * await view.present({ iosPresentationStyle: 'page_sheet' });\n * ```\n */\n public async present(options: { iosPresentationStyle?: AdaptyIOSPresentationStyle } = {}): Promise<void> {\n const ctx = new LogContext();\n const methodKey = 'adapty_ui_present_onboarding_view';\n const log = ctx.call({ methodName: methodKey });\n log.start(() => ({ _id: this.id, iosPresentationStyle: options.iosPresentationStyle }));\n\n if (this.id === null) {\n throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });\n }\n\n const data: any = {\n method: methodKey,\n id: this.id,\n ios_presentation_style: options.iosPresentationStyle ?? 'full_screen',\n };\n\n await this.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log);\n }\n\n /**\n * Dismisses the onboarding view.\n *\n * @remarks\n * This method closes the onboarding and cleans up associated resources.\n * After dismissing, the view controller instance cannot be reused.\n *\n * @returns A promise that resolves when the onboarding is dismissed.\n * @throws {@link AdaptyError} if the view reference is invalid.\n *\n * @example\n * ```typescript\n * import { createOnboardingView } from '@adapty/capacitor';\n *\n * const view = await createOnboardingView(onboarding);\n * await view.present();\n * // ... later\n * await view.dismiss();\n * ```\n */\n public async dismiss(): Promise<void> {\n const ctx = new LogContext();\n const methodKey = 'adapty_ui_dismiss_onboarding_view';\n const log = ctx.call({ methodName: methodKey });\n log.start(() => ({ _id: this.id }));\n\n if (this.id === null) {\n throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });\n }\n\n const data: Req['AdaptyUIDismissOnboardingView.Request'] = {\n method: methodKey,\n id: this.id,\n destroy: true,\n };\n\n await this.adaptyPlugin.handleMethodCall(methodKey, JSON.stringify(data), ctx, log);\n this.clearEventHandlers();\n }\n\n private onRequestClose = async () => {\n try {\n await this.dismiss();\n } catch (error) {\n Log.warn(\n 'setEventHandlers',\n () => 'Failed to dismiss onboarding',\n () => ({ error }),\n );\n }\n };\n\n /**\n * Registers event handlers for onboarding UI events.\n *\n * @remarks\n * Each event type can have only one handler — new handlers replace existing ones.\n * Default handlers are registered automatically in {@link createOnboardingView} and provide standard closing behavior:\n * - `onClose` - closes the onboarding when the close button is pressed or system back is used\n *\n * If you want to override the `onClose` listener, we strongly recommend returning `true`\n * from your custom listener to retain default closing behavior.\n *\n * Calling this method multiple times will replace previously registered handlers for provided events.\n *\n * @see {@link https://adapty.io/docs/capacitor-handling-onboarding-events | Handling Onboarding Events}\n *\n * @param eventHandlers - Set of event handling callbacks. Only provided handlers will be registered or updated.\n * @returns A promise that resolves to an unsubscribe function that removes all registered listeners.\n *\n * @example\n * Register custom event handlers\n * ```typescript\n * import { createOnboardingView } from '@adapty/capacitor';\n *\n * const view = await createOnboardingView(onboarding);\n *\n * const unsubscribe = await view.setEventHandlers({\n * onClose: () => {\n * console.log('Onboarding closed');\n * // Return true to keep default closing behavior\n * return true;\n * },\n * onActionPerformed: (action) => {\n * console.log('Action performed:', action.name);\n * },\n * onProductSelected: (product) => {\n * console.log('Product selected:', product.vendorProductId);\n * }\n * });\n *\n * await view.present();\n *\n * // Later, unsubscribe all handlers\n * unsubscribe();\n * ```\n */\n public async setEventHandlers(eventHandlers: Partial<OnboardingEventHandlers> = {}): Promise<() => void> {\n const ctx = new LogContext();\n const log = ctx.call({ methodName: 'setEventHandlers' });\n log.start(() => ({ _id: this.id }));\n\n if (this.id === null) {\n throw new AdaptyError({ adaptyCode: 2002, message: 'No view reference' });\n }\n\n Log.verbose(\n 'setEventHandlers',\n () => 'Registering onboarding event handlers for view',\n () => ({ id: this.id }),\n );\n\n const viewEmitter = this.viewEmitter ?? new OnboardingViewEmitter(this.id);\n this.viewEmitter = viewEmitter;\n\n const wrappedErrorLogEventHandlers = mapValues(eventHandlers, (handler, eventName) =>\n handler && typeof handler === 'function'\n ? withErrorContext(handler, eventName as string, 'OnboardingViewController')\n : undefined,\n );\n\n // Merge with defaults to ensure default behavior is preserved after unsubscribe/resubscribe cycles\n const finalEventHandlers: Partial<OnboardingEventHandlers> = {\n ...DEFAULT_ONBOARDING_EVENT_HANDLERS,\n ...wrappedErrorLogEventHandlers,\n };\n\n for (const [eventName, handler] of Object.entries(finalEventHandlers)) {\n if (handler && typeof handler === 'function') {\n try {\n await viewEmitter.addListener(eventName as keyof OnboardingEventHandlers, handler, this.onRequestClose);\n Log.verbose(\n 'setEventHandlers',\n () => 'Registered onboarding handler',\n () => ({ eventName }),\n );\n } catch (error) {\n Log.error(\n 'setEventHandlers',\n () => `Failed to register onboarding handler for ${eventName}`,\n () => ({ error }),\n );\n }\n }\n }\n\n const unsubscribe = () => {\n Log.info(\n 'setEventHandlers',\n () => 'Unsubscribing onboarding event handlers for view',\n () => ({ id: this.id }),\n );\n if (this.viewEmitter) {\n this.viewEmitter.removeAllListeners();\n this.viewEmitter = null;\n }\n };\n\n return unsubscribe;\n }\n\n /**\n * Clears all registered event handlers.\n *\n * @remarks\n * This method removes all previously registered event handlers.\n * After calling this method, no event handlers will be active\n * until you call {@link setEventHandlers} again.\n *\n * Use this after dismiss to remove all event handlers.\n *\n * @example\n * ```typescript\n * const view = await createOnboardingView(onboarding);\n * await view.setEventHandlers({ onClose: handleClose });\n *\n * // Later, clear all handlers\n * view.clearEventHandlers();\n * ```\n */\n public clearEventHandlers(): void {\n Log.info(\n 'clearEventHandlers',\n () => 'Clearing all onboarding event handlers for view',\n () => ({ id: this.id }),\n );\n\n if (this.viewEmitter) {\n this.viewEmitter.removeAllListeners();\n this.viewEmitter = null;\n }\n }\n}\n"]}
@@ -1,32 +1,18 @@
1
1
  import type { LogContext } from '../shared/logger';
2
- import type { AdaptyError } from '../shared/types/method-types';
3
- import { BaseViewEmitter, type BaseEventConfig } from './base-view-emitter';
4
- import type { AdaptyUiOnboardingMeta, OnboardingEventHandlers, OnboardingStateUpdatedAction } from './types';
5
- interface OnboardingEventData {
6
- id?: string;
7
- meta?: AdaptyUiOnboardingMeta;
8
- event?: {
9
- name: string;
10
- element_id?: string;
11
- reply?: string;
12
- };
13
- action?: OnboardingStateUpdatedAction;
14
- error?: AdaptyError;
15
- view?: {
16
- id: string;
17
- };
18
- }
2
+ import type { OnboardingEventIdType, ParsedOnboardingEvent } from '../shared/types/onboarding-events';
3
+ import { BaseViewEmitter } from './base-view-emitter';
4
+ import type { OnboardingEventHandlers } from './types';
5
+ type OnboardingNativeEvent = OnboardingEventIdType;
19
6
  /**
20
7
  * OnboardingViewEmitter manages event handlers for onboarding view events.
21
8
  * Each event type can have only one handler - new handlers replace existing ones.
22
9
  */
23
- export declare class OnboardingViewEmitter extends BaseViewEmitter<OnboardingEventHandlers, OnboardingEventData> {
24
- protected getEventConfig(event: keyof OnboardingEventHandlers): BaseEventConfig | undefined;
25
- protected parseEventData(rawEventData: string, ctx: LogContext): OnboardingEventData;
26
- protected getPossibleHandlers(nativeEvent: string): (keyof OnboardingEventHandlers)[];
27
- protected extractCallbackArgs(handlerName: keyof OnboardingEventHandlers, eventData: OnboardingEventData): unknown[];
28
- protected getEventViewId(eventData: OnboardingEventData): string | null;
29
- protected shouldCallHandler(): boolean;
10
+ export declare class OnboardingViewEmitter extends BaseViewEmitter<OnboardingEventHandlers, ParsedOnboardingEvent, OnboardingNativeEvent> {
11
+ protected parseEventData(rawEventData: string, ctx: LogContext): ParsedOnboardingEvent;
12
+ protected getNativeEventForHandler(event: keyof OnboardingEventHandlers): OnboardingNativeEvent | null;
13
+ protected getHandlerForNativeEvent(nativeEvent: OnboardingNativeEvent): keyof OnboardingEventHandlers | null;
14
+ protected extractCallbackArgs(handlerName: keyof OnboardingEventHandlers, eventData: ParsedOnboardingEvent): unknown[];
15
+ protected getEventViewId(eventData: ParsedOnboardingEvent): string | null;
30
16
  protected getEmitterName(): string;
31
17
  }
32
18
  export {};