@circle-fin/w3s-pw-react-native-sdk 1.1.5 → 2.0.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 (114) hide show
  1. package/BARE_REACT_NATIVE_GUIDE.md +397 -0
  2. package/LICENSE +1 -1
  3. package/README.md +196 -90
  4. package/android/build.gradle +43 -126
  5. package/android/src/main/AndroidManifest.xml +12 -16
  6. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/ProgrammablewalletRnSdkModule.kt +414 -244
  7. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/PromiseCallback.kt +76 -74
  8. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/RecordsHelper.kt +602 -0
  9. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/models/Records.kt +43 -0
  10. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/pwcustom/RnImageSetter.kt +55 -33
  11. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/pwcustom/RnLayoutProvider.kt +81 -79
  12. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/pwcustom/RnViewSetterProvider.kt +93 -63
  13. package/app.json +8 -0
  14. package/build/ProgrammablewalletRnSdkModule.d.ts +44 -0
  15. package/build/ProgrammablewalletRnSdkModule.d.ts.map +1 -0
  16. package/build/ProgrammablewalletRnSdkModule.js +21 -0
  17. package/build/ProgrammablewalletRnSdkModule.js.map +1 -0
  18. package/build/WalletSdk.d.ts +20 -0
  19. package/build/WalletSdk.d.ts.map +1 -0
  20. package/build/WalletSdk.js +303 -0
  21. package/build/WalletSdk.js.map +1 -0
  22. package/build/bridgeSafe.d.ts +50 -0
  23. package/build/bridgeSafe.d.ts.map +1 -0
  24. package/build/bridgeSafe.js +136 -0
  25. package/build/bridgeSafe.js.map +1 -0
  26. package/build/index.d.ts +21 -0
  27. package/build/index.d.ts.map +1 -0
  28. package/build/index.js +21 -0
  29. package/build/index.js.map +1 -0
  30. package/{lib/typescript/src → build}/types.d.ts +72 -43
  31. package/build/types.d.ts.map +1 -0
  32. package/build/types.js +331 -0
  33. package/build/types.js.map +1 -0
  34. package/build/utils/securityQuestionUtils.d.ts +43 -0
  35. package/build/utils/securityQuestionUtils.d.ts.map +1 -0
  36. package/build/utils/securityQuestionUtils.js +109 -0
  37. package/build/utils/securityQuestionUtils.js.map +1 -0
  38. package/expo-module.config.json +11 -0
  39. package/ios/Array+Extension.swift +17 -15
  40. package/ios/BridgeHelper.swift +71 -92
  41. package/ios/{RnWalletSdk+CustomizeAdapter.swift → CustomizeAdapter.swift} +19 -29
  42. package/ios/ProgrammablewalletRnSdk.podspec +30 -0
  43. package/ios/ProgrammablewalletRnSdkModule.swift +384 -0
  44. package/ios/TextConfig.swift +17 -15
  45. package/ios/TextKey.swift +17 -15
  46. package/ios/UIApplication+Extension.swift +26 -17
  47. package/ios/UIColor+Extension.swift +34 -28
  48. package/ios/UITextField+Extension.swift +31 -0
  49. package/ios/UIView+Extension.swift +24 -17
  50. package/package.json +70 -136
  51. package/plugins/apple-signin-entitlements.js +16 -0
  52. package/plugins/infoplist-config.js +77 -0
  53. package/plugins/infoplist-config.md +72 -0
  54. package/plugins/podfile-modifier.js +84 -0
  55. package/plugins/podfile-modifier.md +33 -0
  56. package/plugins/withCopyFiles.js +132 -0
  57. package/plugins/withCopyFiles.md +81 -0
  58. package/src/ProgrammablewalletRnSdkModule.ts +68 -38
  59. package/src/WalletSdk.ts +297 -155
  60. package/src/bridgeSafe.ts +156 -0
  61. package/src/index.ts +21 -0
  62. package/src/types.ts +133 -110
  63. package/src/utils/securityQuestionUtils.ts +121 -0
  64. package/COPYRIGHT +0 -10
  65. package/android/gradle.properties +0 -21
  66. package/android/src/main/AndroidManifestNew.xml +0 -22
  67. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/BridgeHelper.kt +0 -399
  68. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/ProgrammablewalletRnSdkPackage.kt +0 -49
  69. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/PromiseCallback2.kt +0 -65
  70. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/PromiseLogoutCallback.kt +0 -47
  71. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/PromiseSocialCallback.kt +0 -53
  72. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/TestHelper.kt +0 -37
  73. package/android/src/main/java/com/circlefin/programmablewalletrnsdk/annotation/ExcludeFromGeneratedCCReport.kt +0 -33
  74. package/android/src/newarch/ProgrammablewalletRnSdkSpec.kt +0 -29
  75. package/android/src/oldarch/ProgrammablewalletRnSdkSpec.kt +0 -76
  76. package/circlefin-w3s-pw-react-native-sdk.podspec +0 -41
  77. package/ios/EventEmitter.swift +0 -49
  78. package/ios/ProgrammablewalletRnSdk.h +0 -29
  79. package/ios/ProgrammablewalletRnSdk.mm +0 -162
  80. package/ios/ReactNativeEventEmitter.m +0 -27
  81. package/ios/ReactNativeEventEmitter.swift +0 -37
  82. package/ios/RnWalletSdk.swift +0 -385
  83. package/ios/programmablewallet-rn-sdk-Bridging-Header.h +0 -22
  84. package/lib/commonjs/NativeProgrammablewalletRnSdk.js +0 -24
  85. package/lib/commonjs/NativeProgrammablewalletRnSdk.js.map +0 -1
  86. package/lib/commonjs/ProgrammablewalletRnSdkModule.js +0 -38
  87. package/lib/commonjs/ProgrammablewalletRnSdkModule.js.map +0 -1
  88. package/lib/commonjs/WalletSdk.js +0 -206
  89. package/lib/commonjs/WalletSdk.js.map +0 -1
  90. package/lib/commonjs/index.js +0 -74
  91. package/lib/commonjs/index.js.map +0 -1
  92. package/lib/commonjs/types.js +0 -342
  93. package/lib/commonjs/types.js.map +0 -1
  94. package/lib/module/NativeProgrammablewalletRnSdk.js +0 -19
  95. package/lib/module/NativeProgrammablewalletRnSdk.js.map +0 -1
  96. package/lib/module/ProgrammablewalletRnSdkModule.js +0 -31
  97. package/lib/module/ProgrammablewalletRnSdkModule.js.map +0 -1
  98. package/lib/module/WalletSdk.js +0 -198
  99. package/lib/module/WalletSdk.js.map +0 -1
  100. package/lib/module/index.js +0 -18
  101. package/lib/module/index.js.map +0 -1
  102. package/lib/module/types.js +0 -334
  103. package/lib/module/types.js.map +0 -1
  104. package/lib/typescript/src/NativeProgrammablewalletRnSdk.d.ts +0 -28
  105. package/lib/typescript/src/NativeProgrammablewalletRnSdk.d.ts.map +0 -1
  106. package/lib/typescript/src/ProgrammablewalletRnSdkModule.d.ts +0 -3
  107. package/lib/typescript/src/ProgrammablewalletRnSdkModule.d.ts.map +0 -1
  108. package/lib/typescript/src/WalletSdk.d.ts +0 -3
  109. package/lib/typescript/src/WalletSdk.d.ts.map +0 -1
  110. package/lib/typescript/src/index.d.ts +0 -4
  111. package/lib/typescript/src/index.d.ts.map +0 -1
  112. package/lib/typescript/src/types.d.ts.map +0 -1
  113. package/src/NativeProgrammablewalletRnSdk.ts +0 -77
  114. package/src/index.tsx +0 -29
@@ -1,260 +1,430 @@
1
- // Copyright (c) 2024, Circle Internet Financial, LTD. All rights reserved.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- //
5
- // Licensed under the Apache License, Version 2.0 (the "License");
6
- // you may not use this file except in compliance with the License.
7
- // You may obtain a copy of the License at
8
- //
9
- // http://www.apache.org/licenses/LICENSE-2.0
10
- //
11
- // Unless required by applicable law or agreed to in writing, software
12
- // distributed under the License is distributed on an "AS IS" BASIS,
13
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- // See the License for the specific language governing permissions and
15
- // limitations under the License.
1
+ /**
2
+ * Copyright 2025 Circle Internet Group, Inc. All rights reserved.
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
16
19
  package com.circlefin.programmablewalletrnsdk
17
20
 
18
- import android.app.ActivityManager
19
- import android.content.Context
21
+ import android.util.Log
20
22
  import circle.programmablewallet.sdk.WalletSdk
21
- import circle.programmablewallet.sdk.WalletSdk.execute
22
23
  import circle.programmablewallet.sdk.WalletSdk.init
23
- import circle.programmablewallet.sdk.WalletSdk.setLayoutProvider
24
- import circle.programmablewallet.sdk.WalletSdk.setSecurityQuestions
25
- import circle.programmablewallet.sdk.WalletSdk.setViewSetterProvider
26
24
  import circle.programmablewallet.sdk.api.ExecuteEvent
27
25
  import circle.programmablewallet.sdk.api.SocialProvider
26
+ import circle.programmablewallet.sdk.api.SocialCallback
27
+ import circle.programmablewallet.sdk.api.LogoutCallback
28
28
  import circle.programmablewallet.sdk.presentation.EventListener
29
- import com.circlefin.programmablewalletrnsdk.annotation.ExcludeFromGeneratedCCReport
29
+ import circle.programmablewallet.sdk.result.ExecuteResult
30
+ import circle.programmablewallet.sdk.result.LoginResult
31
+ import com.circlefin.programmablewalletrnsdk.models.ConfigurationRecord
30
32
  import com.circlefin.programmablewalletrnsdk.pwcustom.RnLayoutProvider
31
33
  import com.circlefin.programmablewalletrnsdk.pwcustom.RnViewSetterProvider
32
- import com.facebook.react.bridge.Arguments
33
- import com.facebook.react.bridge.Promise
34
- import com.facebook.react.bridge.ReactApplicationContext
35
- import com.facebook.react.bridge.ReactMethod
36
- import com.facebook.react.bridge.ReadableArray
37
- import com.facebook.react.bridge.ReadableMap
38
- import com.facebook.react.modules.core.DeviceEventManagerModule
39
-
40
-
41
- class ProgrammablewalletRnSdkModule internal constructor(context: ReactApplicationContext) :
42
- ProgrammablewalletRnSdkSpec(context), EventListener {
43
- private var layoutProvider: RnLayoutProvider =
44
- RnLayoutProvider
45
- private var viewSetterProvider: RnViewSetterProvider =
46
- RnViewSetterProvider
47
- private var reactContext: ReactApplicationContext
48
-
49
- init {
50
- reactContext = context
51
- setLayoutProvider(layoutProvider)
52
- setViewSetterProvider(viewSetterProvider)
53
- }
54
-
55
- @ExcludeFromGeneratedCCReport
56
- override fun getName(): String {
57
- return NAME
58
- }
59
-
60
- @ReactMethod
61
- override fun setIconTextConfigsMap(readableMap: ReadableMap) {
62
- val map = BridgeHelper.getIconTextConfigsMap(reactContext, readableMap)
63
- layoutProvider.setIconTextConfigsMap(map)
64
- }
65
-
66
- @ReactMethod
67
- override fun setTextConfigMap(readableMap: ReadableMap) {
68
- val map = BridgeHelper.getTextConfigMap(reactContext, readableMap)
69
- layoutProvider.setTextConfigMap(map)
70
- }
71
-
72
- @ReactMethod
73
- override fun setImageMap(readableMap: ReadableMap) {
74
- val map = BridgeHelper.reactNativeMapToStringMap(readableMap)
75
- viewSetterProvider.setMap(map)
76
- }
77
-
78
- @ReactMethod
79
- override fun setDateFormat(value: String) {
80
- layoutProvider.setDateFormat(value)
81
- }
82
-
83
- @ReactMethod
84
- override fun setDebugging(value: Boolean) {
85
- layoutProvider.setDebugging(value)
86
- }
87
-
88
- @ReactMethod
89
- override fun setCustomUserAgent(value: String) {
90
- WalletSdk.setCustomUserAgent(value)
91
- }
92
-
93
- @ReactMethod
94
- override fun setErrorStringMap(readableMap: ReadableMap) {
95
- val map = BridgeHelper.getErrorStringMap(readableMap)
96
- layoutProvider.setErrorStringMap(map)
97
- }
98
-
99
- @ReactMethod
100
- override fun setTextConfigsMap(readableMap: ReadableMap) {
101
- val map = BridgeHelper.getTextConfigsMap(reactContext, readableMap)
102
- layoutProvider.setTextConfigsMap(map)
103
- }
104
-
105
- @ReactMethod
106
- override fun setDismissOnCallbackMap(readableMap: ReadableMap) {
107
- val map = BridgeHelper.getDismissOnCallbackMap(readableMap)
108
- setDismissOnCallbackMap(map)
109
- }
110
-
111
- @ExcludeFromGeneratedCCReport
112
- @ReactMethod
113
- override fun moveRnTaskToFront() {
114
- currentActivity?.let {
115
- try {
116
- val activityManager = reactContext
117
- .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
118
- activityManager.moveTaskToFront(it.taskId, 0)
119
- } catch (e: Throwable) {
120
- e.printStackTrace()
121
- }
34
+ import expo.modules.kotlin.Promise
35
+ import expo.modules.kotlin.exception.CodedException
36
+ import expo.modules.kotlin.exception.Exceptions
37
+ import expo.modules.kotlin.modules.Module
38
+ import expo.modules.kotlin.modules.ModuleDefinition
39
+
40
+ class ProgrammablewalletRnSdkModule : Module(), EventListener {
41
+ private var layoutProvider: RnLayoutProvider = RnLayoutProvider
42
+ private var viewSetterProvider: RnViewSetterProvider = RnViewSetterProvider
43
+
44
+ init {
45
+ setLayoutProvider(layoutProvider)
46
+ setViewSetterProvider(viewSetterProvider)
122
47
  }
123
- }
124
-
125
- @ExcludeFromGeneratedCCReport
126
- @ReactMethod
127
- override fun moveTaskToFront() {
128
- WalletSdk.moveTaskToFront(reactContext)
129
- }
130
-
131
- @ReactMethod
132
- override fun setSecurityQuestions(questionArr: ReadableArray) {
133
- try {
134
- val questions = BridgeHelper.getSecurityQuestions(questionArr)
135
- setSecurityQuestions(questions)
136
- } catch (e: Throwable) {
137
- e.printStackTrace()
48
+
49
+ private fun setLayoutProvider(provider: RnLayoutProvider) {
50
+ WalletSdk.setLayoutProvider(provider)
138
51
  }
139
- }
140
-
141
- @ReactMethod
142
- override fun initSdk(configuration: ReadableMap, promise: Promise) {
143
- try {
144
- // Append ending slash if needed
145
- val endpoint = configuration.getString("endpoint")?.run {
146
- if (this.endsWith("/")) this else "$this/"
147
- }
148
- val appId = configuration.getString("appId")
149
- val settings = BridgeHelper.getSettingsManagement(configuration)
150
- WalletSdk.addEventListener(this)
151
- init(
152
- reactContext,
153
- WalletSdk.Configuration(endpoint, appId, settings)
154
- )
155
- promise.resolve(Arguments.createMap())
156
- } catch (e: Throwable) {
157
- promise.reject(RuntimeException(e.message))
52
+
53
+ private fun setViewSetterProvider(provider: RnViewSetterProvider) {
54
+ WalletSdk.setViewSetterProvider(provider)
158
55
  }
159
- }
160
-
161
- @ReactMethod
162
- override fun getDeviceId(): String {
163
- return WalletSdk.getDeviceId(reactContext) ?: ""
164
- }
165
- @ReactMethod
166
- override fun execute(
167
- userToken: String?,
168
- secretKey: String?,
169
- challengeIdArr: ReadableArray,
170
- promise: Promise?
171
- ) {
172
- val challengeIds = arrayOfNulls<String>(challengeIdArr.size())
173
- for (i in challengeIds.indices) {
174
- challengeIds[i] = challengeIdArr.getString(i)
56
+
57
+ override fun definition() = ModuleDefinition {
58
+ Name("ProgrammablewalletRnSdk")
59
+
60
+ Constants(
61
+ "sdkVersion" to WalletSdk.sdkVersion(),
62
+ )
63
+
64
+ Events(
65
+ "CirclePwOnEvent",
66
+ "CirclePwOnSuccess",
67
+ "CirclePwOnError"
68
+ )
69
+
70
+ Function("getDeviceId") {
71
+ val context = appContext.reactContext ?: return@Function ""
72
+ WalletSdk.getDeviceId(context) ?: ""
73
+ }
74
+
75
+ AsyncFunction("initSdk") { configuration: ConfigurationRecord, promise: Promise ->
76
+ try {
77
+ val context = appContext.reactContext
78
+ if (context == null) {
79
+ promise.reject(Exceptions.ReactContextLost())
80
+ return@AsyncFunction
81
+ }
82
+ val (endpoint, appId, settings) = RecordsHelper.prepareConfigurationData(
83
+ configuration
84
+ )
85
+ WalletSdk.addEventListener(this@ProgrammablewalletRnSdkModule)
86
+ init(
87
+ context,
88
+ WalletSdk.Configuration(endpoint, appId, settings)
89
+ )
90
+ promise.resolve(emptyMap<String, Any>())
91
+ } catch (e: Throwable) {
92
+ promise.reject(CodedException(e))
93
+ }
94
+ }
95
+
96
+ Function("setSecurityQuestions") { securityQuestions: Array<Any> ->
97
+ val nativeSecurityQuestions =
98
+ RecordsHelper.convertJsSecurityQuestionsToNative(securityQuestions)
99
+ WalletSdk.setSecurityQuestions(nativeSecurityQuestions)
100
+ }
101
+
102
+ AsyncFunction("execute") { userToken: String?, encryptionKey: String?, challengeIds: Array<String>, promise: Promise ->
103
+ try {
104
+ val activity = appContext.currentActivity
105
+ if (activity == null) {
106
+ promise.reject(Exceptions.AppContextLost())
107
+ return@AsyncFunction
108
+ }
109
+ val challengeIdArray = challengeIds.map { it as String? }.toTypedArray()
110
+ val callback =
111
+ PromiseCallback<ExecuteResult>(promise, this@ProgrammablewalletRnSdkModule)
112
+ WalletSdk.execute(
113
+ activity,
114
+ userToken,
115
+ encryptionKey,
116
+ challengeIdArray,
117
+ callback
118
+ )
119
+ } catch (e: Throwable) {
120
+ promise.reject(CodedException(e))
121
+ }
122
+ }
123
+
124
+ AsyncFunction("verifyOTP") { otpToken: String?, deviceToken: String?, deviceEncryptionKey: String?, promise: Promise ->
125
+ try {
126
+ val activity = appContext.currentActivity
127
+ if (activity == null) {
128
+ promise.reject(Exceptions.AppContextLost())
129
+ return@AsyncFunction
130
+ }
131
+
132
+ // Create callback for LoginResult with correct Callback2 interface
133
+ val callback = object : circle.programmablewallet.sdk.api.Callback2<circle.programmablewallet.sdk.result.LoginResult> {
134
+ override fun onResult(result: circle.programmablewallet.sdk.result.LoginResult) {
135
+ try {
136
+ val resultMap = RecordsHelper.convertResultToMap(result)
137
+ promise.resolve(resultMap)
138
+ } catch (e: Exception) {
139
+ promise.reject(CodedException(e))
140
+ }
141
+ }
142
+
143
+ override fun onError(error: Throwable): Boolean {
144
+ promise.reject(CodedException(error))
145
+ return false // Let SDK finish the Activity
146
+ }
147
+ }
148
+
149
+ // Use the correct verifyOTP method from Circle SDK
150
+ WalletSdk.verifyOTP(
151
+ activity,
152
+ otpToken ?: "",
153
+ deviceToken ?: "",
154
+ deviceEncryptionKey ?: "",
155
+ callback
156
+ )
157
+ } catch (e: Throwable) {
158
+ promise.reject(CodedException(e))
159
+ }
160
+ }
161
+
162
+ AsyncFunction("performLogin") { provider: String, deviceToken: String, deviceEncryptionKey: String, promise: Promise ->
163
+ try {
164
+ val activity = appContext.currentActivity
165
+ if (activity == null) {
166
+ promise.reject(Exceptions.AppContextLost())
167
+ return@AsyncFunction
168
+ }
169
+
170
+ // Convert string to SocialProvider enum
171
+ val socialProvider = when (provider) {
172
+ "Google" -> SocialProvider.Google
173
+ "Facebook" -> SocialProvider.Facebook
174
+ "Apple" -> SocialProvider.Apple
175
+ else -> throw IllegalArgumentException("Unsupported social provider: $provider")
176
+ }
177
+
178
+ // Create social callback that wraps promise
179
+ val socialCallback = object : SocialCallback<LoginResult> {
180
+ override fun onError(error: Throwable) {
181
+ promise.reject(CodedException(error))
182
+ }
183
+
184
+ override fun onResult(result: LoginResult) {
185
+ // Direct conversion without wrapping in "result" field
186
+ val resultMap = RecordsHelper.convertResultToMap(result)
187
+ promise.resolve(resultMap)
188
+ }
189
+ }
190
+
191
+ WalletSdk.performLogin(
192
+ activity,
193
+ socialProvider,
194
+ deviceToken,
195
+ deviceEncryptionKey,
196
+ socialCallback
197
+ )
198
+ } catch (e: Throwable) {
199
+ promise.reject(CodedException(e))
200
+ }
201
+ }
202
+
203
+ AsyncFunction("performLogout") { provider: String, promise: Promise ->
204
+ try {
205
+ val activity = appContext.currentActivity
206
+ if (activity == null) {
207
+ promise.reject(Exceptions.AppContextLost())
208
+ return@AsyncFunction
209
+ }
210
+
211
+ // Convert string to SocialProvider enum
212
+ val socialProvider = when (provider) {
213
+ "Google" -> SocialProvider.Google
214
+ "Facebook" -> SocialProvider.Facebook
215
+ "Apple" -> SocialProvider.Apple
216
+ else -> throw IllegalArgumentException("Unsupported social provider: $provider")
217
+ }
218
+
219
+ // Create logout callback that wraps promise
220
+ val logoutCallback = object : LogoutCallback {
221
+ override fun onError(error: Throwable) {
222
+ promise.reject(CodedException(error))
223
+ }
224
+
225
+ override fun onComplete() {
226
+ promise.resolve(null)
227
+ }
228
+ }
229
+
230
+ WalletSdk.performLogout(
231
+ activity,
232
+ socialProvider,
233
+ logoutCallback
234
+ )
235
+ } catch (e: Throwable) {
236
+ promise.reject(CodedException(e))
237
+ }
238
+ }
239
+
240
+ AsyncFunction("setBiometricsPin") { userToken: String?, encryptionKey: String?, promise: Promise ->
241
+ try {
242
+ val activity = appContext.currentActivity
243
+ if (activity == null) {
244
+ promise.reject(Exceptions.AppContextLost())
245
+ return@AsyncFunction
246
+ }
247
+ val callback = PromiseCallback<ExecuteResult>(promise, this@ProgrammablewalletRnSdkModule)
248
+ WalletSdk.setBiometricsPin(
249
+ activity,
250
+ userToken,
251
+ encryptionKey,
252
+ callback
253
+ )
254
+ } catch (e: Throwable) {
255
+ promise.reject(CodedException(e))
256
+ }
257
+ }
258
+
259
+ Function("setDismissOnCallbackMap") { mapData: Map<String, Any> ->
260
+ val dismissMap = RecordsHelper.convertToDismissOnCallbackMap(mapData)
261
+ setDismissOnCallbackMap(dismissMap)
262
+ }
263
+
264
+ Function("moveTaskToFront") {
265
+ try {
266
+ val activity = appContext.currentActivity
267
+ if (activity != null) {
268
+ Companion.moveTaskToFront(activity)
269
+ }
270
+ } catch (e: Throwable) {
271
+ Log.e("ProgrammableWallet", "moveTaskToFront failed", e)
272
+ throw CodedException(e)
273
+ }
274
+ }
275
+
276
+ Function("moveRnTaskToFront") {
277
+ try {
278
+ val activity = appContext.currentActivity
279
+ if (activity != null) {
280
+ Companion.moveRnTaskToFront(activity)
281
+ }
282
+ } catch (e: Throwable) {
283
+ Log.e("ProgrammableWallet", "moveRnTaskToFront failed", e)
284
+ throw CodedException(e)
285
+ }
286
+ }
287
+
288
+ Function("setTextConfigsMap") { mapData: Map<String, Any> ->
289
+ val context = appContext.reactContext
290
+ if (context != null) {
291
+ val textConfigsMap = RecordsHelper.convertToTextConfigsMap(context, mapData)
292
+ setTextConfigsMap(textConfigsMap)
293
+ layoutProvider.setTextConfigsMap(textConfigsMap)
294
+ }
295
+ }
296
+
297
+ Function("setIconTextConfigsMap") { mapData: Map<String, Any> ->
298
+ try {
299
+ val context = appContext.reactContext ?: throw Exceptions.ReactContextLost()
300
+ val iconTextConfigsMap = RecordsHelper.convertToIconTextConfigsMap(context, mapData)
301
+ layoutProvider.setIconTextConfigsMap(iconTextConfigsMap)
302
+ } catch (e: Throwable) {
303
+ throw CodedException(e)
304
+ }
305
+ }
306
+
307
+ Function("setTextConfigMap") { mapData: Map<String, Any> ->
308
+ try {
309
+ val context = appContext.reactContext
310
+ if (context == null) {
311
+ throw Exceptions.ReactContextLost()
312
+ }
313
+ val textConfigMap = RecordsHelper.convertToTextConfigMap(context, mapData)
314
+ layoutProvider.setTextConfigMap(textConfigMap)
315
+ } catch (e: Throwable) {
316
+ throw CodedException(e)
317
+ }
318
+ }
319
+
320
+ Function("setImageMap") { mapData: Map<String, Any> ->
321
+ try {
322
+ val context = appContext.reactContext ?: throw Exceptions.ReactContextLost()
323
+ val imageMap = RecordsHelper.convertToImageMap(context, mapData)
324
+ setImageMap(imageMap)
325
+ viewSetterProvider.setImageMap(imageMap, context)
326
+ } catch (e: Throwable) {
327
+ Log.e("ProgrammableWallet", "setImageMap failed", e)
328
+ throw CodedException(e)
329
+ }
330
+ }
331
+
332
+ Function("setDateFormat") { format: String ->
333
+ try {
334
+ layoutProvider.setDateFormat(format)
335
+ } catch (e: Throwable) {
336
+ throw CodedException(e)
337
+ }
338
+ }
339
+
340
+ Function("setDebugging") { isDebugging: Boolean ->
341
+ try {
342
+ Companion.debugging = isDebugging
343
+ layoutProvider.setDebugging(isDebugging)
344
+ } catch (e: Throwable) {
345
+ Log.e("ProgrammableWallet", "setDebugging failed", e)
346
+ throw CodedException(e)
347
+ }
348
+ }
349
+
350
+ Function("setCustomUserAgent") { userAgent: String ->
351
+ try {
352
+ WalletSdk.setCustomUserAgent(userAgent)
353
+ } catch (e: Throwable) {
354
+ Log.e("ProgrammableWallet", "setCustomUserAgent failed", e)
355
+ throw CodedException(e)
356
+ }
357
+ }
358
+
359
+ Function("setErrorStringMap") { mapData: Map<String, Any> ->
360
+ try {
361
+ val validatedMapData = RecordsHelper.filterValidErrorCodeKeys(mapData)
362
+ val errorStringMap = RecordsHelper.convertToErrorStringMap(validatedMapData)
363
+ layoutProvider.setErrorStringMap(errorStringMap)
364
+ } catch (e: Throwable) {
365
+ throw CodedException(e)
366
+ }
367
+ }
368
+
369
+ AsyncFunction("setValueAsync") { value: String ->
370
+ // Send an event to JavaScript.
371
+ sendEvent(
372
+ "onChange", mapOf(
373
+ "value" to value
374
+ )
375
+ )
376
+ }
175
377
  }
176
- execute(
177
- currentActivity,
178
- userToken,
179
- secretKey,
180
- challengeIds,
181
- PromiseCallback(promise, reactContext)
182
- )
183
- }
184
- @ExcludeFromGeneratedCCReport
185
- @ReactMethod
186
- override fun setBiometricsPin(
187
- userToken: String?,
188
- secretKey: String?,
189
- promise: Promise?
190
- ) {
191
- WalletSdk.setBiometricsPin(
192
- currentActivity,
193
- userToken,
194
- secretKey,
195
- PromiseCallback(promise, reactContext)
196
- )
197
- }
198
-
199
- @ReactMethod
200
- override fun performLogin(
201
- provider: String,
202
- deviceToken: String,
203
- deviceEncryptionKey: String,
204
- promise: Promise
205
- ) {
206
- WalletSdk.performLogin(
207
- currentActivity,
208
- SocialProvider.valueOf(provider),
209
- deviceToken,
210
- deviceEncryptionKey,
211
- PromiseSocialCallback(promise)
212
- )
213
- }
214
-
215
- @ReactMethod
216
- override fun verifyOTP(
217
- otpToken: String,
218
- deviceToken: String,
219
- deviceEncryptionKey: String,
220
- promise: Promise
221
- ) {
222
- WalletSdk.verifyOTP(
223
- currentActivity,
224
- otpToken,
225
- deviceToken,
226
- deviceEncryptionKey,
227
- PromiseCallback2(promise, reactContext)
228
- )
229
- }
230
-
231
- @ReactMethod
232
- override fun performLogout(
233
- provider: String,
234
- promise: Promise
235
- ) {
236
-
237
- WalletSdk.performLogout(
238
- currentActivity,
239
- SocialProvider.valueOf(provider),
240
- PromiseLogoutCallback(promise)
241
- )
242
- }
243
- companion object {
244
- const val NAME = "ProgrammablewalletRnSdk"
245
- const val EVENT_NAME_ON_EVENT = "CirclePwOnEvent"
246
- const val EVENT_NAME_ON_SUCCESS = "CirclePwOnSuccess"
247
- const val EVENT_NAME_ON_ERROR = "CirclePwOnError"
248
- val dismissOnCallbackMap: MutableMap<Int, Boolean> = HashMap()
249
- fun setDismissOnCallbackMap(map: Map<Int, Boolean>) {
250
- dismissOnCallbackMap.clear()
251
- dismissOnCallbackMap.putAll(map)
378
+
379
+ override fun onEvent(event: ExecuteEvent) {
380
+ sendEvent(
381
+ "CirclePwOnEvent", mapOf(
382
+ "name" to event.name
383
+ )
384
+ )
252
385
  }
253
- }
254
386
 
255
- @ExcludeFromGeneratedCCReport
256
- override fun onEvent(event: ExecuteEvent) {
257
- reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
258
- .emit(EVENT_NAME_ON_EVENT, event.name)
259
- }
387
+ companion object {
388
+ const val EVENT_NAME_ON_ERROR = "CirclePwOnError"
389
+ const val EVENT_NAME_ON_SUCCESS = "CirclePwOnSuccess"
390
+
391
+ val dismissOnCallbackMap: MutableMap<Int, Boolean> = HashMap()
392
+ val textConfigsMap: MutableMap<String, Array<circle.programmablewallet.sdk.presentation.TextConfig?>> = HashMap()
393
+ var debugging: Boolean = false
394
+ val imageMap: MutableMap<String, String> = HashMap()
395
+
396
+ fun setDismissOnCallbackMap(map: Map<Int, Boolean>) {
397
+ dismissOnCallbackMap.clear()
398
+ dismissOnCallbackMap.putAll(map)
399
+ }
400
+
401
+ fun setTextConfigsMap(map: Map<String, Array<circle.programmablewallet.sdk.presentation.TextConfig?>>) {
402
+ textConfigsMap.clear()
403
+ textConfigsMap.putAll(map)
404
+ }
405
+
406
+ fun setImageMap(map: Map<String, String>) {
407
+ imageMap.clear()
408
+ imageMap.putAll(map)
409
+ }
410
+
411
+ fun moveTaskToFront(activity: android.app.Activity) {
412
+ // Call the original WalletSdk.moveTaskToFront method
413
+ try {
414
+ circle.programmablewallet.sdk.WalletSdk.moveTaskToFront(activity)
415
+ } catch (e: Throwable) {
416
+ Log.e("ProgrammableWallet", "WalletSdk.moveTaskToFront failed", e)
417
+ }
418
+ }
419
+
420
+ fun moveRnTaskToFront(activity: android.app.Activity) {
421
+ // Use React Native Activity's taskId to bring it to front
422
+ try {
423
+ val am = activity.getSystemService(android.content.Context.ACTIVITY_SERVICE) as android.app.ActivityManager
424
+ am.moveTaskToFront(activity.taskId, android.app.ActivityManager.MOVE_TASK_NO_USER_ACTION)
425
+ } catch (e: Throwable) {
426
+ Log.e("ProgrammableWallet", "moveRnTaskToFront failed", e)
427
+ }
428
+ }
429
+ }
260
430
  }