react-native-nami-sdk 3.3.0-beta.8 → 3.3.1

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 +97 -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 +25 -32
  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 +79 -0
  15. package/android/src/main/java/com/namiml/reactnative/NamiPaywallManagerBridgeModule.kt +197 -0
  16. package/android/src/main/java/com/namiml/reactnative/NamiPurchaseManagerBridge.kt +107 -0
  17. package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiUtil.kt +61 -23
  18. package/{index.d.ts → dist/index.d.ts} +0 -2
  19. package/dist/specs/NativeNami.d.ts +16 -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 +10 -0
  24. package/dist/specs/NativeNamiPaywallManager.d.ts +72 -0
  25. package/dist/specs/NativeNamiPurchaseManager.d.ts +27 -0
  26. package/dist/src/Nami.d.ts +6 -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 +13 -0
  31. package/dist/src/NamiPaywallManager.d.ts +30 -0
  32. package/dist/src/NamiPurchaseManager.d.ts +16 -0
  33. package/dist/src/transformers.d.ts +3 -0
  34. package/{src → dist/src}/types.d.ts +36 -6
  35. package/dist/src/version.d.ts +5 -0
  36. package/index.ts +0 -2
  37. package/ios/Nami.m +9 -87
  38. package/ios/Nami.swift +89 -0
  39. package/ios/NamiCampaignManagerBridge.m +3 -3
  40. package/ios/NamiCampaignManagerBridge.swift +47 -61
  41. package/ios/NamiCustomerManager.m +2 -2
  42. package/ios/NamiCustomerManager.swift +11 -3
  43. package/ios/NamiEntitlementManagerBridge.m +2 -3
  44. package/ios/NamiEntitlementManagerBridge.swift +47 -39
  45. package/ios/NamiFlowManagerBridge.m +4 -2
  46. package/ios/NamiFlowManagerBridge.swift +27 -6
  47. package/ios/NamiPaywallManagerBridge.m +3 -3
  48. package/ios/NamiPaywallManagerBridge.swift +24 -6
  49. package/ios/NamiPurchaseManagerBridge.m +3 -4
  50. package/ios/NamiPurchaseManagerBridge.swift +14 -15
  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 +17 -3
  55. package/scripts/generate-version.ts +18 -0
  56. package/specs/NativeNami.ts +17 -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 +13 -0
  61. package/specs/NativeNamiPaywallManager.ts +86 -0
  62. package/specs/NativeNamiPurchaseManager.ts +32 -0
  63. package/src/Nami.ts +31 -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 +42 -44
  68. package/src/NamiPaywallManager.ts +84 -139
  69. package/src/NamiPurchaseManager.ts +66 -70
  70. package/src/transformers.ts +21 -0
  71. package/src/types.ts +40 -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,29 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ setCustomerAttribute(key: string, value: string): void;
4
+ getCustomerAttribute(key: string): Promise<string | null>;
5
+ clearCustomerAttribute(key: string): void;
6
+ clearAllCustomerAttributes(): void;
7
+ setCustomerDataPlatformId(platformId: string): void;
8
+ clearCustomerDataPlatformId(): void;
9
+ setAnonymousMode(anonymousMode: boolean): void;
10
+ inAnonymousMode(): Promise<boolean>;
11
+ journeyState(): Promise<{
12
+ formerSubscriber: boolean;
13
+ inGracePeriod: boolean;
14
+ inTrialPeriod: boolean;
15
+ inIntroOfferPeriod: boolean;
16
+ isCancelled: boolean;
17
+ inPause: boolean;
18
+ inAccountHold: boolean;
19
+ }>;
20
+ isLoggedIn(): Promise<boolean>;
21
+ loggedInId(): Promise<string | null>;
22
+ deviceId(): Promise<string>;
23
+ login(customerId: string): void;
24
+ logout(): void;
25
+ registerJourneyStateHandler(): void;
26
+ registerAccountStateHandler(): void;
27
+ }
28
+ declare const _default: Spec;
29
+ export default _default;
@@ -0,0 +1,45 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ isEntitlementActive(referenceId?: string): Promise<boolean>;
4
+ active(): Promise<Array<{
5
+ referenceId: string;
6
+ desc?: string;
7
+ name?: string;
8
+ purchasedSkus: Array<{
9
+ id: string;
10
+ skuId: string;
11
+ name?: string;
12
+ type: string;
13
+ promoId?: string;
14
+ promoToken?: string;
15
+ }>;
16
+ relatedSkus: Array<{
17
+ id: string;
18
+ skuId: string;
19
+ name?: string;
20
+ type: string;
21
+ promoId?: string;
22
+ promoToken?: string;
23
+ }>;
24
+ activePurchases: Array<{
25
+ skuId: string;
26
+ transactionIdentifier?: string;
27
+ expires?: string;
28
+ purchaseInitiatedTimestamp: string;
29
+ purchaseSource?: string;
30
+ sku?: {
31
+ id: string;
32
+ skuId: string;
33
+ name?: string;
34
+ type: string;
35
+ promoId?: string;
36
+ promoToken?: string;
37
+ };
38
+ }>;
39
+ }>>;
40
+ refresh(): void;
41
+ registerActiveEntitlementsHandler(): void;
42
+ clearProvisionalEntitlementGrants(): void;
43
+ }
44
+ declare const _default: Spec;
45
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ finish(): void;
4
+ isFlowOpen(): Promise<boolean>;
5
+ registerStepHandoff(): void;
6
+ resume(): void;
7
+ registerEventHandler(): void;
8
+ }
9
+ declare const _default: Spec;
10
+ export default _default;
@@ -0,0 +1,72 @@
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
+ storeType?: string;
21
+ }): void;
22
+ buySkuCompleteApple(purchase: {
23
+ product: {
24
+ id: string;
25
+ skuId: string;
26
+ name?: string;
27
+ type: string;
28
+ };
29
+ transactionID: string;
30
+ originalTransactionID: string;
31
+ price: string;
32
+ currencyCode: string;
33
+ }): void;
34
+ buySkuCompleteAmazon(purchase: {
35
+ product: {
36
+ id: string;
37
+ skuId: string;
38
+ name?: string;
39
+ type: string;
40
+ };
41
+ receiptId: string;
42
+ localizedPrice: string;
43
+ userId: string;
44
+ marketplace: string;
45
+ }): void;
46
+ buySkuCompleteGooglePlay(purchase: {
47
+ product: {
48
+ id: string;
49
+ skuId: string;
50
+ name?: string;
51
+ type: string;
52
+ };
53
+ orderId: string;
54
+ purchaseToken: string;
55
+ }): void;
56
+ registerBuySkuHandler(): void;
57
+ registerCloseHandler(): void;
58
+ registerSignInHandler(): void;
59
+ registerRestoreHandler(): void;
60
+ registerDeeplinkActionHandler(): void;
61
+ dismiss(): Promise<void>;
62
+ show(): void;
63
+ hide(): void;
64
+ isHidden(): Promise<boolean>;
65
+ isPaywallOpen(): Promise<boolean>;
66
+ buySkuCancel(): void;
67
+ setProductDetails(productDetails: string, allowOffers?: boolean): void;
68
+ setAppSuppliedVideoDetails(url: string, name?: string): void;
69
+ allowUserInteraction(allowed: boolean): void;
70
+ }
71
+ declare const _default: Spec;
72
+ export default _default;
@@ -0,0 +1,27 @@
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
+ presentCodeRedemptionSheet(): void;
22
+ restorePurchases(): void;
23
+ registerPurchasesChangedHandler(): void;
24
+ registerRestorePurchasesHandler(): void;
25
+ }
26
+ declare const _default: Spec;
27
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import type { NamiConfiguration } from './types';
2
+ export declare const Nami: {
3
+ configure: (config: NamiConfiguration) => Promise<boolean>;
4
+ sdkConfigured: () => Promise<boolean>;
5
+ sdkVersion: () => Promise<string>;
6
+ };
@@ -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,13 @@
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
+ finish: () => void;
12
+ isFlowOpen: () => Promise<boolean>;
13
+ };
@@ -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,16 @@
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
+ presentCodeRedemptionSheet: () => void;
13
+ restorePurchases: () => void;
14
+ registerPurchasesChangedHandler: (callback: (state: NamiPurchasesState, purchases: NamiPurchase[], error: string) => void) => (() => void);
15
+ registerRestorePurchasesHandler: (callback: (state: NamiRestorePurchasesState, newPurchases: NamiPurchase[], oldPurchases: NamiPurchase[]) => void) => (() => void);
16
+ };
@@ -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,24 @@ 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
+ storeType?: string;
127
+ };
116
128
  export type NamiPurchaseSuccessApple = {
117
129
  product: NamiSKU;
118
130
  transactionID: string;
@@ -170,6 +182,15 @@ export type NamiPurchase = {
170
182
  purchaseInitiatedTimestamp: Date;
171
183
  purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
172
184
  };
185
+ export type NamiPurchaseFromBridge = {
186
+ sku?: NamiSKU;
187
+ skuId: string;
188
+ transactionIdentifier?: string;
189
+ purchaseToken?: string;
190
+ expires?: number;
191
+ purchaseInitiatedTimestamp: number;
192
+ purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
193
+ };
173
194
  export type NamiPurchasesState = 'pending' | 'purchased' | 'consumed' | 'resubscribed' | 'unsubscribed' | 'deferred' | 'failed' | 'cancelled' | 'unknown';
174
195
  export type NamiPaywallEvent = {
175
196
  action: NamiPaywallAction;
@@ -205,4 +226,13 @@ export type NamiPaywallEventVideoMetadata = {
205
226
  contentTimecode?: number;
206
227
  contentDuration?: number;
207
228
  };
229
+ export type NamiFlowHandoffPayload = {
230
+ handoffTag: string;
231
+ handoffData?: Record<string, unknown>;
232
+ };
233
+ export type NamiAccountStateEvent = {
234
+ action: AccountStateAction;
235
+ success: boolean;
236
+ error?: number;
237
+ };
208
238
  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.1";
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,22 @@
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
8
 
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
- }
9
+ @interface RCT_EXTERN_MODULE(RNNami, NSObject)
40
10
 
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
- }
11
+ RCT_EXTERN_METHOD(configure:(NSDictionary *)configDict
12
+ resolver:(RCTPromiseResolveBlock)resolve
13
+ rejecter:(RCTPromiseRejectBlock)reject)
51
14
 
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"]];
15
+ RCT_EXTERN_METHOD(sdkConfigured:(RCTPromiseResolveBlock)resolve
16
+ rejecter:(RCTPromiseRejectBlock)reject)
54
17
 
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
- }
18
+ RCT_EXTERN_METHOD(sdkVersion:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
97
19
 
98
20
  + (BOOL)requiresMainQueueSetup {
99
- return YES;
21
+ return NO;
100
22
  }
101
23
  @end
package/ios/Nami.swift ADDED
@@ -0,0 +1,89 @@
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
+ // extension RNNami: RCTTurboModule {}
13
+ // #endif
14
+
15
+ @objc(RNNami)
16
+ class RNNami: NSObject {
17
+ static func moduleName() -> String! {
18
+ return "RNNami"
19
+ }
20
+
21
+ @objc
22
+ func configure(
23
+ _ configDict: NSDictionary,
24
+ resolver resolve: @escaping RCTPromiseResolveBlock,
25
+ rejecter reject: @escaping RCTPromiseRejectBlock
26
+ ) {
27
+ guard let appID = configDict["appPlatformID"] as? String, !appID.isEmpty else {
28
+ reject("missing_app_id", "The appPlatformID is required.", nil)
29
+ return
30
+ }
31
+
32
+ let config = NamiConfiguration(appPlatformId: appID)
33
+ NSLog("RNNami: Configure with appPlatformId: %@", appID)
34
+
35
+ if isNewArchitectureEnabled() {
36
+ NSLog("RNNami: New Architecture is ENABLED")
37
+ } else {
38
+ NSLog("RNNami: New Architecture is DISABLED")
39
+ }
40
+
41
+ if let logLevelString = configDict["logLevel"] as? String {
42
+ config.logLevel = {
43
+ switch logLevelString.uppercased() {
44
+ case "ERROR": return .error
45
+ case "INFO": return .info
46
+ case "WARNING": return .warn
47
+ default: return .debug
48
+ }
49
+ }()
50
+ }
51
+
52
+ if let languageCode = configDict["namiLanguageCode"] as? String,
53
+ NamiLanguageCodes.allAvailableNamiLanguageCodes.contains(where: { $0.caseInsensitiveCompare(languageCode) == .orderedSame })
54
+ {
55
+ config.namiLanguageCode = languageCode
56
+ }
57
+
58
+ if let commands = configDict["namiCommands"] as? [String] {
59
+ config.namiCommands = commands
60
+ }
61
+
62
+ if let initialConfig = configDict["initialConfig"] as? String {
63
+ config.initialConfig = initialConfig
64
+ }
65
+
66
+ Nami.configure(with: config) { sdkConfigured in
67
+ resolve(["success": sdkConfigured])
68
+ }
69
+ }
70
+
71
+ @objc
72
+ func sdkConfigured(_ resolve: RCTPromiseResolveBlock, rejecter _: RCTPromiseRejectBlock) {
73
+ resolve(Nami.sdkConfigured())
74
+ }
75
+
76
+ @objc(sdkVersion:rejecter:)
77
+ func sdkVersion(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
78
+ let version = Nami.sdkVersion
79
+ resolve(version)
80
+ }
81
+
82
+ func isNewArchitectureEnabled() -> Bool {
83
+ #if RCT_NEW_ARCH_ENABLED
84
+ return true
85
+ #else
86
+ return false
87
+ #endif
88
+ }
89
+ }
@@ -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