react-native-nami-sdk 3.3.1-1 → 3.3.2-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.
- package/android/build.gradle +2 -2
- package/android/src/main/java/com/namiml/reactnative/NamiFlowManagerBridge.kt +7 -0
- package/android/src/main/java/com/namiml/reactnative/NamiUtil.kt +1 -1
- package/dist/specs/NativeNamiCampaignManager.d.ts +3 -0
- package/dist/specs/NativeNamiFlowManager.d.ts +1 -0
- package/dist/src/NamiFlowManager.d.ts +1 -0
- package/dist/src/types.d.ts +3 -0
- package/dist/src/version.d.ts +1 -1
- package/ios/NamiCampaignManagerBridge.swift +63 -36
- package/ios/NamiFlowManagerBridge.m +1 -0
- package/ios/NamiFlowManagerBridge.swift +6 -0
- package/ios/NamiPurchaseManagerBridge.swift +4 -0
- package/package.json +1 -1
- package/react-native-nami-sdk.podspec +2 -2
- package/specs/NativeNamiCampaignManager.ts +1 -0
- package/specs/NativeNamiFlowManager.ts +1 -0
- package/src/NamiFlowManager.ts +5 -0
- package/src/types.ts +1 -0
- package/src/version.ts +1 -1
package/android/build.gradle
CHANGED
|
@@ -85,8 +85,8 @@ dependencies {
|
|
|
85
85
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
|
86
86
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
|
|
87
87
|
|
|
88
|
-
playImplementation "com.namiml:sdk-android:3.3.
|
|
89
|
-
amazonImplementation "com.namiml:sdk-amazon:3.3.
|
|
88
|
+
playImplementation "com.namiml:sdk-android:3.3.2.2"
|
|
89
|
+
amazonImplementation "com.namiml:sdk-amazon:3.3.2.2"
|
|
90
90
|
|
|
91
91
|
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
92
92
|
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4"
|
|
@@ -55,6 +55,13 @@ class NamiFlowManagerBridgeModule internal constructor(
|
|
|
55
55
|
}, 100L)
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
@ReactMethod
|
|
59
|
+
fun pause() {
|
|
60
|
+
Handler(Looper.getMainLooper()).postDelayed({
|
|
61
|
+
NamiFlowManager.pause()
|
|
62
|
+
}, 100L)
|
|
63
|
+
}
|
|
64
|
+
|
|
58
65
|
@ReactMethod
|
|
59
66
|
fun finish() {
|
|
60
67
|
Handler(Looper.getMainLooper()).postDelayed({
|
|
@@ -114,7 +114,7 @@ fun NamiSKU.toSkuDict(): WritableMap {
|
|
|
114
114
|
productDict.putString("id", this.id)
|
|
115
115
|
productDict.putString("skuId", this.skuId)
|
|
116
116
|
productDict.putString("name", this.name ?: "")
|
|
117
|
-
productDict.putString("type", this.type
|
|
117
|
+
productDict.putString("type", this.type.toString().lowercase() ?: "unknown")
|
|
118
118
|
|
|
119
119
|
this.promoId?.let {
|
|
120
120
|
productDict.putString("promoId", it)
|
|
@@ -7,6 +7,7 @@ export declare const NamiFlowManager: {
|
|
|
7
7
|
emitter: NativeEventEmitter;
|
|
8
8
|
registerStepHandoff: (callback: (handoffTag: string, handoffData?: Record<string, unknown>) => void) => (() => void);
|
|
9
9
|
resume: () => void;
|
|
10
|
+
pause: () => void;
|
|
10
11
|
registerEventHandler: (callback: (payload: Record<string, unknown>) => void) => (() => void);
|
|
11
12
|
finish: () => void;
|
|
12
13
|
isFlowOpen: () => Promise<boolean>;
|
package/dist/src/types.d.ts
CHANGED
package/dist/src/version.d.ts
CHANGED
|
@@ -95,6 +95,7 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
95
95
|
skuDict["name"] = sku.name
|
|
96
96
|
skuDict["skuId"] = sku.skuId
|
|
97
97
|
skuDict["type"] = sku.type.description
|
|
98
|
+
skuDict["promoId"] = sku.promoId
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
var componentChange: [String: Any?] = [:]
|
|
@@ -142,8 +143,22 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
|
|
145
|
-
func handleLaunch(callback:
|
|
146
|
-
callback
|
|
146
|
+
func handleLaunch(callback: RCTResponseSenderBlock?, success: Bool, error: Error?) {
|
|
147
|
+
guard let callback = callback else {
|
|
148
|
+
print("[handleLaunch] callback was nil — possibly already released.")
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
var errorInfo: Any = NSNull()
|
|
153
|
+
if let nsError = error as NSError? {
|
|
154
|
+
errorInfo = [
|
|
155
|
+
"code": nsError.code,
|
|
156
|
+
"domain": nsError.domain,
|
|
157
|
+
"message": nsError.localizedDescription,
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
callback([success, errorInfo])
|
|
147
162
|
}
|
|
148
163
|
|
|
149
164
|
@objc(launch:withUrl:context:completion:paywallCompletion:)
|
|
@@ -173,55 +188,67 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
173
188
|
}
|
|
174
189
|
|
|
175
190
|
if productGroups != nil || customAttributes != nil || customObject != nil {
|
|
176
|
-
paywallLaunchContext = PaywallLaunchContext(
|
|
191
|
+
paywallLaunchContext = PaywallLaunchContext(
|
|
192
|
+
productGroups: productGroups,
|
|
193
|
+
customAttributes: customAttributes,
|
|
194
|
+
customObject: customObject
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Wrap the callback to ensure it's only called once
|
|
199
|
+
var callbackOnce: RCTResponseSenderBlock? = callback
|
|
200
|
+
let safeCallback: RCTResponseSenderBlock = { args in
|
|
201
|
+
if let cb = callbackOnce {
|
|
202
|
+
cb(args)
|
|
203
|
+
callbackOnce = nil
|
|
204
|
+
} else {
|
|
205
|
+
print("[RNNamiCampaignManager] Warning: callback already called or cleared")
|
|
206
|
+
}
|
|
177
207
|
}
|
|
178
208
|
|
|
179
209
|
var launchMethod: (() -> Void)?
|
|
180
210
|
|
|
181
211
|
if let urlString = withUrl, let urlObject = URL(string: urlString) {
|
|
182
212
|
launchMethod = {
|
|
183
|
-
NamiCampaignManager.launch(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
})
|
|
213
|
+
NamiCampaignManager.launch(
|
|
214
|
+
url: urlObject,
|
|
215
|
+
context: paywallLaunchContext,
|
|
216
|
+
launchHandler: { [weak self] success, error in
|
|
217
|
+
self?.handleLaunch(callback: safeCallback, success: success, error: error)
|
|
218
|
+
},
|
|
219
|
+
paywallActionHandler: { [weak self] event in
|
|
220
|
+
self?.handlePaywallAction(paywallEvent: event)
|
|
221
|
+
}
|
|
222
|
+
)
|
|
194
223
|
}
|
|
195
224
|
} else if let label = label {
|
|
196
225
|
launchMethod = {
|
|
197
|
-
NamiCampaignManager.launch(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
})
|
|
226
|
+
NamiCampaignManager.launch(
|
|
227
|
+
label: label,
|
|
228
|
+
context: paywallLaunchContext,
|
|
229
|
+
launchHandler: { [weak self] success, error in
|
|
230
|
+
self?.handleLaunch(callback: safeCallback, success: success, error: error)
|
|
231
|
+
},
|
|
232
|
+
paywallActionHandler: { [weak self] event in
|
|
233
|
+
self?.handlePaywallAction(paywallEvent: event)
|
|
234
|
+
}
|
|
235
|
+
)
|
|
208
236
|
}
|
|
209
237
|
} else {
|
|
210
238
|
print("Neither URL nor label provided calling default launch.")
|
|
211
239
|
launchMethod = {
|
|
212
|
-
NamiCampaignManager.launch(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
self.handlePaywallAction(paywallEvent: paywallEvent)
|
|
222
|
-
})
|
|
240
|
+
NamiCampaignManager.launch(
|
|
241
|
+
context: paywallLaunchContext,
|
|
242
|
+
launchHandler: { [weak self] success, error in
|
|
243
|
+
self?.handleLaunch(callback: safeCallback, success: success, error: error)
|
|
244
|
+
},
|
|
245
|
+
paywallActionHandler: { [weak self] event in
|
|
246
|
+
self?.handlePaywallAction(paywallEvent: event)
|
|
247
|
+
}
|
|
248
|
+
)
|
|
223
249
|
}
|
|
224
250
|
}
|
|
251
|
+
|
|
225
252
|
DispatchQueue.main.async {
|
|
226
253
|
launchMethod?()
|
|
227
254
|
}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
RCT_EXTERN_METHOD(registerStepHandoff)
|
|
13
13
|
RCT_EXTERN_METHOD(registerEventHandler)
|
|
14
14
|
RCT_EXTERN_METHOD(resume)
|
|
15
|
+
RCT_EXTERN_METHOD(pause)
|
|
15
16
|
RCT_EXTERN_METHOD(finish)
|
|
16
17
|
RCT_EXTERN_METHOD(isFlowOpen:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
17
18
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nami-sdk",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2-1",
|
|
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
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,7 +13,7 @@ Pod::Spec.new do |s|
|
|
|
13
13
|
s.homepage = package['homepage']
|
|
14
14
|
s.license = package['license']
|
|
15
15
|
|
|
16
|
-
s.platforms = { :ios => "
|
|
16
|
+
s.platforms = { :ios => "15.0", :tvos => "15.0" }
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
s.source = { :git => "https://github.com/namiml/react-native-nami-sdk.git", :tag => "#{s.version}" }
|
|
@@ -21,7 +21,7 @@ Pod::Spec.new do |s|
|
|
|
21
21
|
s.requires_arc = true
|
|
22
22
|
s.swift_version = '5.0' # or your supported version
|
|
23
23
|
|
|
24
|
-
s.dependency 'Nami', '3.3.
|
|
24
|
+
s.dependency 'Nami', '3.3.2.3'
|
|
25
25
|
s.dependency 'React'
|
|
26
26
|
|
|
27
27
|
s.pod_target_xcconfig = {
|
package/src/NamiFlowManager.ts
CHANGED
|
@@ -46,6 +46,11 @@ export const NamiFlowManager = {
|
|
|
46
46
|
RNNamiFlowManager.resume?.();
|
|
47
47
|
},
|
|
48
48
|
|
|
49
|
+
pause: (): void => {
|
|
50
|
+
console.info('[NamiFlowManager] pause from handoff requested');
|
|
51
|
+
RNNamiFlowManager.pause();
|
|
52
|
+
},
|
|
53
|
+
|
|
49
54
|
registerEventHandler: (
|
|
50
55
|
callback: (payload: Record<string, unknown>) => void,
|
|
51
56
|
): (() => void) => {
|
package/src/types.ts
CHANGED
package/src/version.ts
CHANGED