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
@@ -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.nami.reactlibrary
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 = Arguments.createMap()
77
+ val productDict = WritableNativeMap()
78
78
 
79
- productDict.putString("skuId", this.skuId)
80
79
  productDict.putString("id", this.id)
81
- productDict.putString("type", this.type.toString())
80
+ productDict.putString("skuId", this.skuId)
81
+ productDict.putString("name", this.name ?: "")
82
+ productDict.putString("type", this.type?.toString() ?: "unknown")
82
83
 
83
- if (this.promoId != null) {
84
- productDict.putString("promoId", this.promoId)
84
+ this.promoId?.let {
85
+ productDict.putString("promoId", it)
85
86
  }
86
87
 
87
- if (this.promoOfferToken != null) {
88
- productDict.putString("promoToken", this.promoOfferToken)
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
- val purchaseSource = purchaseSource.toString()
99
- purchaseMap.putString("purchaseSource", purchaseSource)
98
+ purchaseMap.putString("skuId", skuId)
99
+ purchaseMap.putString("transactionIdentifier", transactionIdentifier.orEmpty())
100
100
 
101
- val skuDict = namiSku?.toSkuDict()
102
- purchaseMap.putMap("sku", skuDict)
101
+ purchaseSource?.let {
102
+ purchaseMap.putString("purchaseSource", it.toString())
103
+ }
103
104
 
104
- purchaseMap.putString("transactionIdentifier", transactionIdentifier.orEmpty())
105
- purchaseMap.putString("skuId", skuId)
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.putString("expires", it.toJavascriptDate())
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
- // TODO: map kotlin dictionary into arbitrary map?
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;
@@ -0,0 +1,8 @@
1
+ import type { TurboModule } from 'react-native';
2
+ export interface Spec extends TurboModule {
3
+ registerStepHandoff(): void;
4
+ resume(): void;
5
+ registerEventHandler(): void;
6
+ }
7
+ declare const _default: Spec;
8
+ export default _default;