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
@@ -2,7 +2,7 @@
2
2
  // NamiCampaignManagerBridge.swift
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 Foundation
@@ -10,6 +10,12 @@ import NamiApple
10
10
  import os
11
11
  import React
12
12
 
13
+ #if RCT_NEW_ARCH_ENABLED
14
+ import React_RCTTurboModule
15
+
16
+ extension RNNamiCampaignManager: RCTTurboModule {}
17
+ #endif
18
+
13
19
  @objc(RNNamiCampaignManager)
14
20
  class RNNamiCampaignManager: RCTEventEmitter {
15
21
  public static var shared: RNNamiCampaignManager?
@@ -20,7 +26,7 @@ class RNNamiCampaignManager: RCTEventEmitter {
20
26
  }
21
27
 
22
28
  override func supportedEvents() -> [String]! {
23
- return ["AvailableCampaignsChanged", "ResultCampaign"]
29
+ return ["AvailableCampaignsChanged", "NamiPaywallEvent"]
24
30
  }
25
31
 
26
32
  private func campaignInToDictionary(_ campaign: NamiCampaign) -> NSDictionary {
@@ -42,66 +48,44 @@ class RNNamiCampaignManager: RCTEventEmitter {
42
48
  return false
43
49
  }
44
50
 
51
+ private func mapPaywallActionToJS(_ action: NamiPaywallAction) -> String {
52
+ switch action {
53
+ case .show_paywall: return "SHOW_PAYWALL"
54
+ case .close_paywall: return "CLOSE_PAYWALL"
55
+ case .restore_purchases: return "RESTORE_PURCHASES"
56
+ case .sign_in: return "SIGN_IN"
57
+ case .buy_sku: return "BUY_SKU"
58
+ case .select_sku: return "SELECT_SKU"
59
+ case .purchase_selected_sku: return "PURCHASE_SELECTED_SKU"
60
+ case .purchase_success: return "PURCHASE_SUCCESS"
61
+ case .purchase_pending: return "PURCHASE_PENDING"
62
+ case .purchase_deferred: return "PURCHASE_DEFERRED"
63
+ case .purchase_failed: return "PURCHASE_FAILED"
64
+ case .purchase_cancelled: return "PURCHASE_CANCELLED"
65
+ case .purchase_unknown: return "PURCHASE_UNKNOWN"
66
+ case .deeplink: return "DEEPLINK"
67
+ case .toggle_change: return "TOGGLE_CHANGE"
68
+ case .page_change: return "PAGE_CHANGE"
69
+ case .slide_change: return "SLIDE_CHANGE"
70
+ case .nami_collapsible_drawer_open: return "COLLAPSIBLE_DRAWER_OPEN"
71
+ case .nami_collapsible_drawer_close: return "COLLAPSIBLE_DRAWER_CLOSE"
72
+ case .video_play: return "VIDEO_STARTED"
73
+ case .video_pause: return "VIDEO_PAUSED"
74
+ case .video_resume: return "VIDEO_RESUMED"
75
+ case .video_end: return "VIDEO_ENDED"
76
+ case .video_change: return "VIDEO_CHANGED"
77
+ case .video_mute: return "VIDEO_MUTED"
78
+ case .video_unmute: return "VIDEO_UNMUTED"
79
+ @unknown default:
80
+ return "UNKNOWN"
81
+ }
82
+ }
83
+
45
84
  func handlePaywallAction(
46
85
  paywallEvent: NamiPaywallEvent
47
86
  ) {
48
- var actionString: String
49
- switch paywallEvent.action {
50
- case .show_paywall:
51
- actionString = "SHOW_PAYWALL"
52
- case .close_paywall:
53
- actionString = "CLOSE_PAYWALL"
54
- case .restore_purchases:
55
- actionString = "RESTORE_PURCHASES"
56
- case .sign_in:
57
- actionString = "SIGN_IN"
58
- case .buy_sku:
59
- actionString = "BUY_SKU"
60
- case .select_sku:
61
- actionString = "SELECT_SKU"
62
- case .purchase_selected_sku:
63
- actionString = "PURCHASE_SELECTED_SKU"
64
- case .purchase_success:
65
- actionString = "PURCHASE_SUCCESS"
66
- case .purchase_pending:
67
- actionString = "PURCHASE_PENDING"
68
- case .purchase_deferred:
69
- actionString = "PURCHASE_DEFERRED"
70
- case .purchase_failed:
71
- actionString = "PURCHASE_FAILED"
72
- case .purchase_cancelled:
73
- actionString = "PURCHASE_CANCELLED"
74
- case .purchase_unknown:
75
- actionString = "PURCHASE_UNKNOWN"
76
- case .deeplink:
77
- actionString = "DEEPLINK"
78
- case .toggle_change:
79
- actionString = "TOGGLE_CHANGE"
80
- case .page_change:
81
- actionString = "PAGE_CHANGE"
82
- case .slide_change:
83
- actionString = "SLIDE_CHANGE"
84
- case .nami_collapsible_drawer_open:
85
- actionString = "COLLAPSIBLE_DRAWER_OPEN"
86
- case .nami_collapsible_drawer_close:
87
- actionString = "COLLAPSIBLE_DRAWER_CLOSE"
88
- case .video_play:
89
- actionString = "VIDEO_STARTED"
90
- case .video_pause:
91
- actionString = "VIDEO_PAUSED"
92
- case .video_resume:
93
- actionString = "VIDEO_RESUMED"
94
- case .video_end:
95
- actionString = "VIDEO_ENDED"
96
- case .video_change:
97
- actionString = "VIDEO_CHANGED"
98
- case .video_mute:
99
- actionString = "VIDEO_MUTED"
100
- case .video_unmute:
101
- actionString = "VIDEO_UNMUTED"
102
- default:
103
- actionString = "UNKNOWN"
104
- }
87
+ let actionString = mapPaywallActionToJS(paywallEvent.action)
88
+
105
89
  let errorSting = paywallEvent.purchaseError?.localizedDescription
106
90
 
107
91
  let dictionaries = paywallEvent.purchases.map { purchase in RNNamiPurchaseManager.purchaseToPurchaseDict(purchase) }
@@ -155,7 +139,9 @@ class RNNamiCampaignManager: RCTEventEmitter {
155
139
  "timeSpentOnPaywall": paywallEvent.timeSpentOnPaywall,
156
140
  ]
157
141
 
158
- RNNamiCampaignManager.shared?.sendEvent(withName: "ResultCampaign", body: payload)
142
+ DispatchQueue.main.async {
143
+ RNNamiCampaignManager.shared?.sendEvent(withName: "NamiPaywallEvent", body: payload)
144
+ }
159
145
  }
160
146
 
161
147
  func handleLaunch(callback: @escaping RCTResponseSenderBlock, success: Bool, error: Error?) {
@@ -283,7 +269,9 @@ class RNNamiCampaignManager: RCTEventEmitter {
283
269
  func registerForAvailableCampaigns() {
284
270
  NamiCampaignManager.registerAvailableCampaignsHandler { availableCampaigns in
285
271
  let dictionaries = availableCampaigns.map { campaign in self.campaignInToDictionary(campaign) }
286
- RNNamiCampaignManager.shared?.sendEvent(withName: "AvailableCampaignsChanged", body: dictionaries)
272
+ DispatchQueue.main.async {
273
+ RNNamiCampaignManager.shared?.sendEvent(withName: "AvailableCampaignsChanged", body: dictionaries)
274
+ }
287
275
  }
288
276
  }
289
277
  }
@@ -2,7 +2,7 @@
2
2
  // NamiCustomerManager.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
7
 
8
8
  #import <React/RCTBridgeModule.h>
@@ -43,7 +43,7 @@ RCT_EXTERN_METHOD(registerAccountStateHandler)
43
43
 
44
44
 
45
45
  + (BOOL)requiresMainQueueSetup {
46
- return YES;
46
+ return NO;
47
47
  }
48
48
 
49
49
  @end
@@ -2,13 +2,19 @@
2
2
  // NamiCustomerManager.swift
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 Foundation
9
9
  import NamiApple
10
10
  import React
11
11
 
12
+ #if RCT_NEW_ARCH_ENABLED
13
+ import React_RCTTurboModule
14
+
15
+ extension RNNamiCustomerManager: RCTTurboModule {}
16
+ #endif
17
+
12
18
  @objc(RNNamiCustomerManager)
13
19
  class RNNamiCustomerManager: RCTEventEmitter {
14
20
  public static var shared: RNNamiCustomerManager?
@@ -119,7 +125,9 @@ class RNNamiCustomerManager: RCTEventEmitter {
119
125
  func registerJourneyStateHandler() {
120
126
  NamiCustomerManager.registerJourneyStateHandler { journeyState in
121
127
  let dictionary = self.journeyStateToDictionary(journeyState)
122
- RNNamiCustomerManager.shared?.sendEvent(withName: "JourneyStateChanged", body: dictionary)
128
+ DispatchQueue.main.async {
129
+ RNNamiCustomerManager.shared?.sendEvent(withName: "JourneyStateChanged", body: dictionary)
130
+ }
123
131
  }
124
132
  }
125
133
 
@@ -160,7 +168,9 @@ class RNNamiCustomerManager: RCTEventEmitter {
160
168
  "success": success,
161
169
  "error": error?._code as Any,
162
170
  ]
163
- RNNamiCustomerManager.shared?.sendEvent(withName: "AccountStateChanged", body: payload)
171
+ DispatchQueue.main.async {
172
+ RNNamiCustomerManager.shared?.sendEvent(withName: "AccountStateChanged", body: payload)
173
+ }
164
174
  }
165
175
  }
166
176
  }
@@ -2,8 +2,7 @@
2
2
  // NamiEntitlementManagerBridge.m
3
3
  // RNNami
4
4
  //
5
- // Created by Kendall Gelner on 4/8/20.
6
- // Copyright © 2020-2023 Nami ML Inc. All rights reserved.
5
+ // Copyright © 2020-2025 Nami ML Inc. All rights reserved.
7
6
  //
8
7
 
9
8
  #import <React/RCTBridgeModule.h>
@@ -21,7 +20,7 @@ RCT_EXTERN_METHOD(registerActiveEntitlementsHandler)
21
20
  RCT_EXTERN_METHOD(clearProvisionalEntitlementGrants)
22
21
 
23
22
  + (BOOL)requiresMainQueueSetup {
24
- return YES;
23
+ return NO;
25
24
  }
26
25
 
27
26
  @end
@@ -2,13 +2,18 @@
2
2
  // NamiEntitlementManagerBridge.swift
3
3
  // RNNami
4
4
  //
5
- // Copyright © 2023 Nami ML Inc.. All rights reserved.
5
+ // Copyright © 2023-2025 Nami ML Inc. All rights reserved.
6
6
  //
7
7
 
8
8
  import Foundation
9
9
  import NamiApple
10
10
  import React
11
11
 
12
+ #if RCT_NEW_ARCH_ENABLED
13
+ import React_RCTTurboModule
14
+ extension RNNamiEntitlementManager: RCTTurboModule {}
15
+ #endif
16
+
12
17
  @objc(RNNamiEntitlementManager)
13
18
  class RNNamiEntitlementManager: RCTEventEmitter {
14
19
  public static var shared: RNNamiEntitlementManager?
@@ -18,70 +23,74 @@ class RNNamiEntitlementManager: RCTEventEmitter {
18
23
  RNNamiEntitlementManager.shared = self
19
24
  }
20
25
 
26
+ override static func requiresMainQueueSetup() -> Bool {
27
+ return false
28
+ }
29
+
21
30
  override func supportedEvents() -> [String]! {
22
31
  return ["EntitlementsChanged"]
23
32
  }
24
33
 
25
- private func entitlementInToDictionary(_ entitlement: NamiEntitlement) -> NSDictionary {
26
- let activePurchasesDict: [NSDictionary] = entitlement.activePurchases.map { purchase in
27
- let dictionary = RNNamiPurchaseManager.purchaseToPurchaseDict(purchase)
28
- return dictionary
34
+ private func entitlementToDictionary(_ entitlement: NamiEntitlement) -> NSDictionary {
35
+ let activePurchases = entitlement.activePurchases.map {
36
+ RNNamiPurchaseManager.purchaseToPurchaseDict($0)
29
37
  }
30
38
 
31
- let purchasedSkusDict: [NSDictionary] = entitlement.purchasedSkus.map { sku in
32
- let dictionary = RNNamiPurchaseManager.skuToSKUDict(sku)
33
- return dictionary
39
+ let purchasedSkus = entitlement.purchasedSkus.map {
40
+ RNNamiPurchaseManager.skuToSKUDict($0)
34
41
  }
35
- let relatedSkusDict: [NSDictionary] = entitlement.relatedSkus.map { sku in
36
- let dictionary = RNNamiPurchaseManager.skuToSKUDict(sku)
37
- return dictionary
42
+
43
+ let relatedSkus = entitlement.relatedSkus.map {
44
+ RNNamiPurchaseManager.skuToSKUDict($0)
38
45
  }
39
46
 
40
47
  let dictionary: [String: Any?] = [
41
- "name": entitlement.name,
42
- "desc": entitlement.desc,
48
+ "name": entitlement.name ?? "",
49
+ "desc": entitlement.desc ?? "",
43
50
  "referenceId": entitlement.referenceId,
44
- "activePurchases": activePurchasesDict,
45
- "relatedSkus": relatedSkusDict,
46
- "purchasedSkus": purchasedSkusDict,
51
+ "activePurchases": activePurchases,
52
+ "relatedSkus": relatedSkus,
53
+ "purchasedSkus": purchasedSkus,
47
54
  ]
55
+
48
56
  return NSDictionary(dictionary: dictionary.compactMapValues { $0 })
49
57
  }
50
58
 
51
- @objc(isEntitlementActive:resolver:rejecter:)
52
- func isEntitlementActive(referenceId: String, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
53
- let isEntitlementActive = NamiEntitlementManager.isEntitlementActive(referenceId)
54
- resolve(isEntitlementActive)
59
+ @objc
60
+ func isEntitlementActive(_ referenceId: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter _: @escaping RCTPromiseRejectBlock) {
61
+ resolve(NamiEntitlementManager.isEntitlementActive(referenceId))
55
62
  }
56
63
 
57
- @objc(active:rejecter:)
58
- func active(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
59
- let entitlements = NamiEntitlementManager.active()
60
- let dictionaries: [NSDictionary] = entitlements.map { entitlement in
61
- let dictionary = self.entitlementInToDictionary(entitlement)
62
- return dictionary
64
+ @objc
65
+ func active(_ resolve: @escaping RCTPromiseResolveBlock,
66
+ rejecter _: @escaping RCTPromiseRejectBlock)
67
+ {
68
+ let entitlements = NamiEntitlementManager.active().map {
69
+ self.entitlementToDictionary($0)
63
70
  }
64
- resolve(dictionaries)
71
+ resolve(entitlements)
65
72
  }
66
73
 
67
- @objc(refresh)
74
+ @objc
68
75
  func refresh() {
69
- NamiEntitlementManager.refresh()
76
+ NamiEntitlementManager.refresh { entitlements in
77
+ let dicts = entitlements.map { self.entitlementToDictionary($0) }
78
+ DispatchQueue.main.async {
79
+ RNNamiEntitlementManager.shared?.sendEvent(withName: "EntitlementsChanged", body: dicts)
80
+ }
81
+ }
70
82
  }
71
83
 
72
- @objc(registerActiveEntitlementsHandler)
84
+ @objc
73
85
  func registerActiveEntitlementsHandler() {
74
- NamiEntitlementManager.registerActiveEntitlementsHandler { activeEntitlements in
75
- let dictionaries: [NSDictionary] = activeEntitlements.map { entitlement in
76
- let dictionary = self.entitlementInToDictionary(entitlement)
77
- return dictionary
86
+ NamiEntitlementManager.registerActiveEntitlementsHandler { entitlements in
87
+ let dicts = entitlements.map { self.entitlementToDictionary($0) }
88
+ DispatchQueue.main.async {
89
+ RNNamiEntitlementManager.shared?.sendEvent(withName: "EntitlementsChanged", body: dicts)
78
90
  }
79
- RNNamiEntitlementManager.shared?.sendEvent(withName: "EntitlementsChanged", body: dictionaries)
80
91
  }
81
92
  }
82
93
 
83
- @objc(clearProvisionalEntitlementGrants)
84
- func clearProvisionalEntitlementGrants() {
85
- NamiEntitlementManager.clearProvisionalEntitlementGrants()
86
- }
94
+ @objc
95
+ func clearProvisionalEntitlementGrants() {}
87
96
  }
@@ -10,11 +10,11 @@
10
10
 
11
11
  @interface RCT_EXTERN_MODULE(RNNamiFlowManager, RCTEventEmitter)
12
12
  RCT_EXTERN_METHOD(registerStepHandoff)
13
- RCT_EXTERN_METHOD(registerEventHandler:(RCTResponseSenderBlock)callback)
13
+ RCT_EXTERN_METHOD(registerEventHandler)
14
14
  RCT_EXTERN_METHOD(resume)
15
15
 
16
16
  + (BOOL)requiresMainQueueSetup {
17
- return YES;
17
+ return NO;
18
18
  }
19
19
 
20
20
  @end
@@ -19,11 +19,11 @@ class RNNamiFlowManager: RCTEventEmitter {
19
19
  }
20
20
 
21
21
  override static func requiresMainQueueSetup() -> Bool {
22
- return true
22
+ return false
23
23
  }
24
24
 
25
25
  override func supportedEvents() -> [String]! {
26
- return ["RegisterStepHandoff"]
26
+ return ["Handoff", "FlowEvent"]
27
27
  }
28
28
 
29
29
  @objc func registerStepHandoff() {
@@ -34,14 +34,18 @@ class RNNamiFlowManager: RCTEventEmitter {
34
34
  if let data = data {
35
35
  payload["handoffData"] = data
36
36
  }
37
- RNNamiFlowManager.shared?.sendEvent(withName: "RegisterStepHandoff", body: payload)
37
+
38
+ DispatchQueue.main.async {
39
+ RNNamiFlowManager.shared?.sendEvent(withName: "Handoff", body: payload)
40
+ }
38
41
  }
39
42
  }
40
43
 
41
- @objc(registerEventHandler:)
42
- func registerEventHandler(_ callback: @escaping RCTResponseSenderBlock) {
44
+ @objc func registerEventHandler() {
43
45
  NamiFlowManager.registerEventHandler { payload in
44
- callback([payload])
46
+ DispatchQueue.main.async {
47
+ RNNamiFlowManager.shared?.sendEvent(withName: "FlowEvent", body: payload)
48
+ }
45
49
  }
46
50
  }
47
51
 
@@ -1,8 +1,8 @@
1
1
  //
2
2
  // NamiPaywallManager.m
3
- // namiReactNative
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 <Foundation/Foundation.h>
@@ -46,7 +46,7 @@ RCT_EXTERN_METHOD(setAppSuppliedVideoDetails:(NSString *)url name:(nullable NSSt
46
46
  RCT_EXTERN_METHOD(allowUserInteraction:(BOOL *)allowed)
47
47
 
48
48
  + (BOOL)requiresMainQueueSetup {
49
- return YES;
49
+ return NO;
50
50
  }
51
51
 
52
52
  @end
@@ -2,7 +2,7 @@
2
2
  // NamiPaywallManagerBridge.swift
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 Foundation
@@ -72,7 +72,9 @@ class RNNamiPaywallManager: RCTEventEmitter {
72
72
  func registerBuySkuHandler() {
73
73
  NamiPaywallManager.registerBuySkuHandler { sku in
74
74
  let dictionary = RNNamiPurchaseManager.skuToSKUDict(sku)
75
- RNNamiPaywallManager.shared?.sendEvent(withName: "RegisterBuySKU", body: dictionary)
75
+ DispatchQueue.main.async {
76
+ RNNamiPaywallManager.shared?.sendEvent(withName: "RegisterBuySKU", body: dictionary)
77
+ }
76
78
  }
77
79
  }
78
80
 
@@ -80,7 +82,9 @@ class RNNamiPaywallManager: RCTEventEmitter {
80
82
  func registerCloseHandler() {
81
83
  NamiPaywallManager.registerCloseHandler { _ in
82
84
  let dictionary = NSDictionary(dictionary: ["PaywallCloseRequested": true].compactMapValues { $0 })
83
- RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallCloseRequested", body: dictionary)
85
+ DispatchQueue.main.async {
86
+ RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallCloseRequested", body: dictionary)
87
+ }
84
88
  }
85
89
  }
86
90
 
@@ -88,7 +92,9 @@ class RNNamiPaywallManager: RCTEventEmitter {
88
92
  func registerSignInHandler() {
89
93
  NamiPaywallManager.registerSignInHandler { _ in
90
94
  let dictionary = NSDictionary(dictionary: ["PaywallSignInRequested": true].compactMapValues { $0 })
91
- RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallSignInRequested", body: dictionary)
95
+ DispatchQueue.main.async {
96
+ RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallSignInRequested", body: dictionary)
97
+ }
92
98
  }
93
99
  }
94
100
 
@@ -96,14 +102,18 @@ class RNNamiPaywallManager: RCTEventEmitter {
96
102
  func registerRestoreHandler() {
97
103
  NamiPaywallManager.registerRestoreHandler {
98
104
  let dictionary = NSDictionary(dictionary: ["PaywallRestoreRequested": true].compactMapValues { $0 })
99
- RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallRestoreRequested", body: dictionary)
105
+ DispatchQueue.main.async {
106
+ RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallRestoreRequested", body: dictionary)
107
+ }
100
108
  }
101
109
  }
102
110
 
103
111
  @objc(registerDeeplinkActionHandler)
104
112
  func registerDeeplinkActionHandler() {
105
113
  NamiPaywallManager.registerDeeplinkActionHandler { url in
106
- RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallDeeplinkAction", body: url)
114
+ DispatchQueue.main.async {
115
+ RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallDeeplinkAction", body: url)
116
+ }
107
117
  }
108
118
  }
109
119
 
@@ -1,7 +1,8 @@
1
1
  //
2
2
  // NamiPurchaseManagerBridge.m
3
+ // RNNami
3
4
  //
4
- // Copyright © 2019 Nami ML Inc. All rights reserved.
5
+ // Copyright © 2020-2025 Nami ML Inc. All rights reserved.
5
6
  //
6
7
 
7
8
  #import <Foundation/Foundation.h>
@@ -31,7 +32,7 @@ RCT_EXTERN_METHOD(presentCodeRedemptionSheet)
31
32
  RCT_EXTERN_METHOD(restorePurchases)
32
33
 
33
34
  + (BOOL)requiresMainQueueSetup {
34
- return YES;
35
+ return NO;
35
36
  }
36
37
 
37
38
  @end
@@ -2,13 +2,18 @@
2
2
  // NamiPurchaseManagerBridge.swift
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 Foundation
9
9
  import NamiApple
10
10
  import React
11
11
 
12
+ #if RCT_NEW_ARCH_ENABLED
13
+ import React_RCTTurboModule
14
+ extension RNNamiPurchaseManager: RCTTurboModule {}
15
+ #endif
16
+
12
17
  @objc(RNNamiPurchaseManager)
13
18
  class RNNamiPurchaseManager: RCTEventEmitter {
14
19
  public static var shared: RNNamiPurchaseManager?
@@ -57,11 +62,12 @@ class RNNamiPurchaseManager: RCTEventEmitter {
57
62
  "id": sku.id,
58
63
  "skuId": sku.skuId,
59
64
  "type": typeString,
65
+ "name": sku.name ?? "",
60
66
  "appleProduct": productDict,
61
67
  ]
62
68
 
63
69
  if let promoId = sku.promoId {
64
- skuDict["promoId"] = sku.promoId
70
+ skuDict["promoId"] = promoId
65
71
  }
66
72
 
67
73
  return NSDictionary(dictionary: skuDict.compactMapValues { $0 })
@@ -72,19 +78,18 @@ class RNNamiPurchaseManager: RCTEventEmitter {
72
78
  if let sku = purchase.sku {
73
79
  skuDictionary = RNNamiPurchaseManager.skuToSKUDict(sku)
74
80
  }
75
- let dateFormatter = DateFormatter()
76
- dateFormatter.locale = .init(identifier: "en_US_POSIX")
77
- dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
78
- let expiresString = dateFormatter.string(from: purchase.expires ?? Date())
79
- let purchaseInitiatedString = dateFormatter.string(from: purchase.purchaseInitiatedTimestamp)
80
81
 
81
- let purchaseDict: [String: Any?] = [
82
+ var purchaseDict: [String: Any?] = [
82
83
  "skuId": purchase.skuId,
83
84
  "transactionIdentifier": purchase.transactionIdentifier,
84
85
  "sku": skuDictionary,
85
- "expires": expiresString,
86
- "purchaseInitiatedTimestamp": purchaseInitiatedString,
86
+ "purchaseInitiatedTimestamp": purchase.purchaseInitiatedTimestamp.timeIntervalSince1970 * 1000,
87
87
  ]
88
+
89
+ if let expires = purchase.expires {
90
+ purchaseDict["expires"] = expires.timeIntervalSince1970 * 1000
91
+ }
92
+
88
93
  return NSDictionary(dictionary: purchaseDict.compactMapValues { $0 })
89
94
  }
90
95
 
@@ -1,4 +1,2 @@
1
- //
2
- // Use this file to import your target's public headers that you would like to expose to Swift.
3
- //
4
1
  #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTEventEmitter.h>
package/package.json CHANGED
@@ -1,10 +1,21 @@
1
1
  {
2
2
  "name": "react-native-nami-sdk",
3
- "version": "3.3.0-beta.8",
3
+ "version": "3.3.0",
4
4
  "description": "React Native Module for Nami - Easy subscriptions & in-app purchases, with powerful built-in paywalls and A/B testing.",
5
5
  "main": "index.ts",
6
- "types": "index.d.ts",
6
+ "types": "dist/index.d.ts",
7
+ "codegenConfig": {
8
+ "name": "Nami",
9
+ "type": "modules",
10
+ "jsSrcsDir": "./specs",
11
+ "android": {
12
+ "javaPackageName": "com.namiml.reactnative"
13
+ }
14
+ },
7
15
  "scripts": {
16
+ "build": "tsc",
17
+ "generate:version": "ts-node scripts/generate-version.ts",
18
+ "prepare": "npm run generate:version && npm run build",
8
19
  "test": "echo \"Error: no test specified\" && exit 1",
9
20
  "android": "react-native run-android",
10
21
  "android-clean": "cd android && rm -rf .gradle && rm -rf .idea && rm -rf android.iml && rm -rf local.properties",
@@ -53,16 +64,17 @@
53
64
  "react-native": ">=0.73"
54
65
  },
55
66
  "devDependencies": {
56
- "@react-native-community/eslint-config": "^3.2.0",
57
- "@types/react-native": "^0.73.0",
58
- "@typescript-eslint/eslint-plugin": "^5.59.7",
59
- "eslint": "^8.41.0",
60
- "eslint-plugin-jest": "^27.2.2",
67
+ "@react-native/eslint-config": "^0.80.0",
61
68
  "@types/jest": "^29.5.2",
62
- "prettier": "^2.8.7",
69
+ "@types/react-native": "^0.73.0",
70
+ "eslint": "^8.57.1",
71
+ "eslint-plugin-prettier": "^5.5.0",
72
+ "eslint-plugin-react-hooks": "^5.2.0",
73
+ "prettier": "^3.6.0",
63
74
  "react": "^18.2.0",
64
75
  "react-native": "^0.73.0",
65
76
  "react-native-codegen": "^0.0.12",
77
+ "ts-node": "^10.9.2",
66
78
  "typescript": "^5.0.2"
67
79
  },
68
80
  "repository": {
@@ -0,0 +1,9 @@
1
+ module.exports = {
2
+ dependency: {
3
+ platforms: {
4
+ android: {
5
+ cmakeListsPath: '../android/src/main/jni/CMakeLists.txt',
6
+ },
7
+ },
8
+ },
9
+ };
@@ -17,10 +17,18 @@ Pod::Spec.new do |s|
17
17
 
18
18
 
19
19
  s.source = { :git => "https://github.com/namiml/react-native-nami-sdk.git", :tag => "#{s.version}" }
20
- s.source_files = "ios/**/*.{h,m,swift}"
21
- s.requires_arc = true
20
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
21
+ s.requires_arc = true
22
+ s.swift_version = '5.0' # or your supported version
22
23
 
23
- s.dependency 'Nami', '3.3.0-beta.06'
24
+ s.dependency 'Nami', '3.3.0.1'
24
25
  s.dependency 'React'
25
26
 
27
+ s.pod_target_xcconfig = {
28
+ "DEFINES_MODULE" => "YES",
29
+ "SWIFT_VERSION" => "5.0",
30
+ }
31
+
32
+ install_modules_dependencies(s)
33
+
26
34
  end