react-native-nami-sdk 3.3.0-beta.8 → 3.3.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.
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 +97 -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 +25 -32
  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 +79 -0
  15. package/android/src/main/java/com/namiml/reactnative/NamiPaywallManagerBridgeModule.kt +197 -0
  16. package/android/src/main/java/com/namiml/reactnative/NamiPurchaseManagerBridge.kt +107 -0
  17. package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiUtil.kt +61 -23
  18. package/{index.d.ts → dist/index.d.ts} +0 -2
  19. package/dist/specs/NativeNami.d.ts +16 -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 +10 -0
  24. package/dist/specs/NativeNamiPaywallManager.d.ts +72 -0
  25. package/dist/specs/NativeNamiPurchaseManager.d.ts +27 -0
  26. package/dist/src/Nami.d.ts +6 -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 +13 -0
  31. package/dist/src/NamiPaywallManager.d.ts +30 -0
  32. package/dist/src/NamiPurchaseManager.d.ts +16 -0
  33. package/dist/src/transformers.d.ts +3 -0
  34. package/{src → dist/src}/types.d.ts +36 -6
  35. package/dist/src/version.d.ts +5 -0
  36. package/index.ts +0 -2
  37. package/ios/Nami.m +9 -87
  38. package/ios/Nami.swift +89 -0
  39. package/ios/NamiCampaignManagerBridge.m +3 -3
  40. package/ios/NamiCampaignManagerBridge.swift +47 -61
  41. package/ios/NamiCustomerManager.m +2 -2
  42. package/ios/NamiCustomerManager.swift +11 -3
  43. package/ios/NamiEntitlementManagerBridge.m +2 -3
  44. package/ios/NamiEntitlementManagerBridge.swift +47 -39
  45. package/ios/NamiFlowManagerBridge.m +4 -2
  46. package/ios/NamiFlowManagerBridge.swift +27 -6
  47. package/ios/NamiPaywallManagerBridge.m +3 -3
  48. package/ios/NamiPaywallManagerBridge.swift +24 -6
  49. package/ios/NamiPurchaseManagerBridge.m +3 -4
  50. package/ios/NamiPurchaseManagerBridge.swift +14 -15
  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 +17 -3
  55. package/scripts/generate-version.ts +18 -0
  56. package/specs/NativeNami.ts +17 -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 +13 -0
  61. package/specs/NativeNamiPaywallManager.ts +86 -0
  62. package/specs/NativeNamiPurchaseManager.ts +32 -0
  63. package/src/Nami.ts +31 -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 +42 -44
  68. package/src/NamiPaywallManager.ts +84 -139
  69. package/src/NamiPurchaseManager.ts +66 -70
  70. package/src/transformers.ts +21 -0
  71. package/src/types.ts +40 -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
@@ -1,51 +0,0 @@
1
- package com.nami.reactlibrary;
2
-
3
- import com.facebook.react.ReactPackage;
4
- import com.facebook.react.bridge.JavaScriptModule;
5
- import com.facebook.react.bridge.NativeModule;
6
- import com.facebook.react.bridge.ReactApplicationContext;
7
- import com.facebook.react.shell.MainReactPackage;
8
- import com.facebook.react.uimanager.ViewManager;
9
-
10
- import org.jetbrains.annotations.NotNull;
11
-
12
- import java.util.ArrayList;
13
- import java.util.Arrays;
14
- import java.util.Collections;
15
- import java.util.List;
16
-
17
- public class NamiBridgePackage implements ReactPackage {
18
- @NotNull
19
- @Override
20
- public List<NativeModule> createNativeModules(@NotNull ReactApplicationContext reactContext) {
21
- List<NativeModule> moduleList = new ArrayList<NativeModule>();
22
- moduleList.add(new NamiBridgeModule(reactContext));
23
- moduleList.add(new NamiPaywallManagerBridgeModule(reactContext));
24
- moduleList.add(new NamiPurchaseManagerBridgeModule(reactContext));
25
- moduleList.add(new NamiEntitlementManagerBridgeModule(reactContext));
26
- moduleList.add(new NamiMLManagerBridgeModule(reactContext));
27
- moduleList.add(new NamiManagerBridgeModule(reactContext));
28
- moduleList.add(new NamiCustomerManagerBridgeModule(reactContext));
29
- moduleList.add(new NamiCampaignManagerBridgeModule(reactContext));
30
- moduleList.add(new NamiFlowManagerBridgeModule(reactContext));
31
-
32
- return moduleList;
33
- }
34
-
35
- public List<Class<? extends JavaScriptModule>> createJSModules() {
36
- return null;
37
- }
38
-
39
- @NotNull
40
- @Override
41
- public List<ViewManager> createViewManagers(@NotNull ReactApplicationContext reactContext) {
42
- return Collections.emptyList();
43
- }
44
-
45
- protected List<ReactPackage> getPackages() {
46
- return Arrays.asList(
47
- new MainReactPackage(),
48
- new NamiBridgePackage()
49
- );
50
- }
51
- }
@@ -1,60 +0,0 @@
1
- package com.nami.reactlibrary
2
-
3
- import android.os.Handler
4
- import android.os.Looper
5
- import com.facebook.react.bridge.*
6
- import com.facebook.react.modules.core.DeviceEventManagerModule
7
- import com.namiml.flow.NamiFlowManager
8
-
9
- class NamiFlowManagerBridgeModule(reactContext: ReactApplicationContext) :
10
- ReactContextBaseJavaModule(reactContext) {
11
-
12
- private var eventHandler: ((WritableMap) -> Unit)? = null
13
-
14
- override fun getName(): String {
15
- return "RNNamiFlowManager"
16
- }
17
-
18
- @ReactMethod
19
- fun registerStepHandoff() {
20
- NamiFlowManager.registerStepHandoff { handoffTag, handoffData ->
21
- val payload = Arguments.createMap().apply {
22
- putString("handoffTag", handoffTag)
23
- if (handoffData != null) {
24
- putMap("handoffData", Arguments.makeNativeMap(handoffData))
25
- }
26
- }
27
- sendEvent("RegisterStepHandoff", payload)
28
- }
29
- }
30
-
31
- @ReactMethod
32
- fun registerEventHandler(callback: Callback) {
33
- eventHandler = { payload ->
34
- callback.invoke(payload)
35
- }
36
- }
37
-
38
- @ReactMethod
39
- fun resume() {
40
- val delayMillis = 100L
41
-
42
- Handler(Looper.getMainLooper()).postDelayed({
43
- NamiFlowManager.resume()
44
- }, delayMillis)
45
- }
46
-
47
- private fun sendEvent(eventName: String, params: WritableMap?) {
48
- reactApplicationContext
49
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
50
- .emit(eventName, params)
51
- }
52
-
53
- @ReactMethod
54
- fun addListener(eventName: String?) {
55
- }
56
-
57
- @ReactMethod
58
- fun removeListeners(count: Int?) {
59
- }
60
- }
@@ -1,58 +0,0 @@
1
- package com.nami.reactlibrary
2
-
3
- import com.facebook.react.bridge.ReactApplicationContext
4
- import com.facebook.react.bridge.ReactContextBaseJavaModule
5
- import com.facebook.react.bridge.ReactMethod
6
- import com.facebook.react.bridge.ReadableArray
7
- import com.namiml.ml.NamiMLManager
8
-
9
- class NamiMLManagerBridgeModule(reactContext: ReactApplicationContext) :
10
- ReactContextBaseJavaModule(reactContext) {
11
-
12
- override fun getName(): String {
13
- return "NamiMLManagerBridge"
14
- }
15
-
16
- @ReactMethod
17
- fun enterCoreContentWithLabels(labels: ReadableArray) {
18
- reactApplicationContext.runOnUiQueueThread {
19
- NamiMLManager.enterCoreContent(labels.toArrayList().filterIsInstance<String>())
20
- }
21
- }
22
-
23
- @ReactMethod
24
- fun enterCoreContentWithLabel(label: String) {
25
- reactApplicationContext.runOnUiQueueThread {
26
- NamiMLManager.enterCoreContent(label)
27
- }
28
- }
29
-
30
- @ReactMethod
31
- fun exitCoreContentWithLabels(labels: ReadableArray) {
32
- reactApplicationContext.runOnUiQueueThread {
33
- NamiMLManager.exitCoreContent(labels.toArrayList().filterIsInstance<String>())
34
- }
35
- }
36
-
37
- @ReactMethod
38
- fun exitCoreContentWithLabel(label: String) {
39
- reactApplicationContext.runOnUiQueueThread {
40
- NamiMLManager.exitCoreContent(label)
41
- }
42
- }
43
-
44
- @ReactMethod
45
- fun coreActionWithLabel(label: String) {
46
- reactApplicationContext.runOnUiQueueThread {
47
- NamiMLManager.coreAction(label)
48
- }
49
- }
50
-
51
- @ReactMethod
52
- fun addListener(eventName: String?) {
53
- }
54
-
55
- @ReactMethod
56
- fun removeListeners(count: Int?) {
57
- }
58
- }
@@ -1,26 +0,0 @@
1
- package com.nami.reactlibrary
2
-
3
- import com.facebook.react.bridge.*
4
- import com.namiml.Nami
5
-
6
- class NamiManagerBridgeModule(reactContext: ReactApplicationContext) :
7
- ReactContextBaseJavaModule(reactContext) {
8
-
9
- override fun getName(): String {
10
- return "RNNamiManager"
11
- }
12
-
13
- @ReactMethod
14
- fun sdkConfigured(promise: Promise) {
15
- val sdkConfigured = Nami.isInitialized()
16
- promise.resolve(sdkConfigured)
17
- }
18
-
19
- @ReactMethod
20
- fun addListener(eventName: String?) {
21
- }
22
-
23
- @ReactMethod
24
- fun removeListeners(count: Int?) {
25
- }
26
- }
@@ -1,258 +0,0 @@
1
- package com.nami.reactlibrary
2
-
3
- import android.app.Activity
4
- import android.content.Intent
5
- import android.util.Log
6
- import com.facebook.react.bridge.*
7
- import com.facebook.react.modules.core.DeviceEventManagerModule
8
- import com.namiml.paywall.NamiPaywallManager
9
- import com.namiml.paywall.NamiPurchaseSource
10
- import com.namiml.paywall.NamiSKU
11
- import com.namiml.paywall.NamiSKUType
12
- import com.namiml.paywall.model.NamiPurchaseSuccess
13
- import java.util.*
14
-
15
- class NamiPaywallManagerBridgeModule(reactContext: ReactApplicationContext) :
16
- ReactContextBaseJavaModule(reactContext), ActivityEventListener {
17
-
18
- var latestPaywallActivity: Activity? = null
19
-
20
- override fun getName(): String {
21
- return "RNNamiPaywallManager"
22
- }
23
-
24
- @ReactMethod
25
- fun buySkuComplete(dict: ReadableMap, storeType: String) {
26
- var product: ReadableMap? = null
27
- var productId: String? = null
28
- var skuRefId: String? = null
29
- var typeString: String? = null
30
-
31
- var skuType: NamiSKUType?
32
-
33
- var purchaseToken: String? = null
34
- var orderId: String? = null
35
-
36
- var receiptId: String? = null
37
- var localizedPrice: String? = null
38
- var userId: String? = null
39
- var marketplace: String? = null
40
-
41
- if (dict.hasKey("product")) {
42
- product = dict.getMap("product")
43
- }
44
-
45
- if (product != null) {
46
- if (product.hasKey("id")) {
47
- productId = product.getString("id")
48
- }
49
-
50
- if (product.hasKey("skuId")) {
51
- skuRefId = product.getString("skuId")
52
- }
53
-
54
- if (product.hasKey("type")) {
55
- typeString = product.getString("type")
56
- }
57
- }
58
-
59
- if (productId != null && skuRefId != null) {
60
- val namiSku = NamiSKU.create(
61
- skuRefId = skuRefId,
62
- skuId = productId,
63
- )
64
- var purchaseSuccess: NamiPurchaseSuccess? = null
65
-
66
- if (storeType == "GooglePlay") {
67
- if (dict.hasKey("purchaseToken")) {
68
- purchaseToken = dict.getString("purchaseToken")
69
- }
70
- if (dict.hasKey("orderId")) {
71
- orderId = dict.getString("orderId")
72
- }
73
- Log.d(LOG_TAG, "$namiSku $purchaseToken $orderId")
74
-
75
- if (namiSku != null && purchaseToken != null && orderId != null) {
76
- purchaseSuccess = NamiPurchaseSuccess.GooglePlay(
77
- product = namiSku,
78
- orderId = orderId,
79
- purchaseToken = purchaseToken,
80
- )
81
- }
82
- } else if (storeType == "Amazon") {
83
- if (dict.hasKey("receiptId")) {
84
- receiptId = dict.getString("receiptId")
85
- }
86
- if (dict.hasKey("localizedPrice")) {
87
- localizedPrice = dict.getString("localizedPrice")
88
- }
89
- if (dict.hasKey("userId")) {
90
- userId = dict.getString("userId")
91
- }
92
- if (dict.hasKey("marketplace")) {
93
- marketplace = dict.getString("marketplace")
94
- }
95
- if (namiSku != null && receiptId != null && localizedPrice != null && userId != null && marketplace != null) {
96
- purchaseSuccess = NamiPurchaseSuccess.Amazon(
97
- product = namiSku,
98
- receiptId = receiptId,
99
- localizedPrice = localizedPrice,
100
- userId = userId,
101
- marketplace = marketplace,
102
- )
103
- }
104
- }
105
-
106
- if (purchaseSuccess != null) {
107
- if (latestPaywallActivity != null) {
108
- NamiPaywallManager.buySkuComplete(latestPaywallActivity!!, purchaseSuccess)
109
- } else {
110
- NamiPaywallManager.buySkuComplete(currentActivity!!, purchaseSuccess)
111
- }
112
- } else {
113
- Log.d(LOG_TAG, "Unable to create a valid NamiPurchaseSuccess object, so buySkuComplete will not succeed. Paywall conversion will not be reported for this purchase.")
114
- }
115
- }
116
- }
117
-
118
- @ReactMethod
119
- fun registerCloseHandler() {
120
- NamiPaywallManager.registerCloseHandler { activity ->
121
- latestPaywallActivity = activity
122
- val map = Arguments.createMap().apply {
123
- putBoolean("paywallCloseRequested", true)
124
- }
125
- reactApplicationContext
126
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
127
- .emit("PaywallCloseRequested", map)
128
- }
129
- }
130
-
131
- @ReactMethod
132
- fun dismiss(promise: Promise) {
133
- if (latestPaywallActivity != null) {
134
- val paywallActivity = latestPaywallActivity as Activity
135
- NamiPaywallManager.dismiss(paywallActivity, completionHandler = {
136
- promise.resolve(it)
137
- })
138
- }
139
- }
140
-
141
- @ReactMethod
142
- fun registerBuySkuHandler() {
143
- NamiPaywallManager.registerBuySkuHandler { activity, sku ->
144
- latestPaywallActivity = activity
145
- val dictionary = sku.toSkuDict()
146
- reactApplicationContext
147
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
148
- .emit("RegisterBuySKU", dictionary)
149
- }
150
- }
151
-
152
- @ReactMethod
153
- fun registerSignInHandler() {
154
- NamiPaywallManager.registerSignInHandler { activity ->
155
- latestPaywallActivity = activity
156
- val map = Arguments.createMap().apply {
157
- putBoolean("paywallSignInRequested", true)
158
- }
159
- reactApplicationContext
160
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
161
- .emit("PaywallSignInRequested", map)
162
- }
163
- }
164
-
165
- @ReactMethod
166
- fun registerRestoreHandler() {
167
- NamiPaywallManager.registerRestoreHandler { activity ->
168
- latestPaywallActivity = activity
169
- val map = Arguments.createMap().apply {
170
- putBoolean("paywallRestoreRequested", true)
171
- }
172
- reactApplicationContext
173
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
174
- .emit("PaywallRestoreRequested", map)
175
- }
176
- }
177
-
178
- @ReactMethod
179
- fun registerDeeplinkActionHandler() {
180
- NamiPaywallManager.registerDeepLinkHandler { activity, url ->
181
- latestPaywallActivity = activity
182
- reactApplicationContext
183
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
184
- .emit("PaywallDeeplinkAction", url)
185
- }
186
- }
187
-
188
- @ReactMethod
189
- fun show() {
190
- // Do nothing on Android side
191
- }
192
-
193
- @ReactMethod
194
- fun hide() {
195
- // Do nothing on Android side
196
- }
197
-
198
- @ReactMethod
199
- fun isHidden(promise: Promise) {
200
- // Do nothing on Android side
201
- promise.resolve(false)
202
- }
203
-
204
- @ReactMethod
205
- fun isPaywallOpen(promise: Promise) {
206
- val paywallOpen = NamiPaywallManager.isPaywallOpen()
207
- promise.resolve(paywallOpen)
208
- }
209
-
210
- @ReactMethod
211
- fun buySkuCancel() {
212
- reactApplicationContext.runOnUiQueueThread {
213
- if (latestPaywallActivity != null) {
214
- NamiPaywallManager.buySkuCancel(latestPaywallActivity!!)
215
- } else if (currentActivity != null) {
216
- NamiPaywallManager.buySkuCancel(currentActivity!!)
217
- } else {
218
- NamiPaywallManager.buySkuCancel()
219
- }
220
- }
221
- }
222
-
223
- @ReactMethod
224
- fun setProductDetails(productDetails: String, allowOffers: Boolean) {
225
- NamiPaywallManager.setProductDetails(productDetails, allowOffers = allowOffers)
226
- }
227
-
228
- @ReactMethod
229
- fun setAppSuppliedVideoDetails(url: String, name: String?) {
230
- NamiPaywallManager.setAppSuppliedVideoDetails(url = url, name = name)
231
- }
232
-
233
- @ReactMethod
234
- fun allowUserInteraction(allowed: Boolean) {
235
- NamiPaywallManager.allowPaywallInteraction(allow = allowed)
236
- }
237
-
238
- @ReactMethod
239
- fun addListener(eventName: String?) {
240
- }
241
-
242
- @ReactMethod
243
- fun removeListeners(count: Int?) {
244
- }
245
-
246
- override fun onActivityResult(
247
- activity: Activity?,
248
- requestCode: Int,
249
- resultCode: Int,
250
- data: Intent?,
251
- ) {
252
- Log.d(LOG_TAG, "Nami Activity result listener activated, code is $requestCode")
253
- }
254
-
255
- override fun onNewIntent(intent: Intent?) {
256
- // do nothing
257
- }
258
- }
@@ -1,108 +0,0 @@
1
- package com.nami.reactlibrary
2
-
3
- import android.util.Log
4
- import com.facebook.react.bridge.*
5
- import com.facebook.react.modules.core.DeviceEventManagerModule
6
- import com.namiml.billing.NamiPurchaseManager
7
-
8
- class NamiPurchaseManagerBridgeModule(reactContext: ReactApplicationContext) :
9
- ReactContextBaseJavaModule(reactContext) {
10
-
11
- override fun getName(): String {
12
- return "RNNamiPurchaseManager"
13
- }
14
-
15
- @ReactMethod
16
- fun purchases(resultsCallback: Callback) {
17
- reactApplicationContext.runOnUiQueueThread {
18
- val purchases = NamiPurchaseManager.allPurchases()
19
-
20
- // Pass back empty array until we can get purchases from the SDK
21
- val resultArray: WritableArray = WritableNativeArray()
22
-
23
- for (purchase in purchases) {
24
- resultArray.pushMap(purchase.toPurchaseDict())
25
- }
26
-
27
- resultsCallback.invoke(resultArray)
28
- }
29
- }
30
-
31
- @ReactMethod
32
- fun skuPurchased(skuID: String, promise: Promise) {
33
- val isPurchased = NamiPurchaseManager.isSKUIDPurchased(skuID)
34
- promise.resolve(isPurchased)
35
- }
36
-
37
- @ReactMethod
38
- fun consumePurchasedSku(skuRefId: String) {
39
- reactApplicationContext.runOnUiQueueThread {
40
- NamiPurchaseManager.consumePurchasedSKU(skuRefId)
41
- }
42
- }
43
-
44
- @ReactMethod
45
- fun anySkuPurchased(skuIDs: ReadableArray, promise: Promise) {
46
- reactApplicationContext.runOnUiQueueThread {
47
- val checkArray: MutableList<String> = mutableListOf()
48
- for (x in 0 until skuIDs.size()) {
49
- if (skuIDs.getType(x) == ReadableType.String) {
50
- val skuID = skuIDs.getString(x)
51
- if (skuID != null && skuID.isNotEmpty()) {
52
- checkArray.add(skuID)
53
- }
54
- }
55
- }
56
-
57
- val anyPurchased = NamiPurchaseManager.anySKUIDPurchased(checkArray)
58
-
59
- promise.resolve(anyPurchased)
60
- }
61
- }
62
-
63
- @ReactMethod
64
- fun restorePurchases(resultsCallback: Callback) {
65
- Log.w(LOG_TAG, "Restore Purchases called on Android platform, has no effect on Android.")
66
-
67
- val resultMap = WritableNativeMap().apply {
68
- putBoolean("success", false)
69
- putString(
70
- "error",
71
- "Google Play or Amazon Appstore on Android devices do not provide an API method to restore purchases.",
72
- )
73
- }
74
- resultsCallback.invoke(resultMap)
75
- }
76
-
77
- @ReactMethod
78
- fun registerPurchasesChangedHandler() {
79
- NamiPurchaseManager.registerPurchasesChangedHandler { purchases, purchaseState, error ->
80
- run {
81
- val resultPurchases: WritableArray = WritableNativeArray()
82
-
83
- for (purchase in purchases) {
84
- resultPurchases.pushMap(purchase.toPurchaseDict())
85
- }
86
-
87
- val stateString = purchaseState.toString()
88
-
89
- val payload = Arguments.createMap()
90
- payload.putArray("purchases", resultPurchases)
91
- payload.putString("purchaseState", stateString)
92
- payload.putString("error", error)
93
-
94
- reactApplicationContext
95
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
96
- .emit("PurchasesChanged", payload)
97
- }
98
- }
99
- }
100
-
101
- @ReactMethod
102
- fun addListener(eventName: String?) {
103
- }
104
-
105
- @ReactMethod
106
- fun removeListeners(count: Int?) {
107
- }
108
- }
@@ -1,140 +0,0 @@
1
- #!/usr/bin/python3
2
-
3
- import sys
4
- import getopt
5
- import json
6
-
7
- from google.auth.exceptions import DefaultCredentialsError
8
- from google.oauth2 import service_account
9
- from googleapiclient import discovery, errors
10
-
11
- from pyasn1.error import SubstrateUnderrunError
12
-
13
- def printv(text):
14
- if show_output:
15
- print(text)
16
-
17
- def create_edit(service, package_name):
18
- printv(f"Create an edit for the package {package_name}")
19
- try:
20
- edit_request = service.edits().insert(body={}, packageName=package_name)
21
- edit_response = edit_request.execute()
22
- printv(f"Created edit {edit_response} for package {package_name}")
23
- except (errors.Error, errors.HttpError) as e:
24
- raise(f"Error creating edit {e}")
25
- else:
26
- if "id" in edit_response:
27
- return edit_response["id"]
28
-
29
- def delete_edit(service, package_name, edit_id):
30
- printv(f"Delete an edit for the package {package_name}")
31
- try:
32
- delete_request = service.edits().delete(packageName=package_name, editId=edit_id)
33
- delete_response = delete_request.execute()
34
- printv(f"Deleted edit {delete_response} for package {package_name}")
35
- except (errors.Error, errors.HttpError) as e:
36
- raise(f"Error deleting edit {e}")
37
-
38
- def get_credentials_response(service_credentials_path):
39
- try:
40
- credentials_response = service_account.Credentials.from_service_account_file(
41
- service_credentials_path)
42
- except ValueError as error:
43
- printv(f"401: {error}")
44
- return None
45
- except DefaultCredentialsError as error:
46
- printv(f"401: {error}")
47
- return None
48
- except SubstrateUnderrunError as error:
49
- printv(f"401: The service credentials are malformed")
50
- return None
51
-
52
- if type(credentials_response) is service_account.Credentials:
53
- return credentials_response
54
- else:
55
- printv(f"401: Unknown error with service account credentials.")
56
- return None
57
-
58
- def get_track(service, package_name, edit_id, track_name):
59
- request = (
60
- service.edits().tracks()
61
- .get(packageName=package_name, editId=edit_id, track=track_name)
62
- )
63
- try:
64
- response = request.execute()
65
- except errors.HttpError as error:
66
- error_content = json.loads(error.content)
67
- if "error" in error_content:
68
- error = error_content["error"]
69
-
70
- if "code" in error:
71
- status_code = error["code"]
72
- else:
73
- status_code = 000
74
-
75
- if "message" in error:
76
- message = error["message"]
77
- else:
78
- message = "Unknown error"
79
-
80
- printv(f"{status_code}: {message}")
81
- else:
82
- printv(f"200: API request was successful")
83
- printv(response)
84
- version_codes = []
85
- if "releases" in response:
86
- releases = response["releases"]
87
- for release in releases:
88
- if "versionCodes" in release:
89
- all_codes = release["versionCodes"]
90
- for code in all_codes:
91
- printv(code)
92
- if code in version_codes:
93
- pass
94
- else:
95
- version_codes.append(int(code))
96
-
97
- printv(f"observed codes: {version_codes}")
98
- new_version = max(version_codes)+1
99
- print(f"{new_version}")
100
- with open(".new_version_code", "w") as f:
101
- f.write(
102
- f"{new_version}"
103
- )
104
-
105
- def get_version_code(service_credentials_path, package_name, track_name):
106
- credentials = get_credentials_response(service_credentials_path)
107
-
108
- service = discovery.build(
109
- "androidpublisher", "v3", credentials=credentials, cache_discovery=False
110
- )
111
-
112
- edit_id = create_edit(service, package_name)
113
- get_track(service, package_name, edit_id, track_name)
114
- delete_edit(service, package_name, edit_id)
115
-
116
- if __name__ == "__main__":
117
- help_message = "get_version_code.py /path/to/service_credentials.json [package_name] [track_name] <OPTIONAL: --quiet>"
118
-
119
- if len(sys.argv) < 4:
120
- print(help_message)
121
- sys.exit(2)
122
-
123
- service_credentials = sys.argv[1]
124
-
125
- package_name = sys.argv[2]
126
- track_name = sys.argv[3]
127
-
128
- show_output = True
129
-
130
- try:
131
- opts, args = getopt.getopt(sys.argv[4:], "", ["quiet"])
132
- except getopt.GetoptError:
133
- print(help_message)
134
- sys.exit(2)
135
-
136
- for opt, arg in opts:
137
- if opt in ("--quiet"):
138
- show_output = False
139
-
140
- get_version_code(service_credentials, package_name, track_name)