react-native-nami-sdk 3.3.0-beta.7 → 3.3.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 (106) hide show
  1. package/.prettierrc +4 -0
  2. package/README.md +9 -9
  3. package/android/README.md +3 -2
  4. package/android/build.gradle +27 -19
  5. package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  6. package/android/gradlew +0 -0
  7. package/android/src/main/AndroidManifest.xml +1 -1
  8. package/android/src/main/java/com/namiml/reactnative/Constants.kt +3 -0
  9. package/android/src/main/java/com/namiml/reactnative/NamiBridgeModule.kt +91 -0
  10. package/android/src/main/java/com/namiml/reactnative/NamiBridgePackage.java +140 -0
  11. package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiCampaignManagerBridge.kt +24 -30
  12. package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiCustomerManagerBridge.kt +14 -6
  13. package/android/src/main/java/com/{nami/reactlibrary/NamiEntitlementManagerBridgeModule.kt → namiml/reactnative/NamiEntitlementManagerBridge.kt} +18 -8
  14. package/android/src/main/java/com/namiml/reactnative/NamiFlowManagerBridge.kt +67 -0
  15. package/android/src/main/java/com/namiml/reactnative/NamiPaywallManagerBridgeModule.kt +196 -0
  16. package/android/src/main/java/com/namiml/reactnative/NamiPurchaseManagerBridge.kt +114 -0
  17. package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiUtil.kt +26 -23
  18. package/{index.d.ts → dist/index.d.ts} +0 -2
  19. package/dist/specs/NativeNami.d.ts +15 -0
  20. package/dist/specs/NativeNamiCampaignManager.d.ts +82 -0
  21. package/dist/specs/NativeNamiCustomerManager.d.ts +29 -0
  22. package/dist/specs/NativeNamiEntitlementManager.d.ts +45 -0
  23. package/dist/specs/NativeNamiFlowManager.d.ts +8 -0
  24. package/dist/specs/NativeNamiPaywallManager.d.ts +71 -0
  25. package/dist/specs/NativeNamiPurchaseManager.d.ts +28 -0
  26. package/dist/src/Nami.d.ts +5 -0
  27. package/dist/src/NamiCampaignManager.d.ts +29 -0
  28. package/{src → dist/src}/NamiCustomerManager.d.ts +11 -13
  29. package/dist/src/NamiEntitlementManager.d.ts +13 -0
  30. package/dist/src/NamiFlowManager.d.ts +11 -0
  31. package/dist/src/NamiPaywallManager.d.ts +30 -0
  32. package/dist/src/NamiPurchaseManager.d.ts +17 -0
  33. package/dist/src/transformers.d.ts +3 -0
  34. package/{src → dist/src}/types.d.ts +35 -6
  35. package/dist/src/version.d.ts +5 -0
  36. package/index.ts +0 -2
  37. package/ios/Nami.m +8 -88
  38. package/ios/Nami.swift +85 -0
  39. package/ios/NamiCampaignManagerBridge.m +3 -3
  40. package/ios/NamiCampaignManagerBridge.swift +49 -61
  41. package/ios/NamiCustomerManager.m +2 -2
  42. package/ios/NamiCustomerManager.swift +13 -3
  43. package/ios/NamiEntitlementManagerBridge.m +2 -3
  44. package/ios/NamiEntitlementManagerBridge.swift +48 -39
  45. package/ios/NamiFlowManagerBridge.m +2 -2
  46. package/ios/NamiFlowManagerBridge.swift +10 -6
  47. package/ios/NamiPaywallManagerBridge.m +3 -3
  48. package/ios/NamiPaywallManagerBridge.swift +16 -6
  49. package/ios/NamiPurchaseManagerBridge.m +3 -2
  50. package/ios/NamiPurchaseManagerBridge.swift +15 -10
  51. package/ios/RNNami-Bridging-Header.h +1 -3
  52. package/package.json +20 -8
  53. package/react-native-config.js +9 -0
  54. package/react-native-nami-sdk.podspec +11 -3
  55. package/scripts/generate-version.ts +18 -0
  56. package/specs/NativeNami.ts +16 -0
  57. package/specs/NativeNamiCampaignManager.ts +94 -0
  58. package/specs/NativeNamiCustomerManager.ts +37 -0
  59. package/specs/NativeNamiEntitlementManager.ts +54 -0
  60. package/specs/NativeNamiFlowManager.ts +12 -0
  61. package/specs/NativeNamiPaywallManager.ts +85 -0
  62. package/specs/NativeNamiPurchaseManager.ts +33 -0
  63. package/src/Nami.ts +28 -18
  64. package/src/NamiCampaignManager.ts +57 -53
  65. package/src/NamiCustomerManager.ts +55 -81
  66. package/src/NamiEntitlementManager.ts +49 -36
  67. package/src/NamiFlowManager.ts +35 -45
  68. package/src/NamiPaywallManager.ts +84 -139
  69. package/src/NamiPurchaseManager.ts +69 -70
  70. package/src/transformers.ts +21 -0
  71. package/src/types.ts +39 -7
  72. package/src/version.ts +5 -0
  73. package/tsconfig.json +24 -22
  74. package/.eslintignore +0 -3
  75. package/.eslintrc.js +0 -52
  76. package/.github/workflows/CI.yaml +0 -341
  77. package/.github/workflows/app_prod.yaml +0 -387
  78. package/.github/workflows/app_stg.yaml +0 -398
  79. package/.github/workflows/build.yml +0 -70
  80. package/.pre-commit-config.yaml +0 -24
  81. package/.prettierrc.js +0 -7
  82. package/android/src/main/java/com/nami/reactlibrary/Constants.kt +0 -3
  83. package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +0 -141
  84. package/android/src/main/java/com/nami/reactlibrary/NamiBridgePackage.java +0 -51
  85. package/android/src/main/java/com/nami/reactlibrary/NamiFlowManagerBridge.kt +0 -58
  86. package/android/src/main/java/com/nami/reactlibrary/NamiMLManagerBridgeModule.kt +0 -58
  87. package/android/src/main/java/com/nami/reactlibrary/NamiManagerBridge.kt +0 -26
  88. package/android/src/main/java/com/nami/reactlibrary/NamiPaywallManagerBridgeModule.kt +0 -258
  89. package/android/src/main/java/com/nami/reactlibrary/NamiPurchaseManagerBridge.kt +0 -108
  90. package/build-utils/get_version_code.py +0 -140
  91. package/build-utils/preflight.py +0 -46
  92. package/ios/NamiMLManagerBridge.m +0 -93
  93. package/ios/NamiManager.m +0 -18
  94. package/ios/NamiManager.swift +0 -30
  95. package/ios/RNNami.h +0 -10
  96. package/ios/RNNami.m +0 -13
  97. package/src/Nami.d.ts +0 -8
  98. package/src/NamiCampaignManager.d.ts +0 -18
  99. package/src/NamiEntitlementManager.d.ts +0 -15
  100. package/src/NamiFlowManager.d.ts +0 -32
  101. package/src/NamiMLManager.d.ts +0 -7
  102. package/src/NamiMLManager.ts +0 -13
  103. package/src/NamiManager.d.ts +0 -5
  104. package/src/NamiManager.ts +0 -14
  105. package/src/NamiPaywallManager.d.ts +0 -34
  106. package/src/NamiPurchaseManager.d.ts +0 -20
@@ -1,84 +1,66 @@
1
1
  import {
2
+ TurboModuleRegistry,
2
3
  NativeModules,
3
4
  NativeEventEmitter,
4
5
  EmitterSubscription,
5
6
  } from 'react-native';
6
- import { AccountStateAction, CustomerJourneyState } from './types';
7
+ import type { Spec } from '../specs/NativeNamiCustomerManager';
8
+ import type {
9
+ AccountStateAction,
10
+ CustomerJourneyState,
11
+ NamiAccountStateEvent,
12
+ } from './types';
7
13
 
8
- export const { RNNamiCustomerManager } = NativeModules;
14
+ const RNNamiCustomerManager: Spec =
15
+ TurboModuleRegistry.getEnforcing?.<Spec>('RNNamiCustomerManager') ??
16
+ NativeModules.RNNamiCustomerManager;
17
+
18
+ const emitter = new NativeEventEmitter(NativeModules.RNNamiCustomerManager);
9
19
 
10
20
  export enum NamiCustomerManagerEvents {
11
21
  JourneyStateChanged = 'JourneyStateChanged',
12
22
  AccountStateChanged = 'AccountStateChanged',
13
23
  }
14
24
 
15
- export interface INamiCustomerManager {
16
- emitter: NativeEventEmitter;
17
- setCustomerAttribute: (key: string, value: string) => void;
18
- getCustomerAttribute: (key: string) => Promise<string | undefined>;
19
- clearCustomerAttribute: (key: string) => void;
20
- clearAllCustomerAttributes: () => void;
21
- journeyState: () => Promise<CustomerJourneyState | undefined>;
22
- isLoggedIn: () => Promise<boolean>;
23
- loggedInId: () => Promise<string | undefined>;
24
- deviceId: () => Promise<string>;
25
- login: (customerId: string) => void;
26
- logout: () => void;
27
- registerJourneyStateHandler: (
28
- callback: (journeyState: CustomerJourneyState) => void,
29
- ) => EmitterSubscription['remove'];
30
- registerAccountStateHandler: (
31
- callback: (
32
- action: AccountStateAction,
33
- success: boolean,
34
- error?: number,
35
- ) => void,
36
- ) => EmitterSubscription['remove'];
37
- clearCustomerDataPlatformId: () => void;
38
- setCustomerDataPlatformId: (platformId: string) => void;
39
- setAnonymousMode: (anonymousMode: boolean) => void;
40
- inAnonymousMode: () => Promise<boolean>;
41
- }
25
+ export const NamiCustomerManager = {
26
+ emitter,
27
+
28
+ login: (customerId: string) => RNNamiCustomerManager.login(customerId),
42
29
 
43
- export const NamiCustomerManager: INamiCustomerManager = {
44
- ...RNNamiCustomerManager,
45
- emitter: new NativeEventEmitter(RNNamiCustomerManager),
46
- login: customerId => {
47
- RNNamiCustomerManager.login(customerId);
30
+ logout: () => RNNamiCustomerManager.logout(),
31
+
32
+ setCustomerAttribute: (key: string, value: string) =>
33
+ RNNamiCustomerManager.setCustomerAttribute(key, value),
34
+
35
+ getCustomerAttribute: async (key: string): Promise<string | undefined> => {
36
+ const value = await RNNamiCustomerManager.getCustomerAttribute(key);
37
+ return value ?? undefined;
48
38
  },
49
- logout: () => {
50
- RNNamiCustomerManager.logout();
39
+
40
+ clearCustomerAttribute: (key: string) =>
41
+ RNNamiCustomerManager.clearCustomerAttribute(key),
42
+
43
+ clearAllCustomerAttributes: () =>
44
+ RNNamiCustomerManager.clearAllCustomerAttributes(),
45
+
46
+ journeyState: async (): Promise<CustomerJourneyState> =>
47
+ RNNamiCustomerManager.journeyState() as Promise<CustomerJourneyState>,
48
+
49
+ isLoggedIn: async (): Promise<boolean> => RNNamiCustomerManager.isLoggedIn(),
50
+
51
+ loggedInId: async (): Promise<string | undefined> => {
52
+ const id = await RNNamiCustomerManager.loggedInId();
53
+ return id ?? undefined;
51
54
  },
52
- setCustomerDataPlatformId: platformId => {
55
+ setCustomerDataPlatformId: (platformId) => {
53
56
  RNNamiCustomerManager.setCustomerDataPlatformId(platformId);
54
57
  },
55
58
  clearCustomerDataPlatformId: () => {
56
59
  RNNamiCustomerManager.clearCustomerDataPlatformId();
57
60
  },
58
- setAnonymousMode: anonymousMode => {
61
+ setAnonymousMode: (anonymousMode) => {
59
62
  RNNamiCustomerManager.setAnonymousMode(anonymousMode);
60
63
  },
61
- setCustomerAttribute: (key, value) => {
62
- RNNamiCustomerManager.setCustomerAttribute(key, value);
63
- },
64
- clearCustomerAttribute: key => {
65
- RNNamiCustomerManager.clearCustomerAttribute(key);
66
- },
67
- clearAllCustomerAttributes: () => {
68
- RNNamiCustomerManager.clearAllCustomerAttributes();
69
- },
70
- getCustomerAttribute: async key => {
71
- return RNNamiCustomerManager.getCustomerAttribute(key);
72
- },
73
- journeyState: async () => {
74
- return RNNamiCustomerManager.journeyState();
75
- },
76
- isLoggedIn: async () => {
77
- return RNNamiCustomerManager.isLoggedIn();
78
- },
79
- loggedInId: async () => {
80
- return RNNamiCustomerManager.loggedInId();
81
- },
82
64
  deviceId: async () => {
83
65
  return RNNamiCustomerManager.deviceId();
84
66
  },
@@ -86,40 +68,32 @@ export const NamiCustomerManager: INamiCustomerManager = {
86
68
  return RNNamiCustomerManager.inAnonymousMode();
87
69
  },
88
70
  registerJourneyStateHandler: (
89
- callback: (journeyState: CustomerJourneyState) => void,
90
- ) => {
91
- const subscription = NamiCustomerManager.emitter.addListener(
71
+ callback: (state: CustomerJourneyState) => void,
72
+ ): EmitterSubscription['remove'] => {
73
+ const subscription = emitter.addListener(
92
74
  NamiCustomerManagerEvents.JourneyStateChanged,
93
75
  callback,
94
76
  );
95
- RNNamiCustomerManager.registerJourneyStateHandler();
96
- return () => {
97
- if (subscription) {
98
- subscription.remove();
99
- }
100
- };
77
+ RNNamiCustomerManager.registerJourneyStateHandler?.();
78
+ return () => subscription.remove();
101
79
  },
80
+
102
81
  registerAccountStateHandler: (
103
82
  callback: (
104
83
  action: AccountStateAction,
105
84
  success: boolean,
106
85
  error?: number,
107
86
  ) => void,
108
- ) => {
109
- const subscription = NamiCustomerManager.emitter.addListener(
87
+ ): EmitterSubscription['remove'] => {
88
+ const subscription = emitter.addListener(
110
89
  NamiCustomerManagerEvents.AccountStateChanged,
111
- (body: any) => {
112
- const action: AccountStateAction = body.action.toLowerCase();
113
- const error: number | undefined = body.error;
114
- const success: boolean = body.success;
115
- callback(action, success, error);
90
+ (body: NamiAccountStateEvent) => {
91
+ const action: AccountStateAction =
92
+ body.action.toLowerCase() as AccountStateAction;
93
+ callback(action, body.success, body.error);
116
94
  },
117
95
  );
118
- RNNamiCustomerManager.registerAccountStateHandler();
119
- return () => {
120
- if (subscription) {
121
- subscription.remove();
122
- }
123
- };
96
+ RNNamiCustomerManager.registerAccountStateHandler?.();
97
+ return () => subscription.remove();
124
98
  },
125
99
  };
@@ -1,53 +1,66 @@
1
1
  import {
2
+ TurboModuleRegistry,
2
3
  NativeModules,
3
4
  NativeEventEmitter,
4
- Platform,
5
5
  EmitterSubscription,
6
6
  } from 'react-native';
7
- import { NamiEntitlement } from './types';
7
+ import type { Spec } from '../specs/NativeNamiEntitlementManager';
8
+ import type { NamiEntitlement } from './types';
9
+ import { parsePurchaseDates } from './transformers';
8
10
 
9
- export const { RNNamiEntitlementManager } = NativeModules;
11
+ const RNNamiEntitlementManager: Spec =
12
+ TurboModuleRegistry.getEnforcing?.<Spec>('RNNamiEntitlementManager') ??
13
+ NativeModules.RNNamiEntitlementManager;
14
+
15
+ const emitter = new NativeEventEmitter(NativeModules.RNNamiEntitlementManager);
10
16
 
11
17
  export enum NamiEntitlementManagerEvents {
12
18
  EntitlementsChanged = 'EntitlementsChanged',
13
19
  }
14
20
 
15
- export interface INamiEntitlementManager {
16
- emitter: NativeEventEmitter;
17
- active: () => Promise<Array<NamiEntitlement>>;
18
- isEntitlementActive: (label?: string) => boolean;
19
- refresh: (
20
- resultCallback?: (entitlements?: NamiEntitlement[]) => void,
21
- ) => void;
22
- registerActiveEntitlementsHandler: (
23
- callback: (activeEntitlements: NamiEntitlement[]) => void,
24
- ) => EmitterSubscription['remove'];
25
- clearProvisionalEntitlementGrants: () => void;
21
+ function parseEntitlements(entitlements: any[]): NamiEntitlement[] {
22
+ return entitlements.map((ent) => ({
23
+ ...ent,
24
+ activePurchases: ent.activePurchases.map(parsePurchaseDates),
25
+ relatedSkus: ent.relatedSkus ?? [],
26
+ purchasedSkus: ent.purchasedSkus ?? [],
27
+ }));
26
28
  }
27
29
 
28
- export const NamiEntitlementManager: INamiEntitlementManager = {
29
- ...RNNamiEntitlementManager,
30
- emitter: new NativeEventEmitter(RNNamiEntitlementManager),
31
- refresh: (resultCallback?: (entitlements?: NamiEntitlement[]) => void) => {
32
- if (Platform.OS === 'android') {
33
- RNNamiEntitlementManager.refresh(resultCallback ?? (() => {}));
34
- } else {
35
- RNNamiEntitlementManager.refresh();
36
- }
30
+ export const NamiEntitlementManager = {
31
+ emitter,
32
+
33
+ active: async (): Promise<NamiEntitlement[]> => {
34
+ const raw = await RNNamiEntitlementManager.active();
35
+ return parseEntitlements(raw);
36
+ },
37
+
38
+ isEntitlementActive: async (entitlementId: string): Promise<boolean> => {
39
+ return await RNNamiEntitlementManager.isEntitlementActive(entitlementId);
37
40
  },
41
+
42
+ refresh: (
43
+ callback: (entitlements: NamiEntitlement[]) => void,
44
+ ): EmitterSubscription['remove'] => {
45
+ const subscription = emitter.addListener(
46
+ NamiEntitlementManagerEvents.EntitlementsChanged,
47
+ callback,
48
+ );
49
+ RNNamiEntitlementManager.refresh?.();
50
+ return () => subscription.remove();
51
+ },
52
+
38
53
  registerActiveEntitlementsHandler: (
39
- callback: (activeEntitlements: NamiEntitlement[]) => void,
40
- ) => {
41
- let subscription: EmitterSubscription =
42
- NamiEntitlementManager.emitter.addListener(
43
- NamiEntitlementManagerEvents.EntitlementsChanged,
44
- callback,
45
- );
46
- RNNamiEntitlementManager.registerActiveEntitlementsHandler();
47
- return () => {
48
- if (subscription) {
49
- subscription.remove();
50
- }
51
- };
54
+ callback: (entitlements: NamiEntitlement[]) => void,
55
+ ): EmitterSubscription['remove'] => {
56
+ const subscription = emitter.addListener(
57
+ NamiEntitlementManagerEvents.EntitlementsChanged,
58
+ callback,
59
+ );
60
+ RNNamiEntitlementManager.registerActiveEntitlementsHandler?.();
61
+ return () => subscription.remove();
52
62
  },
63
+
64
+ clearProvisionalEntitlementGrants: (): void =>
65
+ RNNamiEntitlementManager.clearProvisionalEntitlementGrants(),
53
66
  };
@@ -1,66 +1,56 @@
1
1
  import {
2
+ TurboModuleRegistry,
2
3
  NativeModules,
3
4
  NativeEventEmitter,
4
- EmitterSubscription,
5
5
  } from 'react-native';
6
+ import type { Spec } from '../specs/NativeNamiFlowManager';
7
+ import type { NamiFlowHandoffPayload } from '../src/types';
6
8
 
7
- const { RNNamiFlowManager } = NativeModules;
9
+ const RNNamiFlowManager: Spec =
10
+ TurboModuleRegistry.getEnforcing?.<Spec>('RNNamiFlowManager') ??
11
+ NativeModules.RNNamiFlowManager;
8
12
 
9
- export enum NamiFlowManagerEvents {
10
- RegisterStepHandoff = 'RegisterStepHandoff',
11
- }
13
+ const emitter = new NativeEventEmitter(NativeModules.RNNamiFlowManager);
12
14
 
13
- export interface INamiFlowManager {
14
- registerStepHandoff: (
15
- callback: (handoffTag: string, handoffData?: { [key: string]: any }) => void,
16
- ) => () => void;
17
- resume: () => void;
18
- registerEventHandler: (
19
- handler: (payload: { [key: string]: any }) => void
20
- ) => void;
15
+ export enum NamiFlowManagerEvents {
16
+ Handoff = 'Handoff',
17
+ FlowEvent = 'FlowEvent',
21
18
  }
22
19
 
23
- const flowEmitter = new NativeEventEmitter(RNNamiFlowManager);
24
-
25
- export const NamiFlowManager: INamiFlowManager = {
26
- registerStepHandoff: (callback) => {
27
- console.log('[NamiFlowManager] Registering handoff listener...');
20
+ export const NamiFlowManager = {
21
+ emitter,
28
22
 
29
- const subscription: EmitterSubscription = flowEmitter.addListener(
30
- NamiFlowManagerEvents.RegisterStepHandoff,
31
- (event: { handoffTag: string; handoffData?: { [key: string]: any } }) => {
23
+ registerStepHandoff: (
24
+ callback: (
25
+ handoffTag: string,
26
+ handoffData?: Record<string, unknown>,
27
+ ) => void,
28
+ ): (() => void) => {
29
+ console.info('[NamiFlowManager] Registering step handoff listener...');
30
+
31
+ const sub = emitter.addListener(
32
+ NamiFlowManagerEvents.Handoff,
33
+ (event: NamiFlowHandoffPayload) => {
32
34
  console.info('[NamiFlowManager] Received handoff event:', event);
33
35
  callback(event.handoffTag, event.handoffData);
34
- }
36
+ },
35
37
  );
36
38
 
37
- if (RNNamiFlowManager?.registerStepHandoff) {
38
- RNNamiFlowManager.registerStepHandoff();
39
- } else {
40
- console.warn('[NamiFlowManager] Native method registerStepHandoff is not available.');
41
- }
39
+ RNNamiFlowManager.registerStepHandoff?.();
42
40
 
43
- return () => {
44
- subscription.remove();
45
- };
41
+ return () => sub.remove();
46
42
  },
47
43
 
48
- resume: () => {
49
- if (RNNamiFlowManager?.resume) {
50
- console.info('[NamiFlowManager] resume from handoff requested');
51
- RNNamiFlowManager.resume();
52
- } else {
53
- console.warn('[NamiFlowManager] Native method resume is not available.');
54
- }
44
+ resume: (): void => {
45
+ console.info('[NamiFlowManager] resume from handoff requested');
46
+ RNNamiFlowManager.resume?.();
55
47
  },
56
48
 
57
- registerEventHandler: (handler) => {
58
- if (RNNamiFlowManager?.registerEventHandler) {
59
- RNNamiFlowManager.registerEventHandler((payload: { [key: string]: any }) => {
60
- handler(payload);
61
- });
62
- } else {
63
- console.warn('[NamiFlowManager] Native method registerEventHandler is not available.');
64
- }
49
+ registerEventHandler: (
50
+ callback: (payload: Record<string, unknown>) => void,
51
+ ): (() => void) => {
52
+ const sub = emitter.addListener(NamiFlowManagerEvents.FlowEvent, callback);
53
+ RNNamiFlowManager.registerEventHandler?.();
54
+ return () => sub.remove();
65
55
  },
66
56
  };
@@ -1,175 +1,120 @@
1
1
  import {
2
+ TurboModuleRegistry,
2
3
  NativeModules,
3
4
  NativeEventEmitter,
4
- EmitterSubscription,
5
5
  } from 'react-native';
6
- import {
7
- NamiPurchaseSuccessAmazon,
6
+ import type { Spec } from '../specs/NativeNamiPaywallManager';
7
+ import type {
8
+ NamiPurchaseDetails,
8
9
  NamiPurchaseSuccessApple,
10
+ NamiPurchaseSuccessAmazon,
9
11
  NamiPurchaseSuccessGooglePlay,
10
12
  NamiSKU,
11
- } from './types';
13
+ } from '../src/types';
14
+ const RNNamiPaywallManager: Spec =
15
+ TurboModuleRegistry.getEnforcing?.<Spec>('RNNamiPaywallManager') ??
16
+ NativeModules.RNNamiPaywallManager;
17
+
18
+ const emitter = new NativeEventEmitter(NativeModules.RNNamiPaywallManager);
12
19
 
13
20
  export enum NamiPaywallManagerEvents {
14
- RegisterBuySKU = 'RegisterBuySKU',
15
- PaywallCloseRequested = 'PaywallCloseRequested',
16
- PaywallSignInRequested = 'PaywallSignInRequested',
17
- PaywallRestoreRequested = 'PaywallRestoreRequested',
18
- PaywallDeeplinkAction = 'PaywallDeeplinkAction',
21
+ BuySku = 'RegisterBuySKU',
22
+ Close = 'PaywallCloseRequested',
23
+ SignIn = 'PaywallSignInRequested',
24
+ Restore = 'PaywallRestoreRequested',
25
+ DeeplinkAction = 'PaywallDeeplinkAction',
19
26
  }
20
27
 
21
- export enum ServicesEnum {
22
- Amazon = 'Amazon',
23
- GooglePlay = 'GooglePlay',
24
- }
28
+ export const NamiPaywallManager = {
29
+ emitter,
25
30
 
26
- export interface INamiPaywallManager {
27
- paywallEmitter: NativeEventEmitter;
28
- buySkuCompleteApple: (purchaseSuccess: NamiPurchaseSuccessApple) => void;
29
- buySkuCompleteAmazon: (purchaseSuccess: NamiPurchaseSuccessAmazon) => void;
30
- buySkuCompleteGooglePlay: (
31
- purchaseSuccess: NamiPurchaseSuccessGooglePlay,
32
- ) => void;
33
- buySkuCancel: () => void;
34
- registerBuySkuHandler: (
35
- callback: (sku: NamiSKU) => void,
36
- ) => EmitterSubscription['remove'];
37
- registerCloseHandler: (callback: () => void) => EmitterSubscription['remove'];
38
- registerSignInHandler: (
39
- callback: () => void,
40
- ) => EmitterSubscription['remove'];
41
- registerRestoreHandler: (
42
- callback: () => void,
43
- ) => EmitterSubscription['remove'];
44
- registerDeeplinkActionHandler: (
45
- callback: (url: string) => void,
46
- ) => EmitterSubscription['remove'];
47
- dismiss: () => Promise<boolean>;
48
- show: () => void;
49
- hide: () => void;
50
- isHidden: () => Promise<boolean>;
51
- isPaywallOpen: () => Promise<boolean>;
52
- setProductDetails: (productDetails: string, allowOffers: boolean) => void;
53
- setAppSuppliedVideoDetails: (url: string, name?: string) => void;
54
- allowUserInteraction: (allowed: boolean) => void;
55
- }
31
+ // New unified purchase success handler
32
+ buySkuComplete: (purchase: NamiPurchaseDetails): void => {
33
+ RNNamiPaywallManager.buySkuComplete(purchase);
34
+ },
56
35
 
57
- const { NamiPaywallManagerBridge, RNNamiPaywallManager } = NativeModules;
36
+ // Compatibility shims
37
+ buySkuCompleteApple: (purchase: NamiPurchaseSuccessApple): void => {
38
+ RNNamiPaywallManager.buySkuCompleteApple(purchase);
39
+ },
58
40
 
59
- export const NamiPaywallManager: INamiPaywallManager = {
60
- paywallEmitter: new NativeEventEmitter(RNNamiPaywallManager),
61
- ...RNNamiPaywallManager,
62
- ...NamiPaywallManagerBridge,
63
- buySkuCompleteApple: (purchaseSuccess: NamiPurchaseSuccessApple) => {
64
- RNNamiPaywallManager.buySkuComplete(purchaseSuccess);
41
+ buySkuCompleteAmazon: (purchase: NamiPurchaseSuccessAmazon): void => {
42
+ RNNamiPaywallManager.buySkuCompleteAmazon(purchase);
65
43
  },
66
- buySkuCompleteAmazon: (purchaseSuccess: NamiPurchaseSuccessAmazon) => {
67
- RNNamiPaywallManager.buySkuComplete(purchaseSuccess, ServicesEnum.Amazon);
44
+
45
+ buySkuCompleteGooglePlay: (purchase: NamiPurchaseSuccessGooglePlay): void => {
46
+ RNNamiPaywallManager.buySkuCompleteGooglePlay(purchase);
68
47
  },
69
- buySkuCompleteGooglePlay: (
70
- purchaseSuccess: NamiPurchaseSuccessGooglePlay,
71
- ) => {
72
- RNNamiPaywallManager.buySkuComplete(
73
- purchaseSuccess,
74
- ServicesEnum.GooglePlay,
75
- );
48
+
49
+ registerBuySkuHandler: (callback: (sku: NamiSKU) => void): (() => void) => {
50
+ const sub = emitter.addListener(NamiPaywallManagerEvents.BuySku, callback);
51
+ RNNamiPaywallManager.registerBuySkuHandler?.();
52
+ return () => sub.remove();
76
53
  },
77
- buySkuCancel: () => {
78
- RNNamiPaywallManager.buySkuCancel();
54
+
55
+ registerCloseHandler: (callback: () => void): (() => void) => {
56
+ const sub = emitter.addListener(NamiPaywallManagerEvents.Close, callback);
57
+ RNNamiPaywallManager.registerCloseHandler?.();
58
+ return () => sub.remove();
79
59
  },
80
- registerBuySkuHandler: (callback: (sku: NamiSKU) => void) => {
81
- let subscription = NamiPaywallManager.paywallEmitter.addListener(
82
- NamiPaywallManagerEvents.RegisterBuySKU,
83
- sku => {
84
- callback(sku);
85
- },
86
- );
87
- RNNamiPaywallManager.registerBuySkuHandler();
88
- return () => {
89
- if (subscription) {
90
- subscription.remove();
91
- }
92
- };
93
- },
94
- registerCloseHandler: (callback: (body: any) => void) => {
95
- let subscription = NamiPaywallManager.paywallEmitter.addListener(
96
- NamiPaywallManagerEvents.PaywallCloseRequested,
97
- body => {
98
- callback(body);
99
- },
100
- );
101
- RNNamiPaywallManager.registerCloseHandler();
102
- return () => {
103
- if (subscription) {
104
- subscription.remove();
105
- }
106
- };
107
- },
108
- registerSignInHandler(callback) {
109
- let subscription = NamiPaywallManager.paywallEmitter.addListener(
110
- NamiPaywallManagerEvents.PaywallSignInRequested,
111
- () => {
112
- callback();
113
- },
114
- );
115
- RNNamiPaywallManager.registerSignInHandler();
116
-
117
- return () => {
118
- if (subscription) {
119
- subscription.remove();
120
- }
121
- };
122
- },
123
- registerRestoreHandler(callback) {
124
- let subscription = NamiPaywallManager.paywallEmitter.addListener(
125
- NamiPaywallManagerEvents.PaywallRestoreRequested,
126
- () => {
127
- callback();
128
- },
129
- );
130
- RNNamiPaywallManager.registerRestoreHandler();
131
- return () => {
132
- if (subscription) {
133
- subscription.remove();
134
- }
135
- };
136
- },
137
- registerDeeplinkActionHandler: (callback: (url: string) => void) => {
138
- let subscription = NamiPaywallManager.paywallEmitter.addListener(
139
- NamiPaywallManagerEvents.PaywallDeeplinkAction,
140
- url => {
141
- callback(url);
142
- },
60
+
61
+ registerSignInHandler: (callback: () => void): (() => void) => {
62
+ const sub = emitter.addListener(NamiPaywallManagerEvents.SignIn, callback);
63
+ RNNamiPaywallManager.registerSignInHandler?.();
64
+ return () => sub.remove();
65
+ },
66
+
67
+ registerRestoreHandler: (callback: () => void): (() => void) => {
68
+ const sub = emitter.addListener(NamiPaywallManagerEvents.Restore, callback);
69
+ RNNamiPaywallManager.registerRestoreHandler?.();
70
+ return () => sub.remove();
71
+ },
72
+
73
+ registerDeeplinkActionHandler: (
74
+ callback: (url: string) => void,
75
+ ): (() => void) => {
76
+ const sub = emitter.addListener(
77
+ NamiPaywallManagerEvents.DeeplinkAction,
78
+ callback,
143
79
  );
144
- RNNamiPaywallManager.registerDeeplinkActionHandler();
145
- return () => {
146
- if (subscription) {
147
- subscription.remove();
148
- }
149
- };
80
+ RNNamiPaywallManager.registerDeeplinkActionHandler?.();
81
+ return () => sub.remove();
150
82
  },
151
- dismiss: () => {
152
- return RNNamiPaywallManager.dismiss();
83
+
84
+ dismiss: async (): Promise<boolean> => {
85
+ await RNNamiPaywallManager.dismiss();
86
+ return true;
153
87
  },
154
- show: () => {
88
+
89
+ show: (): void => {
155
90
  RNNamiPaywallManager.show();
156
91
  },
157
- hide: () => {
92
+
93
+ hide: (): void => {
158
94
  RNNamiPaywallManager.hide();
159
95
  },
160
- isHidden: () => {
96
+
97
+ isHidden: async (): Promise<boolean> => {
161
98
  return RNNamiPaywallManager.isHidden();
162
99
  },
163
- isPaywallOpen: () => {
100
+
101
+ isPaywallOpen: async (): Promise<boolean> => {
164
102
  return RNNamiPaywallManager.isPaywallOpen();
165
103
  },
166
- setProductDetails: (productDetails: string, allowOffers: boolean) => {
104
+
105
+ buySkuCancel: (): void => {
106
+ RNNamiPaywallManager.buySkuCancel();
107
+ },
108
+
109
+ setProductDetails: (productDetails: string, allowOffers?: boolean): void => {
167
110
  RNNamiPaywallManager.setProductDetails(productDetails, allowOffers);
168
111
  },
169
- setAppSuppliedVideoDetails: (url: string, name?: string) => {
112
+
113
+ setAppSuppliedVideoDetails: (url: string, name?: string): void => {
170
114
  RNNamiPaywallManager.setAppSuppliedVideoDetails(url, name);
171
115
  },
172
- allowUserInteraction: (allowed: boolean) => {
116
+
117
+ allowUserInteraction: (allowed: boolean): void => {
173
118
  RNNamiPaywallManager.allowUserInteraction(allowed);
174
119
  },
175
120
  };