react-native-nami-sdk 3.3.2-1 → 3.3.2-4
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/dist/src/version.d.ts +1 -1
- package/ios/Nami.swift +21 -4
- package/ios/NamiCampaignManagerBridge.m +3 -2
- package/ios/NamiCampaignManagerBridge.swift +16 -7
- package/ios/NamiCustomerManager.m +3 -2
- package/ios/NamiCustomerManager.swift +44 -17
- package/ios/NamiEntitlementManagerBridge.m +3 -2
- package/ios/NamiEntitlementManagerBridge.swift +14 -8
- package/ios/NamiFlowManagerBridge.m +1 -1
- package/ios/NamiFlowManagerBridge.swift +17 -18
- package/ios/NamiPaywallManagerBridge.m +2 -2
- package/ios/NamiPaywallManagerBridge.swift +19 -16
- package/ios/NamiPurchaseManagerBridge.m +2 -2
- package/ios/NamiPurchaseManagerBridge.swift +17 -4
- package/package.json +1 -1
- package/react-native-nami-sdk.podspec +1 -1
- 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.2.
|
|
89
|
-
amazonImplementation "com.namiml:sdk-amazon:3.3.2.
|
|
88
|
+
playImplementation "com.namiml:sdk-android:3.3.2.3"
|
|
89
|
+
amazonImplementation "com.namiml:sdk-amazon:3.3.2.3"
|
|
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"
|
package/dist/src/version.d.ts
CHANGED
package/ios/Nami.swift
CHANGED
|
@@ -63,20 +63,37 @@ class RNNami: NSObject {
|
|
|
63
63
|
config.initialConfig = initialConfig
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
var didCallBack = false
|
|
66
67
|
Nami.configure(with: config) { sdkConfigured in
|
|
67
|
-
|
|
68
|
+
didCallBack = true
|
|
69
|
+
NSLog("RNNami: configure() completion called, sdkConfigured: \(sdkConfigured)")
|
|
70
|
+
DispatchQueue.main.async {
|
|
71
|
+
resolve(["success": sdkConfigured])
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
|
|
76
|
+
if !didCallBack {
|
|
77
|
+
NSLog("RNNami: configure() completion NEVER CALLED, reporting failure.")
|
|
78
|
+
resolve(["success": false])
|
|
79
|
+
}
|
|
68
80
|
}
|
|
69
81
|
}
|
|
70
82
|
|
|
71
83
|
@objc
|
|
72
|
-
func sdkConfigured(_ resolve: RCTPromiseResolveBlock, rejecter _: RCTPromiseRejectBlock) {
|
|
73
|
-
|
|
84
|
+
func sdkConfigured(_ resolve: @escaping RCTPromiseResolveBlock, rejecter _: RCTPromiseRejectBlock) {
|
|
85
|
+
let sdkConfigured = Nami.sdkConfigured()
|
|
86
|
+
DispatchQueue.main.async {
|
|
87
|
+
resolve(sdkConfigured)
|
|
88
|
+
}
|
|
74
89
|
}
|
|
75
90
|
|
|
76
91
|
@objc(sdkVersion:rejecter:)
|
|
77
92
|
func sdkVersion(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
78
93
|
let version = Nami.sdkVersion()
|
|
79
|
-
|
|
94
|
+
DispatchQueue.main.async {
|
|
95
|
+
resolve(version)
|
|
96
|
+
}
|
|
80
97
|
}
|
|
81
98
|
|
|
82
99
|
func isNewArchitectureEnabled() -> Bool {
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
#import <React/RCTBridgeModule.h>
|
|
9
|
+
#import <React/RCTEventEmitter.h>
|
|
9
10
|
|
|
10
|
-
@interface RCT_EXTERN_MODULE(RNNamiCampaignManager,
|
|
11
|
+
@interface RCT_EXTERN_MODULE(RNNamiCampaignManager, RCTEventEmitter)
|
|
11
12
|
|
|
12
13
|
RCT_EXTERN_METHOD(launch:(nullable NSString *)label withUrl:(nullable NSString *)withUrl context:(nullable NSDictionary *)context completion:(RCTResponseSenderBlock)callback paywallCompletion:(RCTResponseSenderBlock)paywallCallback);
|
|
13
14
|
|
|
@@ -20,7 +21,7 @@ RCT_EXTERN_METHOD(refresh:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRe
|
|
|
20
21
|
RCT_EXTERN_METHOD(registerAvailableCampaignsHandler)
|
|
21
22
|
|
|
22
23
|
+ (BOOL)requiresMainQueueSetup {
|
|
23
|
-
return
|
|
24
|
+
return YES;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
@end
|
|
@@ -20,7 +20,20 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
20
20
|
|
|
21
21
|
override init() {
|
|
22
22
|
super.init()
|
|
23
|
-
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override class func requiresMainQueueSetup() -> Bool { true }
|
|
26
|
+
|
|
27
|
+
private var hasListeners = false
|
|
28
|
+
override func startObserving() { hasListeners = true }
|
|
29
|
+
override func stopObserving() { hasListeners = false }
|
|
30
|
+
|
|
31
|
+
private func safeSend(withName name: String, body: Any?) {
|
|
32
|
+
guard hasListeners else {
|
|
33
|
+
print("[RNNamiCampaignManager] Warning: no listeners, so event not being sent to JS.")
|
|
34
|
+
return
|
|
35
|
+
} // optional but avoids warnings
|
|
36
|
+
sendEvent(withName: name, body: body)
|
|
24
37
|
}
|
|
25
38
|
|
|
26
39
|
override func supportedEvents() -> [String]! {
|
|
@@ -138,9 +151,7 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
138
151
|
"timeSpentOnPaywall": paywallEvent.timeSpentOnPaywall,
|
|
139
152
|
]
|
|
140
153
|
|
|
141
|
-
|
|
142
|
-
RNNamiCampaignManager.shared?.sendEvent(withName: "NamiPaywallEvent", body: payload)
|
|
143
|
-
}
|
|
154
|
+
safeSend(withName: "NamiPaywallEvent", body: payload)
|
|
144
155
|
}
|
|
145
156
|
|
|
146
157
|
func handleLaunch(callback: RCTResponseSenderBlock?, success: Bool, error: Error?) {
|
|
@@ -294,9 +305,7 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
294
305
|
func registerForAvailableCampaigns() {
|
|
295
306
|
NamiCampaignManager.registerAvailableCampaignsHandler { availableCampaigns in
|
|
296
307
|
let dictionaries = availableCampaigns.map { campaign in self.campaignInToDictionary(campaign) }
|
|
297
|
-
|
|
298
|
-
RNNamiCampaignManager.shared?.sendEvent(withName: "AvailableCampaignsChanged", body: dictionaries)
|
|
299
|
-
}
|
|
308
|
+
self.safeSend(withName: "AvailableCampaignsChanged", body: dictionaries)
|
|
300
309
|
}
|
|
301
310
|
}
|
|
302
311
|
}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
#import <React/RCTBridgeModule.h>
|
|
9
|
+
#import <React/RCTEventEmitter.h>
|
|
9
10
|
|
|
10
|
-
@interface RCT_EXTERN_MODULE(RNNamiCustomerManager,
|
|
11
|
+
@interface RCT_EXTERN_MODULE(RNNamiCustomerManager, RCTEventEmitter)
|
|
11
12
|
|
|
12
13
|
RCT_EXTERN_METHOD(setCustomerAttribute:(NSString *)key value:(NSString *)value)
|
|
13
14
|
|
|
@@ -43,7 +44,7 @@ RCT_EXTERN_METHOD(registerAccountStateHandler)
|
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
+ (BOOL)requiresMainQueueSetup {
|
|
46
|
-
return
|
|
47
|
+
return YES;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
@end
|
|
@@ -19,7 +19,20 @@ class RNNamiCustomerManager: RCTEventEmitter {
|
|
|
19
19
|
|
|
20
20
|
override init() {
|
|
21
21
|
super.init()
|
|
22
|
-
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override class func requiresMainQueueSetup() -> Bool { true }
|
|
25
|
+
|
|
26
|
+
private var hasListeners = false
|
|
27
|
+
override func startObserving() { hasListeners = true }
|
|
28
|
+
override func stopObserving() { hasListeners = false }
|
|
29
|
+
|
|
30
|
+
private func safeSend(withName name: String, body: Any?) {
|
|
31
|
+
guard hasListeners else {
|
|
32
|
+
print("[RNNamiCustomerManager] Warning: no listeners, so event not being sent to JS.")
|
|
33
|
+
return
|
|
34
|
+
} // optional but avoids warnings
|
|
35
|
+
sendEvent(withName: name, body: body)
|
|
23
36
|
}
|
|
24
37
|
|
|
25
38
|
override func supportedEvents() -> [String]! {
|
|
@@ -46,8 +59,10 @@ class RNNamiCustomerManager: RCTEventEmitter {
|
|
|
46
59
|
|
|
47
60
|
@objc(getCustomerAttribute:resolver:rejecter:)
|
|
48
61
|
func getCustomerAttribute(key: String, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
49
|
-
|
|
50
|
-
|
|
62
|
+
DispatchQueue.main.async {
|
|
63
|
+
let customerAttribute = NamiCustomerManager.getCustomerAttribute(key: key)
|
|
64
|
+
resolve(customerAttribute)
|
|
65
|
+
}
|
|
51
66
|
}
|
|
52
67
|
|
|
53
68
|
@objc(clearCustomerAttribute:)
|
|
@@ -78,54 +93,68 @@ class RNNamiCustomerManager: RCTEventEmitter {
|
|
|
78
93
|
@objc(inAnonymousMode:rejecter:)
|
|
79
94
|
func inAnonymousMode(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
80
95
|
let inAnonymousMode: Bool = NamiCustomerManager.inAnonymousMode()
|
|
81
|
-
|
|
96
|
+
DispatchQueue.main.async {
|
|
97
|
+
resolve(inAnonymousMode)
|
|
98
|
+
}
|
|
82
99
|
}
|
|
83
100
|
|
|
84
101
|
@objc(journeyState:rejecter:)
|
|
85
102
|
func journeyState(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
86
103
|
if let journeyState = NamiCustomerManager.journeyState() {
|
|
87
104
|
let dictionary = journeyStateToDictionary(journeyState)
|
|
88
|
-
|
|
105
|
+
DispatchQueue.main.async {
|
|
106
|
+
resolve(dictionary)
|
|
107
|
+
}
|
|
89
108
|
} else {
|
|
90
|
-
|
|
109
|
+
DispatchQueue.main.async {
|
|
110
|
+
resolve(nil)
|
|
111
|
+
}
|
|
91
112
|
}
|
|
92
113
|
}
|
|
93
114
|
|
|
94
115
|
@objc(isLoggedIn:rejecter:)
|
|
95
116
|
func isLoggedIn(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
96
117
|
let isLoggedIn = NamiCustomerManager.isLoggedIn()
|
|
97
|
-
|
|
118
|
+
DispatchQueue.main.async {
|
|
119
|
+
resolve(isLoggedIn)
|
|
120
|
+
}
|
|
98
121
|
}
|
|
99
122
|
|
|
100
123
|
@objc(loggedInId:rejecter:)
|
|
101
124
|
func loggedInId(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
102
125
|
let id = NamiCustomerManager.loggedInId()
|
|
103
|
-
|
|
126
|
+
DispatchQueue.main.async {
|
|
127
|
+
resolve(id)
|
|
128
|
+
}
|
|
104
129
|
}
|
|
105
130
|
|
|
106
131
|
@objc(deviceId:rejecter:)
|
|
107
132
|
func deviceId(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
108
133
|
let id = NamiCustomerManager.deviceId()
|
|
109
|
-
|
|
134
|
+
DispatchQueue.main.async {
|
|
135
|
+
resolve(id)
|
|
136
|
+
}
|
|
110
137
|
}
|
|
111
138
|
|
|
112
139
|
@objc(login:)
|
|
113
140
|
func login(customerId: String) {
|
|
114
|
-
|
|
141
|
+
DispatchQueue.main.async {
|
|
142
|
+
NamiCustomerManager.login(withId: customerId)
|
|
143
|
+
}
|
|
115
144
|
}
|
|
116
145
|
|
|
117
146
|
@objc(logout)
|
|
118
147
|
func logout() {
|
|
119
|
-
|
|
148
|
+
DispatchQueue.main.async {
|
|
149
|
+
NamiCustomerManager.logout()
|
|
150
|
+
}
|
|
120
151
|
}
|
|
121
152
|
|
|
122
153
|
@objc(registerJourneyStateHandler)
|
|
123
154
|
func registerJourneyStateHandler() {
|
|
124
155
|
NamiCustomerManager.registerJourneyStateHandler { journeyState in
|
|
125
156
|
let dictionary = self.journeyStateToDictionary(journeyState)
|
|
126
|
-
|
|
127
|
-
RNNamiCustomerManager.shared?.sendEvent(withName: "JourneyStateChanged", body: dictionary)
|
|
128
|
-
}
|
|
157
|
+
self.safeSend(withName: "JourneyStateChanged", body: dictionary)
|
|
129
158
|
}
|
|
130
159
|
}
|
|
131
160
|
|
|
@@ -166,9 +195,7 @@ class RNNamiCustomerManager: RCTEventEmitter {
|
|
|
166
195
|
"success": success,
|
|
167
196
|
"error": error?._code as Any,
|
|
168
197
|
]
|
|
169
|
-
|
|
170
|
-
RNNamiCustomerManager.shared?.sendEvent(withName: "AccountStateChanged", body: payload)
|
|
171
|
-
}
|
|
198
|
+
self.safeSend(withName: "AccountStateChanged", body: payload)
|
|
172
199
|
}
|
|
173
200
|
}
|
|
174
201
|
}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
#import <React/RCTBridgeModule.h>
|
|
9
|
+
#import <React/RCTEventEmitter.h>
|
|
9
10
|
|
|
10
|
-
@interface RCT_EXTERN_MODULE(RNNamiEntitlementManager,
|
|
11
|
+
@interface RCT_EXTERN_MODULE(RNNamiEntitlementManager, RCTEventEmitter)
|
|
11
12
|
|
|
12
13
|
RCT_EXTERN_METHOD(isEntitlementActive:(nullable NSString *)referenceId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
13
14
|
|
|
@@ -20,7 +21,7 @@ RCT_EXTERN_METHOD(registerActiveEntitlementsHandler)
|
|
|
20
21
|
RCT_EXTERN_METHOD(clearProvisionalEntitlementGrants)
|
|
21
22
|
|
|
22
23
|
+ (BOOL)requiresMainQueueSetup {
|
|
23
|
-
return
|
|
24
|
+
return YES;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
@end
|
|
@@ -22,8 +22,18 @@ class RNNamiEntitlementManager: RCTEventEmitter {
|
|
|
22
22
|
RNNamiEntitlementManager.shared = self
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
override
|
|
26
|
-
|
|
25
|
+
override class func requiresMainQueueSetup() -> Bool { true }
|
|
26
|
+
|
|
27
|
+
private var hasListeners = false
|
|
28
|
+
override func startObserving() { hasListeners = true }
|
|
29
|
+
override func stopObserving() { hasListeners = false }
|
|
30
|
+
|
|
31
|
+
private func safeSend(withName name: String, body: Any?) {
|
|
32
|
+
guard hasListeners else {
|
|
33
|
+
print("[RNNamiEntitlementManager] Warning: no listeners, so event not being sent to JS.")
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
sendEvent(withName: name, body: body)
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
override func supportedEvents() -> [String]! {
|
|
@@ -74,9 +84,7 @@ class RNNamiEntitlementManager: RCTEventEmitter {
|
|
|
74
84
|
func refresh() {
|
|
75
85
|
NamiEntitlementManager.refresh { entitlements in
|
|
76
86
|
let dicts = entitlements.map { self.entitlementToDictionary($0) }
|
|
77
|
-
|
|
78
|
-
RNNamiEntitlementManager.shared?.sendEvent(withName: "EntitlementsChanged", body: dicts)
|
|
79
|
-
}
|
|
87
|
+
self.safeSend(withName: "EntitlementsChanged", body: dicts)
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
90
|
|
|
@@ -84,9 +92,7 @@ class RNNamiEntitlementManager: RCTEventEmitter {
|
|
|
84
92
|
func registerActiveEntitlementsHandler() {
|
|
85
93
|
NamiEntitlementManager.registerActiveEntitlementsHandler { entitlements in
|
|
86
94
|
let dicts = entitlements.map { self.entitlementToDictionary($0) }
|
|
87
|
-
|
|
88
|
-
RNNamiEntitlementManager.shared?.sendEvent(withName: "EntitlementsChanged", body: dicts)
|
|
89
|
-
}
|
|
95
|
+
self.safeSend(withName: "EntitlementsChanged", body: dicts)
|
|
90
96
|
}
|
|
91
97
|
}
|
|
92
98
|
|
|
@@ -19,11 +19,20 @@ class RNNamiFlowManager: RCTEventEmitter {
|
|
|
19
19
|
|
|
20
20
|
override init() {
|
|
21
21
|
super.init()
|
|
22
|
-
RNNamiFlowManager.shared = self
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
override
|
|
26
|
-
|
|
24
|
+
override class func requiresMainQueueSetup() -> Bool { true }
|
|
25
|
+
|
|
26
|
+
private var hasListeners = false
|
|
27
|
+
override func startObserving() { hasListeners = true }
|
|
28
|
+
override func stopObserving() { hasListeners = false }
|
|
29
|
+
|
|
30
|
+
private func safeSend(withName name: String, body: Any?) {
|
|
31
|
+
guard hasListeners else {
|
|
32
|
+
print("[RNNamiFlowManager] Warning: no listeners, so event not being sent to JS.")
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
sendEvent(withName: name, body: body)
|
|
27
36
|
}
|
|
28
37
|
|
|
29
38
|
override func supportedEvents() -> [String]! {
|
|
@@ -39,36 +48,26 @@ class RNNamiFlowManager: RCTEventEmitter {
|
|
|
39
48
|
payload["handoffData"] = data
|
|
40
49
|
}
|
|
41
50
|
|
|
42
|
-
|
|
43
|
-
RNNamiFlowManager.shared?.sendEvent(withName: "Handoff", body: payload)
|
|
44
|
-
}
|
|
51
|
+
self.safeSend(withName: "Handoff", body: payload)
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
54
|
|
|
48
55
|
@objc func registerEventHandler() {
|
|
49
56
|
NamiFlowManager.registerEventHandler { payload in
|
|
50
|
-
|
|
51
|
-
RNNamiFlowManager.shared?.sendEvent(withName: "FlowEvent", body: payload)
|
|
52
|
-
}
|
|
57
|
+
self.safeSend(withName: "FlowEvent", body: payload)
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
|
|
56
61
|
@objc func resume() {
|
|
57
|
-
|
|
58
|
-
NamiFlowManager.resume()
|
|
59
|
-
}
|
|
62
|
+
NamiFlowManager.resume()
|
|
60
63
|
}
|
|
61
64
|
|
|
62
65
|
@objc func pause() {
|
|
63
|
-
|
|
64
|
-
NamiFlowManager.pause()
|
|
65
|
-
}
|
|
66
|
+
NamiFlowManager.pause()
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
@objc func finish() {
|
|
69
|
-
|
|
70
|
-
NamiFlowManager.finish()
|
|
71
|
-
}
|
|
70
|
+
NamiFlowManager.finish()
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
@objc func isFlowOpen(_ resolve: @escaping RCTPromiseResolveBlock, rejecter _: @escaping RCTPromiseRejectBlock) {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
#import "React/RCTViewManager.h"
|
|
15
15
|
|
|
16
|
-
@interface RCT_EXTERN_MODULE(RNNamiPaywallManager,
|
|
16
|
+
@interface RCT_EXTERN_MODULE(RNNamiPaywallManager, RCTEventEmitter)
|
|
17
17
|
|
|
18
18
|
RCT_EXTERN_METHOD(buySkuComplete:(NSDictionary)dict)
|
|
19
19
|
|
|
@@ -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 YES;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
@end
|
|
@@ -19,7 +19,20 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
19
19
|
|
|
20
20
|
override init() {
|
|
21
21
|
super.init()
|
|
22
|
-
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override class func requiresMainQueueSetup() -> Bool { true }
|
|
25
|
+
|
|
26
|
+
private var hasListeners = false
|
|
27
|
+
override func startObserving() { hasListeners = true }
|
|
28
|
+
override func stopObserving() { hasListeners = false }
|
|
29
|
+
|
|
30
|
+
private func safeSend(withName name: String, body: Any?) {
|
|
31
|
+
guard hasListeners else {
|
|
32
|
+
print("[RNNamiPaywallManager] Warning: no listeners, so event not being sent to JS.")
|
|
33
|
+
return
|
|
34
|
+
} // optional but avoids warnings
|
|
35
|
+
sendEvent(withName: name, body: body)
|
|
23
36
|
}
|
|
24
37
|
|
|
25
38
|
override func supportedEvents() -> [String]! {
|
|
@@ -80,9 +93,7 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
80
93
|
func registerBuySkuHandler() {
|
|
81
94
|
NamiPaywallManager.registerBuySkuHandler { sku in
|
|
82
95
|
let dictionary = RNNamiPurchaseManager.skuToSKUDict(sku)
|
|
83
|
-
|
|
84
|
-
RNNamiPaywallManager.shared?.sendEvent(withName: "RegisterBuySKU", body: dictionary)
|
|
85
|
-
}
|
|
96
|
+
self.safeSend(withName: "RegisterBuySKU", body: dictionary)
|
|
86
97
|
}
|
|
87
98
|
}
|
|
88
99
|
|
|
@@ -90,9 +101,7 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
90
101
|
func registerCloseHandler() {
|
|
91
102
|
NamiPaywallManager.registerCloseHandler { _ in
|
|
92
103
|
let dictionary = NSDictionary(dictionary: ["PaywallCloseRequested": true].compactMapValues { $0 })
|
|
93
|
-
|
|
94
|
-
RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallCloseRequested", body: dictionary)
|
|
95
|
-
}
|
|
104
|
+
self.safeSend(withName: "PaywallCloseRequested", body: dictionary)
|
|
96
105
|
}
|
|
97
106
|
}
|
|
98
107
|
|
|
@@ -100,9 +109,7 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
100
109
|
func registerSignInHandler() {
|
|
101
110
|
NamiPaywallManager.registerSignInHandler { _ in
|
|
102
111
|
let dictionary = NSDictionary(dictionary: ["PaywallSignInRequested": true].compactMapValues { $0 })
|
|
103
|
-
|
|
104
|
-
RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallSignInRequested", body: dictionary)
|
|
105
|
-
}
|
|
112
|
+
self.safeSend(withName: "PaywallSignInRequested", body: dictionary)
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
|
|
@@ -110,18 +117,14 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
110
117
|
func registerRestoreHandler() {
|
|
111
118
|
NamiPaywallManager.registerRestoreHandler {
|
|
112
119
|
let dictionary = NSDictionary(dictionary: ["PaywallRestoreRequested": true].compactMapValues { $0 })
|
|
113
|
-
|
|
114
|
-
RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallRestoreRequested", body: dictionary)
|
|
115
|
-
}
|
|
120
|
+
self.safeSend(withName: "PaywallRestoreRequested", body: dictionary)
|
|
116
121
|
}
|
|
117
122
|
}
|
|
118
123
|
|
|
119
124
|
@objc(registerDeeplinkActionHandler)
|
|
120
125
|
func registerDeeplinkActionHandler() {
|
|
121
126
|
NamiPaywallManager.registerDeeplinkActionHandler { url in
|
|
122
|
-
|
|
123
|
-
RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallDeeplinkAction", body: url)
|
|
124
|
-
}
|
|
127
|
+
self.safeSend(withName: "PaywallDeeplinkAction", body: url)
|
|
125
128
|
}
|
|
126
129
|
}
|
|
127
130
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
#import "React/RCTViewManager.h"
|
|
15
15
|
|
|
16
|
-
@interface RCT_EXTERN_MODULE(RNNamiPurchaseManager,
|
|
16
|
+
@interface RCT_EXTERN_MODULE(RNNamiPurchaseManager, RCTEventEmitter)
|
|
17
17
|
|
|
18
18
|
RCT_EXTERN_METHOD(allPurchases:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
19
19
|
|
|
@@ -30,7 +30,7 @@ RCT_EXTERN_METHOD(presentCodeRedemptionSheet)
|
|
|
30
30
|
RCT_EXTERN_METHOD(restorePurchases)
|
|
31
31
|
|
|
32
32
|
+ (BOOL)requiresMainQueueSetup {
|
|
33
|
-
return
|
|
33
|
+
return YES;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
@end
|
|
@@ -19,7 +19,20 @@ class RNNamiPurchaseManager: RCTEventEmitter {
|
|
|
19
19
|
|
|
20
20
|
override init() {
|
|
21
21
|
super.init()
|
|
22
|
-
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override class func requiresMainQueueSetup() -> Bool { true }
|
|
25
|
+
|
|
26
|
+
private var hasListeners = false
|
|
27
|
+
override func startObserving() { hasListeners = true }
|
|
28
|
+
override func stopObserving() { hasListeners = false }
|
|
29
|
+
|
|
30
|
+
private func safeSend(withName name: String, body: Any?) {
|
|
31
|
+
guard hasListeners else {
|
|
32
|
+
print("[RNNamiPurchaseManager] Warning: no listeners, so event not being sent to JS.")
|
|
33
|
+
return
|
|
34
|
+
}
|
|
35
|
+
sendEvent(withName: name, body: body)
|
|
23
36
|
}
|
|
24
37
|
|
|
25
38
|
override func supportedEvents() -> [String]! {
|
|
@@ -158,7 +171,7 @@ class RNNamiPurchaseManager: RCTEventEmitter {
|
|
|
158
171
|
"purchaseState": stateString,
|
|
159
172
|
"error": error?.localizedDescription,
|
|
160
173
|
]
|
|
161
|
-
self.
|
|
174
|
+
self.safeSend(withName: "PurchasesChanged", body: payload)
|
|
162
175
|
}
|
|
163
176
|
}
|
|
164
177
|
|
|
@@ -187,7 +200,7 @@ class RNNamiPurchaseManager: RCTEventEmitter {
|
|
|
187
200
|
"newPurchases": newPurchasesDictionaries,
|
|
188
201
|
"oldPurchases": oldPurchasesDictionaries,
|
|
189
202
|
]
|
|
190
|
-
|
|
203
|
+
self.safeSend(withName: "RestorePurchasesStateChanged", body: payload)
|
|
191
204
|
}
|
|
192
205
|
}
|
|
193
206
|
|
|
@@ -216,7 +229,7 @@ class RNNamiPurchaseManager: RCTEventEmitter {
|
|
|
216
229
|
"newPurchases": newPurchasesDictionaries,
|
|
217
230
|
"oldPurchases": oldPurchasesDictionaries,
|
|
218
231
|
]
|
|
219
|
-
|
|
232
|
+
self.safeSend(withName: "RestorePurchasesStateChanged", body: payload)
|
|
220
233
|
}
|
|
221
234
|
}
|
|
222
235
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nami-sdk",
|
|
3
|
-
"version": "3.3.2-
|
|
3
|
+
"version": "3.3.2-4",
|
|
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",
|
package/src/version.ts
CHANGED