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.
- package/.prettierrc +4 -0
- package/README.md +9 -9
- package/android/README.md +3 -2
- package/android/build.gradle +27 -19
- package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/android/gradlew +0 -0
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/java/com/namiml/reactnative/Constants.kt +3 -0
- package/android/src/main/java/com/namiml/reactnative/NamiBridgeModule.kt +91 -0
- package/android/src/main/java/com/namiml/reactnative/NamiBridgePackage.java +140 -0
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiCampaignManagerBridge.kt +24 -30
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiCustomerManagerBridge.kt +14 -6
- package/android/src/main/java/com/{nami/reactlibrary/NamiEntitlementManagerBridgeModule.kt → namiml/reactnative/NamiEntitlementManagerBridge.kt} +18 -8
- package/android/src/main/java/com/namiml/reactnative/NamiFlowManagerBridge.kt +67 -0
- package/android/src/main/java/com/namiml/reactnative/NamiPaywallManagerBridgeModule.kt +196 -0
- package/android/src/main/java/com/namiml/reactnative/NamiPurchaseManagerBridge.kt +114 -0
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiUtil.kt +26 -23
- package/{index.d.ts → dist/index.d.ts} +0 -2
- package/dist/specs/NativeNami.d.ts +15 -0
- package/dist/specs/NativeNamiCampaignManager.d.ts +82 -0
- package/dist/specs/NativeNamiCustomerManager.d.ts +29 -0
- package/dist/specs/NativeNamiEntitlementManager.d.ts +45 -0
- package/dist/specs/NativeNamiFlowManager.d.ts +8 -0
- package/dist/specs/NativeNamiPaywallManager.d.ts +71 -0
- package/dist/specs/NativeNamiPurchaseManager.d.ts +28 -0
- package/dist/src/Nami.d.ts +5 -0
- package/dist/src/NamiCampaignManager.d.ts +29 -0
- package/{src → dist/src}/NamiCustomerManager.d.ts +11 -13
- package/dist/src/NamiEntitlementManager.d.ts +13 -0
- package/dist/src/NamiFlowManager.d.ts +11 -0
- package/dist/src/NamiPaywallManager.d.ts +30 -0
- package/dist/src/NamiPurchaseManager.d.ts +17 -0
- package/dist/src/transformers.d.ts +3 -0
- package/{src → dist/src}/types.d.ts +35 -6
- package/dist/src/version.d.ts +5 -0
- package/index.ts +0 -2
- package/ios/Nami.m +8 -88
- package/ios/Nami.swift +85 -0
- package/ios/NamiCampaignManagerBridge.m +3 -3
- package/ios/NamiCampaignManagerBridge.swift +49 -61
- package/ios/NamiCustomerManager.m +2 -2
- package/ios/NamiCustomerManager.swift +13 -3
- package/ios/NamiEntitlementManagerBridge.m +2 -3
- package/ios/NamiEntitlementManagerBridge.swift +48 -39
- package/ios/NamiFlowManagerBridge.m +2 -2
- package/ios/NamiFlowManagerBridge.swift +10 -6
- package/ios/NamiPaywallManagerBridge.m +3 -3
- package/ios/NamiPaywallManagerBridge.swift +16 -6
- package/ios/NamiPurchaseManagerBridge.m +3 -2
- package/ios/NamiPurchaseManagerBridge.swift +15 -10
- package/ios/RNNami-Bridging-Header.h +1 -3
- package/package.json +20 -8
- package/react-native-config.js +9 -0
- package/react-native-nami-sdk.podspec +11 -3
- package/scripts/generate-version.ts +18 -0
- package/specs/NativeNami.ts +16 -0
- package/specs/NativeNamiCampaignManager.ts +94 -0
- package/specs/NativeNamiCustomerManager.ts +37 -0
- package/specs/NativeNamiEntitlementManager.ts +54 -0
- package/specs/NativeNamiFlowManager.ts +12 -0
- package/specs/NativeNamiPaywallManager.ts +85 -0
- package/specs/NativeNamiPurchaseManager.ts +33 -0
- package/src/Nami.ts +28 -18
- package/src/NamiCampaignManager.ts +57 -53
- package/src/NamiCustomerManager.ts +55 -81
- package/src/NamiEntitlementManager.ts +49 -36
- package/src/NamiFlowManager.ts +35 -45
- package/src/NamiPaywallManager.ts +84 -139
- package/src/NamiPurchaseManager.ts +69 -70
- package/src/transformers.ts +21 -0
- package/src/types.ts +39 -7
- package/src/version.ts +5 -0
- package/tsconfig.json +24 -22
- package/.eslintignore +0 -3
- package/.eslintrc.js +0 -52
- package/.github/workflows/CI.yaml +0 -341
- package/.github/workflows/app_prod.yaml +0 -387
- package/.github/workflows/app_stg.yaml +0 -398
- package/.github/workflows/build.yml +0 -70
- package/.pre-commit-config.yaml +0 -24
- package/.prettierrc.js +0 -7
- package/android/src/main/java/com/nami/reactlibrary/Constants.kt +0 -3
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +0 -141
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgePackage.java +0 -51
- package/android/src/main/java/com/nami/reactlibrary/NamiFlowManagerBridge.kt +0 -58
- package/android/src/main/java/com/nami/reactlibrary/NamiMLManagerBridgeModule.kt +0 -58
- package/android/src/main/java/com/nami/reactlibrary/NamiManagerBridge.kt +0 -26
- package/android/src/main/java/com/nami/reactlibrary/NamiPaywallManagerBridgeModule.kt +0 -258
- package/android/src/main/java/com/nami/reactlibrary/NamiPurchaseManagerBridge.kt +0 -108
- package/build-utils/get_version_code.py +0 -140
- package/build-utils/preflight.py +0 -46
- package/ios/NamiMLManagerBridge.m +0 -93
- package/ios/NamiManager.m +0 -18
- package/ios/NamiManager.swift +0 -30
- package/ios/RNNami.h +0 -10
- package/ios/RNNami.m +0 -13
- package/src/Nami.d.ts +0 -8
- package/src/NamiCampaignManager.d.ts +0 -18
- package/src/NamiEntitlementManager.d.ts +0 -15
- package/src/NamiFlowManager.d.ts +0 -32
- package/src/NamiMLManager.d.ts +0 -7
- package/src/NamiMLManager.ts +0 -13
- package/src/NamiManager.d.ts +0 -5
- package/src/NamiManager.ts +0 -14
- package/src/NamiPaywallManager.d.ts +0 -34
- package/src/NamiPurchaseManager.d.ts +0 -20
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// NamiCampaignManagerBridge.swift
|
|
3
3
|
// RNNami
|
|
4
4
|
//
|
|
5
|
-
// Copyright ©
|
|
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", "
|
|
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
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
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 ©
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
|
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
|
|
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
|
|
26
|
-
let
|
|
27
|
-
|
|
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
|
|
32
|
-
|
|
33
|
-
return dictionary
|
|
39
|
+
let purchasedSkus = entitlement.purchasedSkus.map {
|
|
40
|
+
RNNamiPurchaseManager.skuToSKUDict($0)
|
|
34
41
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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":
|
|
45
|
-
"relatedSkus":
|
|
46
|
-
"purchasedSkus":
|
|
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
|
|
52
|
-
func isEntitlementActive(referenceId: String, resolve: @escaping RCTPromiseResolveBlock,
|
|
53
|
-
|
|
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
|
|
58
|
-
func active(resolve: @escaping RCTPromiseResolveBlock,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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(
|
|
71
|
+
resolve(entitlements)
|
|
65
72
|
}
|
|
66
73
|
|
|
67
|
-
@objc
|
|
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
|
|
84
|
+
@objc
|
|
73
85
|
func registerActiveEntitlementsHandler() {
|
|
74
|
-
NamiEntitlementManager.registerActiveEntitlementsHandler {
|
|
75
|
-
let
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
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
|
|
13
|
+
RCT_EXTERN_METHOD(registerEventHandler)
|
|
14
14
|
RCT_EXTERN_METHOD(resume)
|
|
15
15
|
|
|
16
16
|
+ (BOOL)requiresMainQueueSetup {
|
|
17
|
-
return
|
|
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
|
|
22
|
+
return false
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
override func supportedEvents() -> [String]! {
|
|
26
|
-
return ["
|
|
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
|
-
|
|
37
|
+
|
|
38
|
+
DispatchQueue.main.async {
|
|
39
|
+
RNNamiFlowManager.shared?.sendEvent(withName: "Handoff", body: payload)
|
|
40
|
+
}
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
|
|
41
|
-
@objc(
|
|
42
|
-
func registerEventHandler(_ callback: @escaping RCTResponseSenderBlock) {
|
|
44
|
+
@objc func registerEventHandler() {
|
|
43
45
|
NamiFlowManager.registerEventHandler { payload in
|
|
44
|
-
|
|
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
|
-
//
|
|
3
|
+
// RNNami
|
|
4
4
|
//
|
|
5
|
-
// Copyright ©
|
|
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
|
|
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 ©
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ©
|
|
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
|
|
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 ©
|
|
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"] =
|
|
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
|
-
|
|
82
|
+
var purchaseDict: [String: Any?] = [
|
|
82
83
|
"skuId": purchase.skuId,
|
|
83
84
|
"transactionIdentifier": purchase.transactionIdentifier,
|
|
84
85
|
"sku": skuDictionary,
|
|
85
|
-
"
|
|
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
|
|
package/package.json
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nami-sdk",
|
|
3
|
-
"version": "3.3.0
|
|
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
|
|
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
|
-
"
|
|
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": {
|
|
@@ -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
|
|
21
|
-
s.requires_arc
|
|
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
|
|
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
|