@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.
- package/AdaptyCapacitor.podspec +3 -3
- package/Package.swift +1 -1
- package/README.md +45 -29
- package/android/build.gradle +4 -3
- package/android/src/main/kotlin/com/adapty/plugin/capacitor/AdaptyCapacitorImplementation.kt +2 -0
- package/dist/esm/adapty.d.ts +752 -6
- package/dist/esm/adapty.js +755 -8
- package/dist/esm/adapty.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/shared/coders/adapty-configuration.js +25 -14
- package/dist/esm/shared/coders/adapty-configuration.js.map +1 -1
- package/dist/esm/shared/coders/adapty-identify-params.d.ts +11 -0
- package/dist/esm/shared/coders/adapty-identify-params.js +19 -0
- package/dist/esm/shared/coders/adapty-identify-params.js.map +1 -0
- package/dist/esm/shared/coders/adapty-paywall-product.d.ts +1 -1
- package/dist/esm/shared/coders/adapty-paywall-product.js +12 -0
- package/dist/esm/shared/coders/adapty-paywall-product.js.map +1 -1
- package/dist/esm/shared/coders/adapty-purchase-params.js +0 -8
- package/dist/esm/shared/coders/adapty-purchase-params.js.map +1 -1
- package/dist/esm/shared/coders/adapty-purchase-result.js +18 -2
- package/dist/esm/shared/coders/adapty-purchase-result.js.map +1 -1
- package/dist/esm/shared/coders/adapty-ui-create-onboarding-view-params.d.ts +8 -0
- package/dist/esm/shared/coders/adapty-ui-create-onboarding-view-params.js +10 -0
- package/dist/esm/shared/coders/adapty-ui-create-onboarding-view-params.js.map +1 -0
- package/dist/esm/shared/coders/adapty-ui-create-paywall-view-params.d.ts +18 -0
- package/dist/esm/shared/coders/adapty-ui-create-paywall-view-params.js +142 -0
- package/dist/esm/shared/coders/adapty-ui-create-paywall-view-params.js.map +1 -0
- package/dist/esm/shared/coders/parse-onboarding.d.ts +3 -0
- package/dist/esm/shared/coders/parse-onboarding.js +86 -0
- package/dist/esm/shared/coders/parse-onboarding.js.map +1 -0
- package/dist/esm/shared/coders/parse-paywall.d.ts +4 -0
- package/dist/esm/shared/coders/parse-paywall.js +141 -0
- package/dist/esm/shared/coders/parse-paywall.js.map +1 -0
- package/dist/esm/shared/coders/parse.d.ts +0 -2
- package/dist/esm/shared/coders/parse.js +0 -75
- package/dist/esm/shared/coders/parse.js.map +1 -1
- package/dist/esm/shared/coders/product-reference.js +10 -0
- package/dist/esm/shared/coders/product-reference.js.map +1 -1
- package/dist/esm/shared/coders/utils.d.ts +18 -0
- package/dist/esm/shared/coders/utils.js +50 -0
- package/dist/esm/shared/coders/utils.js.map +1 -0
- package/dist/esm/shared/types/index.d.ts +16 -0
- package/dist/esm/shared/types/index.js +5 -0
- package/dist/esm/shared/types/index.js.map +1 -1
- package/dist/esm/shared/types/inputs.d.ts +47 -14
- package/dist/esm/shared/types/inputs.js.map +1 -1
- package/dist/esm/shared/types/onboarding-events.d.ts +60 -0
- package/dist/esm/shared/types/onboarding-events.js +11 -0
- package/dist/esm/shared/types/onboarding-events.js.map +1 -0
- package/dist/esm/shared/types/paywall-events.d.ts +84 -0
- package/dist/esm/shared/types/paywall-events.js +16 -0
- package/dist/esm/shared/types/paywall-events.js.map +1 -0
- package/dist/esm/shared/utils/platform.d.ts +2 -0
- package/dist/esm/shared/utils/platform.js +5 -0
- package/dist/esm/shared/utils/platform.js.map +1 -0
- package/dist/esm/types/adapty-plugin.d.ts +2 -1
- package/dist/esm/types/adapty-plugin.js.map +1 -1
- package/dist/esm/ui-builder/base-view-emitter.d.ts +14 -20
- package/dist/esm/ui-builder/base-view-emitter.js +95 -73
- package/dist/esm/ui-builder/base-view-emitter.js.map +1 -1
- package/dist/esm/ui-builder/create-onboarding-view.d.ts +32 -0
- package/dist/esm/ui-builder/create-onboarding-view.js +36 -0
- package/dist/esm/ui-builder/create-onboarding-view.js.map +1 -0
- package/dist/esm/ui-builder/create-paywall-view.d.ts +25 -0
- package/dist/esm/ui-builder/create-paywall-view.js +29 -0
- package/dist/esm/ui-builder/create-paywall-view.js.map +1 -0
- package/dist/esm/ui-builder/index.d.ts +6 -37
- package/dist/esm/ui-builder/index.js +4 -41
- package/dist/esm/ui-builder/index.js.map +1 -1
- package/dist/esm/ui-builder/onboarding-view-controller.d.ts +103 -17
- package/dist/esm/ui-builder/onboarding-view-controller.js +112 -22
- package/dist/esm/ui-builder/onboarding-view-controller.js.map +1 -1
- package/dist/esm/ui-builder/onboarding-view-emitter.d.ts +10 -24
- package/dist/esm/ui-builder/onboarding-view-emitter.js +49 -56
- package/dist/esm/ui-builder/onboarding-view-emitter.js.map +1 -1
- package/dist/esm/ui-builder/paywall-view-controller.d.ts +130 -30
- package/dist/esm/ui-builder/paywall-view-controller.js +141 -71
- package/dist/esm/ui-builder/paywall-view-controller.js.map +1 -1
- package/dist/esm/ui-builder/paywall-view-emitter.d.ts +8 -28
- package/dist/esm/ui-builder/paywall-view-emitter.js +86 -118
- package/dist/esm/ui-builder/paywall-view-emitter.js.map +1 -1
- package/dist/esm/ui-builder/types.d.ts +89 -4
- package/dist/esm/ui-builder/types.js +3 -3
- package/dist/esm/ui-builder/types.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/plugin.cjs.js +1896 -556
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +1896 -556
- package/dist/plugin.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,38 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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,
|
|
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
|
-
*
|
|
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
|
|
35
|
+
* Presents the onboarding view as a modal screen.
|
|
29
36
|
*
|
|
30
37
|
* @remarks
|
|
31
|
-
* Calling `present`
|
|
32
|
-
*
|
|
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
|
-
* @
|
|
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(
|
|
63
|
+
present(options?: {
|
|
64
|
+
iosPresentationStyle?: AdaptyIOSPresentationStyle;
|
|
65
|
+
}): Promise<void>;
|
|
37
66
|
/**
|
|
38
|
-
* Dismisses
|
|
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
|
-
* @
|
|
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
|
-
*
|
|
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
|
|
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
|
-
* @
|
|
56
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
66
|
+
* Presents the onboarding view as a modal screen.
|
|
57
67
|
*
|
|
58
68
|
* @remarks
|
|
59
|
-
* Calling `present`
|
|
60
|
-
*
|
|
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
|
-
* @
|
|
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
|
|
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
|
-
* @
|
|
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
|
-
*
|
|
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
|
|
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
|
-
* @
|
|
110
|
-
*
|
|
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
|
|
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 {
|
|
3
|
-
import { BaseViewEmitter
|
|
4
|
-
import type {
|
|
5
|
-
|
|
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,
|
|
24
|
-
protected
|
|
25
|
-
protected
|
|
26
|
-
protected
|
|
27
|
-
protected extractCallbackArgs(handlerName: keyof OnboardingEventHandlers, eventData:
|
|
28
|
-
protected getEventViewId(eventData:
|
|
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 {};
|