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.
- 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 -60
- 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
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
package com.namiml.reactnative
|
|
2
|
+
|
|
3
|
+
import android.os.Handler
|
|
4
|
+
import android.os.Looper
|
|
5
|
+
import android.util.Log
|
|
6
|
+
import com.facebook.react.bridge.*
|
|
7
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
8
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
9
|
+
import com.facebook.react.turbomodule.core.interfaces.TurboModule
|
|
10
|
+
import com.namiml.flow.NamiFlowManager
|
|
11
|
+
|
|
12
|
+
@ReactModule(name = NamiFlowManagerBridgeModule.NAME)
|
|
13
|
+
class NamiFlowManagerBridgeModule internal constructor(
|
|
14
|
+
reactContext: ReactApplicationContext
|
|
15
|
+
) : ReactContextBaseJavaModule(reactContext), TurboModule {
|
|
16
|
+
|
|
17
|
+
companion object {
|
|
18
|
+
const val NAME = "RNNamiFlowManager"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
override fun getName(): String {
|
|
22
|
+
return NAME
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@ReactMethod
|
|
26
|
+
fun registerStepHandoff() {
|
|
27
|
+
NamiFlowManager.registerStepHandoff { handoffTag, handoffData ->
|
|
28
|
+
val payload = Arguments.createMap().apply {
|
|
29
|
+
putString("handoffTag", handoffTag)
|
|
30
|
+
if (handoffData != null) {
|
|
31
|
+
try {
|
|
32
|
+
val map = Arguments.makeNativeMap(handoffData)
|
|
33
|
+
putMap("handoffData", map)
|
|
34
|
+
} catch (e: Exception) {
|
|
35
|
+
Log.d(NAME, "Failed to convert handoffData to NativeMap: ${e.localizedMessage}")
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
sendEvent("Handoff", payload)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@ReactMethod
|
|
44
|
+
fun registerEventHandler() {
|
|
45
|
+
NamiFlowManager.registerEventHandler { data ->
|
|
46
|
+
val payload = Arguments.makeNativeMap(data)
|
|
47
|
+
sendEvent("FlowEvent", payload)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@ReactMethod
|
|
52
|
+
fun resume() {
|
|
53
|
+
Handler(Looper.getMainLooper()).postDelayed({
|
|
54
|
+
NamiFlowManager.resume()
|
|
55
|
+
}, 100L)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private fun sendEvent(eventName: String, params: WritableMap?) {
|
|
59
|
+
reactApplicationContext
|
|
60
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
61
|
+
.emit(eventName, params)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Required for RN EventEmitter support
|
|
65
|
+
@ReactMethod fun addListener(eventName: String?) {}
|
|
66
|
+
@ReactMethod fun removeListeners(count: Int?) {}
|
|
67
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
package com.namiml.reactnative
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.util.Log
|
|
5
|
+
import com.facebook.react.bridge.*
|
|
6
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
7
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
8
|
+
import com.facebook.react.turbomodule.core.interfaces.TurboModule
|
|
9
|
+
import com.namiml.paywall.NamiPaywallManager
|
|
10
|
+
import com.namiml.paywall.NamiSKU
|
|
11
|
+
import com.namiml.paywall.model.NamiPurchaseSuccess
|
|
12
|
+
|
|
13
|
+
@ReactModule(name = NamiPaywallManagerBridgeModule.NAME)
|
|
14
|
+
class NamiPaywallManagerBridgeModule internal constructor(
|
|
15
|
+
reactContext: ReactApplicationContext
|
|
16
|
+
) : ReactContextBaseJavaModule(reactContext), TurboModule {
|
|
17
|
+
|
|
18
|
+
companion object {
|
|
19
|
+
const val NAME = "RNNamiPaywallManager"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override fun getName(): String = NAME
|
|
23
|
+
|
|
24
|
+
private var latestPaywallActivity: Activity? = null
|
|
25
|
+
|
|
26
|
+
@ReactMethod
|
|
27
|
+
fun buySkuComplete(dict: ReadableMap, storeType: String) {
|
|
28
|
+
val product = dict.getMap("product")
|
|
29
|
+
val productId = product?.getString("id")
|
|
30
|
+
val skuRefId = product?.getString("skuId")
|
|
31
|
+
val typeString = product?.getString("type")
|
|
32
|
+
var purchaseSuccess: NamiPurchaseSuccess? = null
|
|
33
|
+
|
|
34
|
+
if (productId != null && skuRefId != null) {
|
|
35
|
+
val namiSku = NamiSKU.create(
|
|
36
|
+
skuRefId = skuRefId,
|
|
37
|
+
skuId = productId,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
when (storeType) {
|
|
41
|
+
"GooglePlay" -> {
|
|
42
|
+
val purchaseToken = dict.getString("purchaseToken")
|
|
43
|
+
val orderId = dict.getString("orderId")
|
|
44
|
+
if (purchaseToken != null && orderId != null) {
|
|
45
|
+
purchaseSuccess = NamiPurchaseSuccess.GooglePlay(
|
|
46
|
+
product = namiSku,
|
|
47
|
+
orderId = orderId,
|
|
48
|
+
purchaseToken = purchaseToken,
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
"Amazon" -> {
|
|
53
|
+
val receiptId = dict.getString("receiptId")
|
|
54
|
+
val localizedPrice = dict.getString("localizedPrice")
|
|
55
|
+
val userId = dict.getString("userId")
|
|
56
|
+
val marketplace = dict.getString("marketplace")
|
|
57
|
+
if (receiptId != null && localizedPrice != null && userId != null && marketplace != null) {
|
|
58
|
+
purchaseSuccess = NamiPurchaseSuccess.Amazon(
|
|
59
|
+
product = namiSku,
|
|
60
|
+
receiptId = receiptId,
|
|
61
|
+
localizedPrice = localizedPrice,
|
|
62
|
+
userId = userId,
|
|
63
|
+
marketplace = marketplace,
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (purchaseSuccess != null) {
|
|
70
|
+
val activity = latestPaywallActivity ?: currentActivity
|
|
71
|
+
if (activity != null) {
|
|
72
|
+
NamiPaywallManager.buySkuComplete(activity, purchaseSuccess)
|
|
73
|
+
} else {
|
|
74
|
+
Log.w(NAME, "No activity available to complete purchase.")
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
Log.d(NAME, "Unable to create a valid NamiPurchaseSuccess object. Purchase not completed.")
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@ReactMethod
|
|
83
|
+
fun registerCloseHandler() {
|
|
84
|
+
NamiPaywallManager.registerCloseHandler { activity ->
|
|
85
|
+
latestPaywallActivity = activity
|
|
86
|
+
val map = Arguments.createMap().apply {
|
|
87
|
+
putBoolean("paywallCloseRequested", true)
|
|
88
|
+
}
|
|
89
|
+
emitEvent("PaywallCloseRequested", map)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@ReactMethod
|
|
94
|
+
fun dismiss(promise: Promise) {
|
|
95
|
+
latestPaywallActivity?.let {
|
|
96
|
+
NamiPaywallManager.dismiss(it) { result -> promise.resolve(result) }
|
|
97
|
+
} ?: promise.resolve(false)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@ReactMethod
|
|
101
|
+
fun registerBuySkuHandler() {
|
|
102
|
+
NamiPaywallManager.registerBuySkuHandler { activity, sku ->
|
|
103
|
+
latestPaywallActivity = activity
|
|
104
|
+
try {
|
|
105
|
+
val dictionary = sku.toSkuDict()
|
|
106
|
+
emitEvent("RegisterBuySKU", dictionary)
|
|
107
|
+
} catch (e: Exception) {
|
|
108
|
+
Log.e(NAME, "Failed to convert SKU: ${e.localizedMessage}")
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@ReactMethod
|
|
114
|
+
fun registerSignInHandler() {
|
|
115
|
+
NamiPaywallManager.registerSignInHandler { activity ->
|
|
116
|
+
latestPaywallActivity = activity
|
|
117
|
+
val map = Arguments.createMap().apply {
|
|
118
|
+
putBoolean("paywallSignInRequested", true)
|
|
119
|
+
}
|
|
120
|
+
emitEvent("PaywallSignInRequested", map)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
@ReactMethod
|
|
125
|
+
fun registerRestoreHandler() {
|
|
126
|
+
NamiPaywallManager.registerRestoreHandler { activity ->
|
|
127
|
+
latestPaywallActivity = activity
|
|
128
|
+
val map = Arguments.createMap().apply {
|
|
129
|
+
putBoolean("paywallRestoreRequested", true)
|
|
130
|
+
}
|
|
131
|
+
emitEvent("PaywallRestoreRequested", map)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@ReactMethod
|
|
136
|
+
fun registerDeeplinkActionHandler() {
|
|
137
|
+
NamiPaywallManager.registerDeepLinkHandler { activity, url ->
|
|
138
|
+
latestPaywallActivity = activity
|
|
139
|
+
emitEvent("PaywallDeeplinkAction", url)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@ReactMethod
|
|
144
|
+
fun show() {
|
|
145
|
+
// No-op on Android
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
@ReactMethod
|
|
149
|
+
fun hide() {
|
|
150
|
+
// No-op on Android
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@ReactMethod
|
|
154
|
+
fun isHidden(promise: Promise) {
|
|
155
|
+
promise.resolve(false)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@ReactMethod
|
|
159
|
+
fun isPaywallOpen(promise: Promise) {
|
|
160
|
+
promise.resolve(NamiPaywallManager.isPaywallOpen())
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@ReactMethod
|
|
164
|
+
fun buySkuCancel() {
|
|
165
|
+
reactApplicationContext.runOnUiQueueThread {
|
|
166
|
+
latestPaywallActivity?.let {
|
|
167
|
+
NamiPaywallManager.buySkuCancel(it)
|
|
168
|
+
} ?: currentActivity?.let {
|
|
169
|
+
NamiPaywallManager.buySkuCancel(it)
|
|
170
|
+
} ?: NamiPaywallManager.buySkuCancel()
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@ReactMethod
|
|
175
|
+
fun setProductDetails(productDetails: String, allowOffers: Boolean) {
|
|
176
|
+
NamiPaywallManager.setProductDetails(productDetails, allowOffers)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
@ReactMethod
|
|
180
|
+
fun setAppSuppliedVideoDetails(url: String, name: String?) {
|
|
181
|
+
NamiPaywallManager.setAppSuppliedVideoDetails(url, name)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
@ReactMethod
|
|
185
|
+
fun allowUserInteraction(allowed: Boolean) {
|
|
186
|
+
NamiPaywallManager.allowPaywallInteraction(allow = allowed)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
@ReactMethod fun addListener(eventName: String?) {}
|
|
190
|
+
@ReactMethod fun removeListeners(count: Int?) {}
|
|
191
|
+
|
|
192
|
+
private fun emitEvent(name: String, payload: Any?) {
|
|
193
|
+
val emitter = reactApplicationContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
194
|
+
emitter.emit(name, payload)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
package com.namiml.reactnative
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import com.facebook.react.bridge.*
|
|
5
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
6
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
7
|
+
import com.facebook.react.turbomodule.core.interfaces.TurboModule
|
|
8
|
+
import com.namiml.billing.NamiPurchaseManager
|
|
9
|
+
|
|
10
|
+
@ReactModule(name = NamiPurchaseManagerBridgeModule.NAME)
|
|
11
|
+
class NamiPurchaseManagerBridgeModule internal constructor(
|
|
12
|
+
private val reactContext: ReactApplicationContext
|
|
13
|
+
) : ReactContextBaseJavaModule(reactContext), TurboModule {
|
|
14
|
+
|
|
15
|
+
companion object {
|
|
16
|
+
const val NAME = "RNNamiPurchaseManager"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getName(): String = NAME
|
|
20
|
+
|
|
21
|
+
@ReactMethod
|
|
22
|
+
fun purchases(resultsCallback: Callback) {
|
|
23
|
+
reactContext.runOnUiQueueThread {
|
|
24
|
+
val purchases = NamiPurchaseManager.allPurchases()
|
|
25
|
+
val resultArray = WritableNativeArray()
|
|
26
|
+
|
|
27
|
+
purchases.forEach { purchase ->
|
|
28
|
+
try {
|
|
29
|
+
resultArray.pushMap(purchase.toPurchaseDict())
|
|
30
|
+
} catch (e: Exception) {
|
|
31
|
+
Log.e(NAME, "Error converting purchase to map", e)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
resultsCallback.invoke(resultArray)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@ReactMethod
|
|
40
|
+
fun skuPurchased(skuID: String, promise: Promise) {
|
|
41
|
+
val isPurchased = NamiPurchaseManager.isSKUIDPurchased(skuID)
|
|
42
|
+
promise.resolve(isPurchased)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@ReactMethod
|
|
46
|
+
fun consumePurchasedSku(skuRefId: String) {
|
|
47
|
+
reactContext.runOnUiQueueThread {
|
|
48
|
+
NamiPurchaseManager.consumePurchasedSKU(skuRefId)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@ReactMethod
|
|
53
|
+
fun anySkuPurchased(skuIDs: ReadableArray, promise: Promise) {
|
|
54
|
+
reactContext.runOnUiQueueThread {
|
|
55
|
+
val checkArray = mutableListOf<String>()
|
|
56
|
+
|
|
57
|
+
for (i in 0 until skuIDs.size()) {
|
|
58
|
+
if (skuIDs.getType(i) == ReadableType.String) {
|
|
59
|
+
skuIDs.getString(i)?.takeIf { it.isNotBlank() }?.let { checkArray.add(it) }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
val anyPurchased = NamiPurchaseManager.anySKUIDPurchased(checkArray)
|
|
64
|
+
promise.resolve(anyPurchased)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@ReactMethod
|
|
69
|
+
fun restorePurchases(resultsCallback: Callback) {
|
|
70
|
+
Log.w(NAME, "Restore Purchases called on Android platform; no-op.")
|
|
71
|
+
|
|
72
|
+
val resultMap = WritableNativeMap().apply {
|
|
73
|
+
putBoolean("success", false)
|
|
74
|
+
putString(
|
|
75
|
+
"error",
|
|
76
|
+
"Google Play or Amazon Appstore on Android devices do not provide a restore purchases API."
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
resultsCallback.invoke(resultMap)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@ReactMethod
|
|
84
|
+
fun registerPurchasesChangedHandler() {
|
|
85
|
+
NamiPurchaseManager.registerPurchasesChangedHandler { purchases, purchaseState, error ->
|
|
86
|
+
val resultPurchases = WritableNativeArray().apply {
|
|
87
|
+
purchases.forEach {
|
|
88
|
+
try {
|
|
89
|
+
pushMap(it.toPurchaseDict())
|
|
90
|
+
} catch (e: Exception) {
|
|
91
|
+
Log.e(NAME, "Failed to map purchase", e)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
val payload = Arguments.createMap().apply {
|
|
97
|
+
putArray("purchases", resultPurchases)
|
|
98
|
+
putString("purchaseState", purchaseState.toString())
|
|
99
|
+
putString("error", error)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
emitEvent("PurchasesChanged", payload)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private fun emitEvent(eventName: String, payload: WritableMap) {
|
|
107
|
+
reactContext
|
|
108
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
109
|
+
.emit(eventName, payload)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@ReactMethod fun addListener(eventName: String?) {}
|
|
113
|
+
@ReactMethod fun removeListeners(count: Int?) {}
|
|
114
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.
|
|
1
|
+
package com.namiml.reactnative
|
|
2
2
|
|
|
3
3
|
import android.util.Log
|
|
4
4
|
import com.facebook.react.bridge.Arguments
|
|
@@ -74,47 +74,50 @@ fun Map<*, *>.toWritableMap(): WritableMap {
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
fun NamiSKU.toSkuDict(): WritableMap {
|
|
77
|
-
val productDict =
|
|
77
|
+
val productDict = WritableNativeMap()
|
|
78
78
|
|
|
79
|
-
productDict.putString("skuId", this.skuId)
|
|
80
79
|
productDict.putString("id", this.id)
|
|
81
|
-
productDict.putString("
|
|
80
|
+
productDict.putString("skuId", this.skuId)
|
|
81
|
+
productDict.putString("name", this.name ?: "")
|
|
82
|
+
productDict.putString("type", this.type?.toString() ?: "unknown")
|
|
82
83
|
|
|
83
|
-
|
|
84
|
-
productDict.putString("promoId",
|
|
84
|
+
this.promoId?.let {
|
|
85
|
+
productDict.putString("promoId", it)
|
|
85
86
|
}
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
productDict.putString("promoToken",
|
|
88
|
+
this.promoOfferToken?.let {
|
|
89
|
+
productDict.putString("promoToken", it)
|
|
89
90
|
}
|
|
90
91
|
|
|
91
92
|
return productDict
|
|
92
93
|
}
|
|
93
94
|
|
|
94
|
-
// Really needs to be a NamiPurchase, when exists...
|
|
95
95
|
fun NamiPurchase.toPurchaseDict(): WritableMap {
|
|
96
96
|
val purchaseMap = WritableNativeMap()
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
purchaseMap.putString("
|
|
98
|
+
purchaseMap.putString("skuId", skuId)
|
|
99
|
+
purchaseMap.putString("transactionIdentifier", transactionIdentifier.orEmpty())
|
|
100
100
|
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
purchaseSource?.let {
|
|
102
|
+
purchaseMap.putString("purchaseSource", it.toString())
|
|
103
|
+
}
|
|
103
104
|
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
namiSku?.let { sku ->
|
|
106
|
+
val skuMap = WritableNativeMap()
|
|
107
|
+
skuMap.putString("id", sku.id)
|
|
108
|
+
skuMap.putString("skuId", sku.skuId)
|
|
109
|
+
skuMap.putString("name", sku.name ?: "")
|
|
110
|
+
skuMap.putString("type", sku.type?.toString() ?: "unknown") // match NamiSKUType
|
|
111
|
+
skuMap.putString("promoId", sku.promoId)
|
|
112
|
+
skuMap.putString("promoToken", sku.promoOfferToken)
|
|
113
|
+
purchaseMap.putMap("sku", skuMap)
|
|
114
|
+
}
|
|
106
115
|
|
|
107
116
|
expires?.let {
|
|
108
|
-
purchaseMap.
|
|
109
|
-
}
|
|
110
|
-
val initiatedTimestamp = purchaseInitiatedTimestamp
|
|
111
|
-
val purchaseInitiatedDate = Date(initiatedTimestamp)
|
|
112
|
-
purchaseInitiatedDate.let {
|
|
113
|
-
purchaseMap.putString("purchaseInitiatedTimestamp", it.toJavascriptDate())
|
|
117
|
+
purchaseMap.putDouble("expires", it.time.toDouble())
|
|
114
118
|
}
|
|
115
119
|
|
|
116
|
-
|
|
117
|
-
purchaseMap.putMap("platformMetadata", WritableNativeMap())
|
|
120
|
+
purchaseMap.putDouble("purchaseInitiatedTimestamp", purchaseInitiatedTimestamp.toDouble())
|
|
118
121
|
|
|
119
122
|
return purchaseMap
|
|
120
123
|
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
export { Nami } from './src/Nami';
|
|
2
|
-
export { NamiMLManager } from './src/NamiMLManager';
|
|
3
2
|
export { NamiCampaignManager } from './src/NamiCampaignManager';
|
|
4
3
|
export { NamiCustomerManager } from './src/NamiCustomerManager';
|
|
5
4
|
export { NamiEntitlementManager } from './src/NamiEntitlementManager';
|
|
6
|
-
export { NamiManager } from './src/NamiManager';
|
|
7
5
|
export { NamiPurchaseManager } from './src/NamiPurchaseManager';
|
|
8
6
|
export { NamiPaywallManager } from './src/NamiPaywallManager';
|
|
9
7
|
export { NamiFlowManager } from './src/NamiFlowManager';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
configure(config: {
|
|
4
|
+
appPlatformID: string;
|
|
5
|
+
logLevel: string;
|
|
6
|
+
namiCommands?: string[];
|
|
7
|
+
namiLanguageCode?: string;
|
|
8
|
+
initialConfig?: string;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
}>;
|
|
12
|
+
sdkConfigured(): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
declare const _default: Spec;
|
|
15
|
+
export default _default;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
launch(label: string | null, withUrl: string | null, context: {
|
|
4
|
+
productGroups?: string[];
|
|
5
|
+
customAttributes?: {
|
|
6
|
+
[key: string]: string;
|
|
7
|
+
};
|
|
8
|
+
customObject?: {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
} | null, completion: (successAction: boolean, error: number | null) => void, paywallCompletion: (event: {
|
|
12
|
+
campaignId?: string;
|
|
13
|
+
campaignName?: string;
|
|
14
|
+
campaignType?: string;
|
|
15
|
+
campaignLabel?: string;
|
|
16
|
+
campaignUrl?: string;
|
|
17
|
+
paywallId?: string;
|
|
18
|
+
paywallName?: string;
|
|
19
|
+
segmentId?: string;
|
|
20
|
+
externalSegmentId?: string;
|
|
21
|
+
action: string;
|
|
22
|
+
sku?: {
|
|
23
|
+
id?: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
skuId?: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
promoId?: string;
|
|
28
|
+
promoToken?: string;
|
|
29
|
+
};
|
|
30
|
+
purchaseError?: string;
|
|
31
|
+
purchases?: Array<{
|
|
32
|
+
sku?: {
|
|
33
|
+
id: string;
|
|
34
|
+
skuId: string;
|
|
35
|
+
name: string;
|
|
36
|
+
type: string;
|
|
37
|
+
};
|
|
38
|
+
skuId: string;
|
|
39
|
+
transactionIdentifier?: string;
|
|
40
|
+
purchaseToken?: string;
|
|
41
|
+
expires?: number;
|
|
42
|
+
purchaseInitiatedTimestamp: number;
|
|
43
|
+
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
44
|
+
}>;
|
|
45
|
+
deeplinkUrl?: string;
|
|
46
|
+
componentChange?: {
|
|
47
|
+
id?: string;
|
|
48
|
+
name?: string;
|
|
49
|
+
};
|
|
50
|
+
videoMetadata?: {
|
|
51
|
+
id?: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
url?: string;
|
|
54
|
+
loopVideo?: boolean;
|
|
55
|
+
muteByDefault?: boolean;
|
|
56
|
+
autoplayVideo?: boolean;
|
|
57
|
+
contentTimecode?: string;
|
|
58
|
+
contentDuration?: string;
|
|
59
|
+
};
|
|
60
|
+
timeSpentOnPaywall?: number;
|
|
61
|
+
}) => void): void;
|
|
62
|
+
allCampaigns(): Promise<{
|
|
63
|
+
id?: string;
|
|
64
|
+
rule?: string;
|
|
65
|
+
segment?: string;
|
|
66
|
+
paywall?: string;
|
|
67
|
+
type: string;
|
|
68
|
+
value?: string;
|
|
69
|
+
}[]>;
|
|
70
|
+
isCampaignAvailable(source?: string): Promise<boolean>;
|
|
71
|
+
refresh(): Promise<{
|
|
72
|
+
id?: string;
|
|
73
|
+
rule?: string;
|
|
74
|
+
segment?: string;
|
|
75
|
+
paywall?: string;
|
|
76
|
+
type: string;
|
|
77
|
+
value?: string;
|
|
78
|
+
}[]>;
|
|
79
|
+
registerAvailableCampaignsHandler(): void;
|
|
80
|
+
}
|
|
81
|
+
declare const _default: Spec;
|
|
82
|
+
export default _default;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
setCustomerAttribute(key: string, value: string): void;
|
|
4
|
+
getCustomerAttribute(key: string): Promise<string | null>;
|
|
5
|
+
clearCustomerAttribute(key: string): void;
|
|
6
|
+
clearAllCustomerAttributes(): void;
|
|
7
|
+
setCustomerDataPlatformId(platformId: string): void;
|
|
8
|
+
clearCustomerDataPlatformId(): void;
|
|
9
|
+
setAnonymousMode(anonymousMode: boolean): void;
|
|
10
|
+
inAnonymousMode(): Promise<boolean>;
|
|
11
|
+
journeyState(): Promise<{
|
|
12
|
+
formerSubscriber: boolean;
|
|
13
|
+
inGracePeriod: boolean;
|
|
14
|
+
inTrialPeriod: boolean;
|
|
15
|
+
inIntroOfferPeriod: boolean;
|
|
16
|
+
isCancelled: boolean;
|
|
17
|
+
inPause: boolean;
|
|
18
|
+
inAccountHold: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
isLoggedIn(): Promise<boolean>;
|
|
21
|
+
loggedInId(): Promise<string | null>;
|
|
22
|
+
deviceId(): Promise<string>;
|
|
23
|
+
login(customerId: string): void;
|
|
24
|
+
logout(): void;
|
|
25
|
+
registerJourneyStateHandler(): void;
|
|
26
|
+
registerAccountStateHandler(): void;
|
|
27
|
+
}
|
|
28
|
+
declare const _default: Spec;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
isEntitlementActive(referenceId?: string): Promise<boolean>;
|
|
4
|
+
active(): Promise<Array<{
|
|
5
|
+
referenceId: string;
|
|
6
|
+
desc?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
purchasedSkus: Array<{
|
|
9
|
+
id: string;
|
|
10
|
+
skuId: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
type: string;
|
|
13
|
+
promoId?: string;
|
|
14
|
+
promoToken?: string;
|
|
15
|
+
}>;
|
|
16
|
+
relatedSkus: Array<{
|
|
17
|
+
id: string;
|
|
18
|
+
skuId: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
type: string;
|
|
21
|
+
promoId?: string;
|
|
22
|
+
promoToken?: string;
|
|
23
|
+
}>;
|
|
24
|
+
activePurchases: Array<{
|
|
25
|
+
skuId: string;
|
|
26
|
+
transactionIdentifier?: string;
|
|
27
|
+
expires?: string;
|
|
28
|
+
purchaseInitiatedTimestamp: string;
|
|
29
|
+
purchaseSource?: string;
|
|
30
|
+
sku?: {
|
|
31
|
+
id: string;
|
|
32
|
+
skuId: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
type: string;
|
|
35
|
+
promoId?: string;
|
|
36
|
+
promoToken?: string;
|
|
37
|
+
};
|
|
38
|
+
}>;
|
|
39
|
+
}>>;
|
|
40
|
+
refresh(): void;
|
|
41
|
+
registerActiveEntitlementsHandler(): void;
|
|
42
|
+
clearProvisionalEntitlementGrants(): void;
|
|
43
|
+
}
|
|
44
|
+
declare const _default: Spec;
|
|
45
|
+
export default _default;
|