react-native-nami-sdk 3.3.0-beta.8 → 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 -60
  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
@@ -0,0 +1,71 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ buySkuComplete(purchase: {
4
+ product: {
5
+ id: string;
6
+ skuId: string;
7
+ name?: string;
8
+ type: string;
9
+ };
10
+ transactionID?: string;
11
+ originalTransactionID?: string;
12
+ orderId?: string;
13
+ purchaseToken?: string;
14
+ receiptId?: string;
15
+ localizedPrice?: string;
16
+ userId?: string;
17
+ marketplace?: string;
18
+ price?: string;
19
+ currencyCode?: string;
20
+ }): void;
21
+ buySkuCompleteApple(purchase: {
22
+ product: {
23
+ id: string;
24
+ skuId: string;
25
+ name?: string;
26
+ type: string;
27
+ };
28
+ transactionID: string;
29
+ originalTransactionID: string;
30
+ price: string;
31
+ currencyCode: string;
32
+ }): void;
33
+ buySkuCompleteAmazon(purchase: {
34
+ product: {
35
+ id: string;
36
+ skuId: string;
37
+ name?: string;
38
+ type: string;
39
+ };
40
+ receiptId: string;
41
+ localizedPrice: string;
42
+ userId: string;
43
+ marketplace: string;
44
+ }): void;
45
+ buySkuCompleteGooglePlay(purchase: {
46
+ product: {
47
+ id: string;
48
+ skuId: string;
49
+ name?: string;
50
+ type: string;
51
+ };
52
+ orderId: string;
53
+ purchaseToken: string;
54
+ }): void;
55
+ registerBuySkuHandler(): void;
56
+ registerCloseHandler(): void;
57
+ registerSignInHandler(): void;
58
+ registerRestoreHandler(): void;
59
+ registerDeeplinkActionHandler(): void;
60
+ dismiss(): Promise<void>;
61
+ show(): void;
62
+ hide(): void;
63
+ isHidden(): Promise<boolean>;
64
+ isPaywallOpen(): Promise<boolean>;
65
+ buySkuCancel(): void;
66
+ setProductDetails(productDetails: string, allowOffers?: boolean): void;
67
+ setAppSuppliedVideoDetails(url: string, name?: string): void;
68
+ allowUserInteraction(allowed: boolean): void;
69
+ }
70
+ declare const _default: Spec;
71
+ export default _default;
@@ -0,0 +1,28 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ allPurchases(): Promise<Array<{
4
+ skuId: string;
5
+ sku?: {
6
+ id: string;
7
+ skuId: string;
8
+ name?: string;
9
+ type: string;
10
+ promoId?: string;
11
+ promoToken?: string;
12
+ };
13
+ transactionIdentifier?: string;
14
+ purchaseToken?: string;
15
+ expires?: number;
16
+ purchaseInitiatedTimestamp: number;
17
+ purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
18
+ }>>;
19
+ skuPurchased(skuId: string): Promise<boolean>;
20
+ anySkuPurchased(skuIds: string[]): Promise<boolean>;
21
+ consumePurchasedSku(skuId: string): void;
22
+ presentCodeRedemptionSheet(): void;
23
+ restorePurchases(): void;
24
+ registerPurchasesChangedHandler(): void;
25
+ registerRestorePurchasesHandler(): void;
26
+ }
27
+ declare const _default: Spec;
28
+ export default _default;
@@ -0,0 +1,5 @@
1
+ import type { NamiConfiguration } from './types';
2
+ export declare const Nami: {
3
+ configure: (config: NamiConfiguration) => Promise<boolean>;
4
+ sdkConfigured: () => Promise<boolean>;
5
+ };
@@ -0,0 +1,29 @@
1
+ import { NativeEventEmitter } from 'react-native';
2
+ import type { PaywallLaunchContext, NamiCampaign } from './types';
3
+ export declare enum NamiCampaignManagerEvents {
4
+ AvailableCampaignsChanged = "AvailableCampaignsChanged",
5
+ NamiPaywallEvent = "NamiPaywallEvent"
6
+ }
7
+ export declare const NamiCampaignManager: {
8
+ emitter: NativeEventEmitter;
9
+ launchSubscription: ReturnType<NativeEventEmitter["addListener"]> | undefined;
10
+ launch(label: string | null, withUrl: string | null, context: PaywallLaunchContext | null, resultCallback?: (success: boolean, errorCode?: number | null) => void, actionCallback?: (event: any) => void): void;
11
+ allCampaigns: () => Promise<{
12
+ id?: string;
13
+ rule?: string;
14
+ segment?: string;
15
+ paywall?: string;
16
+ type: string;
17
+ value?: string;
18
+ }[]>;
19
+ isCampaignAvailable: (campaignName: string | null) => Promise<boolean>;
20
+ refresh: () => Promise<{
21
+ id?: string;
22
+ rule?: string;
23
+ segment?: string;
24
+ paywall?: string;
25
+ type: string;
26
+ value?: string;
27
+ }[]>;
28
+ registerAvailableCampaignsHandler: (callback: (campaigns: NamiCampaign[]) => void) => (() => void);
29
+ };
@@ -1,27 +1,25 @@
1
1
  import { NativeEventEmitter, EmitterSubscription } from 'react-native';
2
- import { AccountStateAction, CustomerJourneyState } from './types';
3
- export declare const RNNamiCustomerManager: any;
2
+ import type { AccountStateAction, CustomerJourneyState } from './types';
4
3
  export declare enum NamiCustomerManagerEvents {
5
4
  JourneyStateChanged = "JourneyStateChanged",
6
5
  AccountStateChanged = "AccountStateChanged"
7
6
  }
8
- export interface INamiCustomerManager {
7
+ export declare const NamiCustomerManager: {
9
8
  emitter: NativeEventEmitter;
9
+ login: (customerId: string) => void;
10
+ logout: () => void;
10
11
  setCustomerAttribute: (key: string, value: string) => void;
11
12
  getCustomerAttribute: (key: string) => Promise<string | undefined>;
12
13
  clearCustomerAttribute: (key: string) => void;
13
14
  clearAllCustomerAttributes: () => void;
14
- journeyState: () => Promise<CustomerJourneyState | undefined>;
15
+ journeyState: () => Promise<CustomerJourneyState>;
15
16
  isLoggedIn: () => Promise<boolean>;
16
17
  loggedInId: () => Promise<string | undefined>;
17
- deviceId: () => Promise<string>;
18
- login: (customerId: string) => void;
19
- logout: () => void;
20
- registerJourneyStateHandler: (callback: (journeyState: CustomerJourneyState) => void) => EmitterSubscription['remove'];
21
- registerAccountStateHandler: (callback: (action: AccountStateAction, success: boolean, error?: number) => void) => EmitterSubscription['remove'];
18
+ setCustomerDataPlatformId: (platformId: any) => void;
22
19
  clearCustomerDataPlatformId: () => void;
23
- setCustomerDataPlatformId: (platformId: string) => void;
24
- setAnonymousMode: (anonymousMode: boolean) => void;
20
+ setAnonymousMode: (anonymousMode: any) => void;
21
+ deviceId: () => Promise<string>;
25
22
  inAnonymousMode: () => Promise<boolean>;
26
- }
27
- export declare const NamiCustomerManager: INamiCustomerManager;
23
+ registerJourneyStateHandler: (callback: (state: CustomerJourneyState) => void) => EmitterSubscription["remove"];
24
+ registerAccountStateHandler: (callback: (action: AccountStateAction, success: boolean, error?: number) => void) => EmitterSubscription["remove"];
25
+ };
@@ -0,0 +1,13 @@
1
+ import { NativeEventEmitter, EmitterSubscription } from 'react-native';
2
+ import type { NamiEntitlement } from './types';
3
+ export declare enum NamiEntitlementManagerEvents {
4
+ EntitlementsChanged = "EntitlementsChanged"
5
+ }
6
+ export declare const NamiEntitlementManager: {
7
+ emitter: NativeEventEmitter;
8
+ active: () => Promise<NamiEntitlement[]>;
9
+ isEntitlementActive: (entitlementId: string) => Promise<boolean>;
10
+ refresh: (callback: (entitlements: NamiEntitlement[]) => void) => EmitterSubscription["remove"];
11
+ registerActiveEntitlementsHandler: (callback: (entitlements: NamiEntitlement[]) => void) => EmitterSubscription["remove"];
12
+ clearProvisionalEntitlementGrants: () => void;
13
+ };
@@ -0,0 +1,11 @@
1
+ import { NativeEventEmitter } from 'react-native';
2
+ export declare enum NamiFlowManagerEvents {
3
+ Handoff = "Handoff",
4
+ FlowEvent = "FlowEvent"
5
+ }
6
+ export declare const NamiFlowManager: {
7
+ emitter: NativeEventEmitter;
8
+ registerStepHandoff: (callback: (handoffTag: string, handoffData?: Record<string, unknown>) => void) => (() => void);
9
+ resume: () => void;
10
+ registerEventHandler: (callback: (payload: Record<string, unknown>) => void) => (() => void);
11
+ };
@@ -0,0 +1,30 @@
1
+ import { NativeEventEmitter } from 'react-native';
2
+ import type { NamiPurchaseDetails, NamiPurchaseSuccessApple, NamiPurchaseSuccessAmazon, NamiPurchaseSuccessGooglePlay, NamiSKU } from '../src/types';
3
+ export declare enum NamiPaywallManagerEvents {
4
+ BuySku = "RegisterBuySKU",
5
+ Close = "PaywallCloseRequested",
6
+ SignIn = "PaywallSignInRequested",
7
+ Restore = "PaywallRestoreRequested",
8
+ DeeplinkAction = "PaywallDeeplinkAction"
9
+ }
10
+ export declare const NamiPaywallManager: {
11
+ emitter: NativeEventEmitter;
12
+ buySkuComplete: (purchase: NamiPurchaseDetails) => void;
13
+ buySkuCompleteApple: (purchase: NamiPurchaseSuccessApple) => void;
14
+ buySkuCompleteAmazon: (purchase: NamiPurchaseSuccessAmazon) => void;
15
+ buySkuCompleteGooglePlay: (purchase: NamiPurchaseSuccessGooglePlay) => void;
16
+ registerBuySkuHandler: (callback: (sku: NamiSKU) => void) => (() => void);
17
+ registerCloseHandler: (callback: () => void) => (() => void);
18
+ registerSignInHandler: (callback: () => void) => (() => void);
19
+ registerRestoreHandler: (callback: () => void) => (() => void);
20
+ registerDeeplinkActionHandler: (callback: (url: string) => void) => (() => void);
21
+ dismiss: () => Promise<boolean>;
22
+ show: () => void;
23
+ hide: () => void;
24
+ isHidden: () => Promise<boolean>;
25
+ isPaywallOpen: () => Promise<boolean>;
26
+ buySkuCancel: () => void;
27
+ setProductDetails: (productDetails: string, allowOffers?: boolean) => void;
28
+ setAppSuppliedVideoDetails: (url: string, name?: string) => void;
29
+ allowUserInteraction: (allowed: boolean) => void;
30
+ };
@@ -0,0 +1,17 @@
1
+ import { NativeEventEmitter } from 'react-native';
2
+ import { NamiPurchase, NamiPurchasesState, NamiRestorePurchasesState } from './types';
3
+ export declare enum NamiPurchaseManagerEvents {
4
+ PurchasesChanged = "PurchasesChanged",
5
+ RestorePurchasesStateChanged = "RestorePurchasesStateChanged"
6
+ }
7
+ export declare const NamiPurchaseManager: {
8
+ emitter: NativeEventEmitter;
9
+ allPurchases: () => Promise<NamiPurchase[]>;
10
+ skuPurchased: (skuId: string) => Promise<boolean>;
11
+ anySkuPurchased: (skuIds: string[]) => Promise<boolean>;
12
+ consumePurchasedSku: (skuId: string) => void;
13
+ presentCodeRedemptionSheet: () => void;
14
+ restorePurchases: () => void;
15
+ registerPurchasesChangedHandler: (callback: (state: NamiPurchasesState, purchases: NamiPurchase[], error: string) => void) => (() => void);
16
+ registerRestorePurchasesHandler: (callback: (state: NamiRestorePurchasesState, newPurchases: NamiPurchase[], oldPurchases: NamiPurchase[]) => void) => (() => void);
17
+ };
@@ -0,0 +1,3 @@
1
+ import type { NamiPurchase, NamiSKUType } from './types';
2
+ export declare function parsePurchaseDates(purchase: any): NamiPurchase;
3
+ export declare function coerceSkuType(raw: string): NamiSKUType;
@@ -1,6 +1,5 @@
1
1
  export type NamiConfiguration = {
2
- 'appPlatformID-apple': string;
3
- 'appPlatformID-android': string;
2
+ appPlatformID: string;
4
3
  logLevel: string;
5
4
  namiCommands?: string[];
6
5
  namiLanguageCode?: NamiLanguageCodes;
@@ -44,8 +43,8 @@ export type AppleProduct = {
44
43
  priceCurrency: string;
45
44
  priceLanguage: string;
46
45
  };
47
- export type GoogleProduct = {};
48
- export type AmazonProduct = {};
46
+ export type GoogleProduct = Record<string, never>;
47
+ export type AmazonProduct = Record<string, never>;
49
48
  export type NamiCampaign = {
50
49
  name: string;
51
50
  rule: string;
@@ -91,7 +90,7 @@ export type PaywallLaunchContext = {
91
90
  [key: string]: string;
92
91
  };
93
92
  customObject?: {
94
- [key: string]: any;
93
+ [key: string]: unknown;
95
94
  };
96
95
  };
97
96
  export type CustomerJourneyState = {
@@ -108,11 +107,23 @@ export type NamiEntitlement = {
108
107
  activePurchases: NamiPurchase[];
109
108
  desc: string;
110
109
  name: string;
111
- namiId: string;
112
110
  purchasedSkus: NamiSKU[];
113
111
  referenceId: string;
114
112
  relatedSkus: NamiSKU[];
115
113
  };
114
+ export type NamiPurchaseDetails = {
115
+ product: NamiSKU;
116
+ transactionID?: string;
117
+ originalTransactionID?: string;
118
+ orderId?: string;
119
+ purchaseToken?: string;
120
+ receiptId?: string;
121
+ localizedPrice?: string;
122
+ price?: string;
123
+ currencyCode?: string;
124
+ userId?: string;
125
+ marketplace?: string;
126
+ };
116
127
  export type NamiPurchaseSuccessApple = {
117
128
  product: NamiSKU;
118
129
  transactionID: string;
@@ -170,6 +181,15 @@ export type NamiPurchase = {
170
181
  purchaseInitiatedTimestamp: Date;
171
182
  purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
172
183
  };
184
+ export type NamiPurchaseFromBridge = {
185
+ sku?: NamiSKU;
186
+ skuId: string;
187
+ transactionIdentifier?: string;
188
+ purchaseToken?: string;
189
+ expires?: number;
190
+ purchaseInitiatedTimestamp: number;
191
+ purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
192
+ };
173
193
  export type NamiPurchasesState = 'pending' | 'purchased' | 'consumed' | 'resubscribed' | 'unsubscribed' | 'deferred' | 'failed' | 'cancelled' | 'unknown';
174
194
  export type NamiPaywallEvent = {
175
195
  action: NamiPaywallAction;
@@ -205,4 +225,13 @@ export type NamiPaywallEventVideoMetadata = {
205
225
  contentTimecode?: number;
206
226
  contentDuration?: number;
207
227
  };
228
+ export type NamiFlowHandoffPayload = {
229
+ handoffTag: string;
230
+ handoffData?: Record<string, unknown>;
231
+ };
232
+ export type NamiAccountStateEvent = {
233
+ action: AccountStateAction;
234
+ success: boolean;
235
+ error?: number;
236
+ };
208
237
  export {};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Auto-generated file. Do not edit manually.
3
+ * React Native Nami SDK version.
4
+ */
5
+ export declare const NAMI_REACT_NATIVE_VERSION = "3.3.0";
package/index.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  export { Nami } from './src/Nami';
2
- export { NamiMLManager } from './src/NamiMLManager';
3
2
  export { NamiCampaignManager } from './src/NamiCampaignManager';
4
3
  export { NamiCustomerManager } from './src/NamiCustomerManager';
5
4
  export { NamiEntitlementManager } from './src/NamiEntitlementManager';
6
- export { NamiManager } from './src/NamiManager';
7
5
  export { NamiPurchaseManager } from './src/NamiPurchaseManager';
8
6
  export { NamiPaywallManager } from './src/NamiPaywallManager';
9
7
  export { NamiFlowManager } from './src/NamiFlowManager';
package/ios/Nami.m CHANGED
@@ -2,100 +2,20 @@
2
2
  // Nami.m
3
3
  // RNNami
4
4
  //
5
- // Copyright © 2020-2023 Nami ML Inc. All rights reserved.
5
+ // Copyright © 2020-2025 Nami ML Inc. All rights reserved.
6
6
  //
7
-
8
- #import <Foundation/Foundation.h>
9
- #import <NamiApple/NamiApple.h>
10
-
11
7
  #import <React/RCTBridgeModule.h>
12
- #import <React/RCTEventEmitter.h>
13
-
14
- #import "React/RCTViewManager.h"
15
-
16
-
17
-
18
- @interface NamiBridge : NSObject <RCTBridgeModule>
19
- @end
20
- @implementation NamiBridge (RCTExternModule)
21
-
22
- RCT_EXPORT_METHOD(configure: (NSDictionary *)configDict completion: (RCTResponseSenderBlock) completion) {
23
- NSString *appID = configDict[@"appPlatformID-apple"];
24
-
25
- if ([appID length] > 0 ) {
26
- NamiConfiguration *config = [NamiConfiguration configurationForAppPlatformId:appID];
27
- NSLog(@"NAMI: RN Bridge - appPlatformId: %@", appID);
28
-
29
- NSString *logLevelString = configDict[@"logLevel"];
30
- if ([logLevelString isEqualToString:@"ERROR" ]) {
31
- config.logLevel = NamiLogLevelError;
32
- } else if ([logLevelString isEqualToString:@"INFO" ]) {
33
- config.logLevel = NamiLogLevelInfo;
34
- } else if ([logLevelString isEqualToString:@"WARNING" ]) {
35
- config.logLevel = NamiLogLevelWarn;
36
- } else {
37
- // If they messed up the params, just set logging to full.
38
- config.logLevel = NamiLogLevelDebug;
39
- }
40
8
 
41
- NSString *languageString = configDict[@"namiLanguageCode"];
42
- if ([languageString length] > 0) {
43
- NSLog(@"NAMI: RN Bridge - language code: %@", languageString);
44
- if ([[NamiLanguageCodes allAvailableNamiLanguageCodes]
45
- containsObject:[languageString lowercaseString]] ) {
46
- config.namiLanguageCode = languageString;
47
- } else {
48
- NSLog(@"Warning: Nami language code from config dictionary %@ not found in list of available Nami Language Codes:\n%@", languageString, [NamiLanguageCodes allAvailableNamiLanguageCodes]);
49
- }
50
- }
9
+ @interface RCT_EXTERN_MODULE(RNNami, NSObject)
51
10
 
52
- // Start commands with header iformation for Nami to let them know this is a React client.
53
- NSMutableArray *namiCommandStrings = [NSMutableArray arrayWithArray:@[@"extendedClientInfo:react-native:3.3.0-beta.3"]];
11
+ RCT_EXTERN_METHOD(configure:(NSDictionary *)configDict
12
+ resolver:(RCTPromiseResolveBlock)resolve
13
+ rejecter:(RCTPromiseRejectBlock)reject)
54
14
 
55
- // Add additional namiCommands app may have sent in.
56
- NSObject *appCommandStrings = configDict[@"namiCommands"];
57
- if ( appCommandStrings != NULL ) {
58
- NSLog(@"NAMI: RN Bridge - additional config settings %@", configDict[@"namiCommands"]);
59
- if ([appCommandStrings isKindOfClass:[NSArray class]] ) {
60
- for (NSObject *commandObj in ((NSArray *)appCommandStrings)){
61
- if ([commandObj isKindOfClass:[NSString class]]) {
62
- [namiCommandStrings addObject:(NSString *)commandObj];
63
- }
64
- }
65
- }
66
- }
67
-
68
- config.namiCommands = namiCommandStrings;
69
-
70
- NSString *initialConfigString = configDict[@"initialConfig"];
71
- if ([initialConfigString length] > 0) {
72
- NSLog(@"NAMI: RN Bridge - Found an initialConfig file to use for Nami SDK setup.");
73
- config.initialConfig = initialConfigString;
74
- }
75
-
76
- [Nami configureWith:config :^(BOOL sdkConfigured) {
77
- if ( sdkConfigured == YES ) {
78
- NSDictionary *dict = @{@"success": @YES};
79
- completion(@[dict]);
80
- } else {
81
- NSDictionary *dict = @{@"success": @NO};
82
- completion(@[dict]);
83
- }
84
- }];
85
- }
86
- }
87
-
88
- @end
89
-
90
- @implementation NamiBridge
91
- RCT_EXPORT_MODULE_NO_LOAD(NamiBridge, NamiBridge)
92
-
93
- - (dispatch_queue_t)methodQueue
94
- {
95
- return dispatch_get_main_queue();
96
- }
15
+ RCT_EXTERN_METHOD(sdkConfigured:(RCTPromiseResolveBlock)resolve
16
+ rejecter:(RCTPromiseRejectBlock)reject)
97
17
 
98
18
  + (BOOL)requiresMainQueueSetup {
99
- return YES;
19
+ return NO;
100
20
  }
101
21
  @end
package/ios/Nami.swift ADDED
@@ -0,0 +1,85 @@
1
+ //
2
+ // Nami.swift
3
+ // RNNami
4
+ //
5
+ // Copyright © 2020-2025 Nami ML Inc. All rights reserved.
6
+ //
7
+ import Foundation
8
+ import NamiApple
9
+ import React
10
+
11
+ #if RCT_NEW_ARCH_ENABLED
12
+ import React_RCTTurboModule
13
+
14
+ extension RNNami: RCTTurboModule {}
15
+ #endif
16
+
17
+ @objc(RNNami)
18
+ class RNNami: NSObject {
19
+ static func moduleName() -> String! {
20
+ return "RNNami"
21
+ }
22
+
23
+ @objc
24
+ func configure(
25
+ _ configDict: NSDictionary,
26
+ resolver resolve: @escaping RCTPromiseResolveBlock,
27
+ rejecter reject: @escaping RCTPromiseRejectBlock
28
+ ) {
29
+ guard let appID = configDict["appPlatformID"] as? String, !appID.isEmpty else {
30
+ reject("missing_app_id", "The appPlatformID is required.", nil)
31
+ return
32
+ }
33
+
34
+ let config = NamiConfiguration(appPlatformId: appID)
35
+ NSLog("RNNami: Configure with appPlatformId: %@", appID)
36
+
37
+ if isNewArchitectureEnabled() {
38
+ NSLog("RNNami: New Architecture is ENABLED")
39
+ } else {
40
+ NSLog("RNNami: New Architecture is DISABLED")
41
+ }
42
+
43
+ if let logLevelString = configDict["logLevel"] as? String {
44
+ config.logLevel = {
45
+ switch logLevelString.uppercased() {
46
+ case "ERROR": return .error
47
+ case "INFO": return .info
48
+ case "WARNING": return .warn
49
+ default: return .debug
50
+ }
51
+ }()
52
+ }
53
+
54
+ if let languageCode = configDict["namiLanguageCode"] as? String,
55
+ NamiLanguageCodes.allAvailableNamiLanguageCodes.contains(where: { $0.caseInsensitiveCompare(languageCode) == .orderedSame })
56
+ {
57
+ config.namiLanguageCode = languageCode
58
+ }
59
+
60
+ if let commands = configDict["namiCommands"] as? [String] {
61
+ config.namiCommands = commands
62
+ }
63
+
64
+ if let initialConfig = configDict["initialConfig"] as? String {
65
+ config.initialConfig = initialConfig
66
+ }
67
+
68
+ Nami.configure(with: config) { sdkConfigured in
69
+ resolve(["success": sdkConfigured])
70
+ }
71
+ }
72
+
73
+ @objc
74
+ func sdkConfigured(_ resolve: RCTPromiseResolveBlock, rejecter _: RCTPromiseRejectBlock) {
75
+ resolve(Nami.sdkConfigured())
76
+ }
77
+
78
+ func isNewArchitectureEnabled() -> Bool {
79
+ #if RCT_NEW_ARCH_ENABLED
80
+ return true
81
+ #else
82
+ return false
83
+ #endif
84
+ }
85
+ }
@@ -1,8 +1,8 @@
1
1
  //
2
- // NamiCampaignManager.m
2
+ // NamiCampaignManagerBridge.m
3
3
  // RNNami
4
4
  //
5
- // Copyright © 2023 Nami ML INc.. All rights reserved.
5
+ // Copyright © 2020-2025 Nami ML Inc. All rights reserved.
6
6
  //
7
7
 
8
8
  #import <React/RCTBridgeModule.h>
@@ -20,7 +20,7 @@ RCT_EXTERN_METHOD(refresh:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRe
20
20
  RCT_EXTERN_METHOD(registerAvailableCampaignsHandler)
21
21
 
22
22
  + (BOOL)requiresMainQueueSetup {
23
- return YES;
23
+ return NO;
24
24
  }
25
25
 
26
26
  @end