Skip to content

Commit aa373e6

Browse files
Release 3.15.2
Merge pull request #266 from adaptyteam/dev
2 parents ab8726d + 9b4a83c commit aa373e6

File tree

5 files changed

+14
-27
lines changed

5 files changed

+14
-27
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ dependencies {
113113
implementation platform('io.adapty:adapty-bom:3.15.2')
114114
implementation 'io.adapty:android-sdk'
115115
implementation 'io.adapty:android-ui'
116-
implementation 'io.adapty.internal:crossplatform:3.15.3'
116+
implementation 'io.adapty.internal:crossplatform:3.15.6'
117117

118118
// Compatible with older and newer RN
119119
//noinspection GradleDynamicVersion

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://json.schemastore.org/package",
33
"name": "react-native-adapty",
4-
"version": "3.15.1",
4+
"version": "3.15.2",
55
"description": "Adapty React Native SDK",
66
"license": "MIT",
77
"author": "Adapty team <support@adapty.io>",

src/__tests__/integration/ui/paywall/paywall-view-controller-events.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,14 +1670,14 @@ describe('ViewController - onPaywallClosed after user action close', () => {
16701670
expect(onCloseButtonPressHandler).toHaveBeenCalledTimes(1);
16711671
expect(dismissSpy).toHaveBeenCalledTimes(1);
16721672

1673-
// 2. Wait for dismiss to complete (including removeAllListeners)
1674-
await dismissSpy.mock.results[0]?.value;
1675-
1676-
// 3. Native code sends onPaywallClosed event after paywall actually closes
1673+
// 2. Native code sends onPaywallClosed before dismiss resolves
1674+
// (dismiss response is expected to be the last event)
16771675
emitPaywallViewDisappearedEvent(viewId, closedSample.view);
16781676

1677+
// 3. Wait for dismiss to complete (includes cleanup)
1678+
await dismissSpy.mock.results[0]?.value;
1679+
16791680
// VERIFICATION: onPaywallClosed handler should be called
1680-
// Cleanup happens via internal handler AFTER this client handler executes
16811681
expect(onPaywallClosedHandler).toHaveBeenCalledTimes(1);
16821682

16831683
dismissSpy.mockRestore();

src/ui/view-controller.test.ts

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ describe('ViewController', () => {
128128
});
129129

130130
describe('dismiss', () => {
131-
it('calls bridge and registers internal cleanup handler', async () => {
131+
it('calls bridge and clears listeners after dismiss', async () => {
132132
const { AdaptyPaywallCoder } = jest.requireMock(
133133
'@/coders/adapty-paywall',
134134
);
@@ -141,23 +141,16 @@ describe('ViewController', () => {
141141
.mockResolvedValueOnce(undefined); // dismiss
142142

143143
const { ViewEmitter } = jest.requireMock('./view-emitter');
144-
const addInternalListenerMock = jest.fn();
145144
const removeAllListenersMock = jest.fn();
146145
(ViewEmitter as unknown as jest.Mock).mockImplementation(() => ({
147146
addListener: jest.fn(),
148-
addInternalListener: addInternalListenerMock,
147+
addInternalListener: jest.fn(),
149148
removeAllListeners: removeAllListenersMock,
150149
}));
151150

152151
const view = await ViewController.create(paywall, {} as any);
153152
view.setEventHandlers({ onCloseButtonPress: () => true });
154153

155-
// Verify internal handler was registered for cleanup
156-
expect(addInternalListenerMock).toHaveBeenCalledWith(
157-
'onPaywallClosed',
158-
expect.any(Function),
159-
);
160-
161154
await view.dismiss();
162155

163156
expect($bridge.request).toHaveBeenLastCalledWith(
@@ -167,9 +160,7 @@ describe('ViewController', () => {
167160
expect.any(Object),
168161
);
169162

170-
// Cleanup now happens via internal handler, not directly in dismiss()
171-
// So removeAllListeners should NOT be called immediately after dismiss
172-
expect(removeAllListenersMock).not.toHaveBeenCalled();
163+
expect(removeAllListenersMock).toHaveBeenCalledTimes(1);
173164
});
174165

175166
it('throws if id is null', async () => {

src/ui/view-controller.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,6 @@ export class ViewController {
7676

7777
view.setEventHandlers(DEFAULT_EVENT_HANDLERS);
7878

79-
// Register internal handler for cleanup
80-
view.viewEmitter.addInternalListener('onPaywallClosed', () => {
81-
// Called AFTER client's onPaywallClosed handler
82-
if (view.viewEmitter) {
83-
view.viewEmitter.removeAllListeners();
84-
}
85-
});
86-
8779
return view;
8880
}
8981

@@ -193,6 +185,10 @@ export class ViewController {
193185
} satisfies Req['AdaptyUIDismissPaywallView.Request']);
194186

195187
await this.handle<void>(methodKey, body, 'Void', ctx, log);
188+
189+
if (this.viewEmitter) {
190+
this.viewEmitter.removeAllListeners();
191+
}
196192
}
197193

198194
/**

0 commit comments

Comments
 (0)