@finos_sdk/sdk-ekyc 1.2.2 → 1.2.9

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 (85) hide show
  1. package/LICENSE +13 -10
  2. package/README.md +41 -42
  3. package/android/build.gradle +42 -11
  4. package/android/gradle.properties +7 -1
  5. package/android/settings.gradle +53 -0
  6. package/android/src/main/java/finos/sdk/ekyc/EKYCModule.kt +791 -81
  7. package/dist/EKYCModule.d.ts +73 -0
  8. package/dist/EKYCModule.js +663 -71
  9. package/dist/index.d.ts +6 -1
  10. package/dist/index.js +5 -1
  11. package/dist/package.json +31 -21
  12. package/dist/src/modules/FinosEKYCModule.d.ts +149 -0
  13. package/dist/src/modules/FinosEKYCModule.js +485 -2
  14. package/dist/src/modules/FinosESignModule.d.ts +270 -0
  15. package/dist/src/modules/FinosESignModule.js +752 -0
  16. package/dist/src/types/ekycESignType.d.ts +67 -0
  17. package/dist/src/types/ekycESignType.js +2 -0
  18. package/dist/src/types/ekycSmsOtpType.d.ts +52 -0
  19. package/dist/src/types/ekycSmsOtpType.js +2 -0
  20. package/package.json +31 -21
  21. package/src/modules/FinosEKYCModule.ts +572 -2
  22. package/src/modules/FinosESignModule.ts +919 -0
  23. package/src/modules/README.md +3 -3
  24. package/src/types/ekycESignType.ts +76 -0
  25. package/src/types/ekycSmsOtpType.ts +59 -0
  26. package/android/SDKeKYC/finos/sdk/ekyc/c06/1.2.2/c06-1.2.2-sources.jar +0 -0
  27. package/android/SDKeKYC/finos/sdk/ekyc/c06/1.2.2/c06-1.2.2.aar +0 -0
  28. package/android/SDKeKYC/finos/sdk/ekyc/c06/1.2.2/c06-1.2.2.module +0 -110
  29. package/android/SDKeKYC/finos/sdk/ekyc/c06/1.2.2/c06-1.2.2.pom +0 -37
  30. package/android/SDKeKYC/finos/sdk/ekyc/c06/maven-metadata-local.xml +0 -13
  31. package/android/SDKeKYC/finos/sdk/ekyc/ekyc/1.2.2/ekyc-1.2.2-sources.jar +0 -0
  32. package/android/SDKeKYC/finos/sdk/ekyc/ekyc/1.2.2/ekyc-1.2.2.aar +0 -0
  33. package/android/SDKeKYC/finos/sdk/ekyc/ekyc/1.2.2/ekyc-1.2.2.module +0 -201
  34. package/android/SDKeKYC/finos/sdk/ekyc/ekyc/1.2.2/ekyc-1.2.2.pom +0 -73
  35. package/android/SDKeKYC/finos/sdk/ekyc/ekyc/maven-metadata-local.xml +0 -13
  36. package/android/SDKeKYC/finos/sdk/ekyc/ekycui/1.2.2/ekycui-1.2.2-sources.jar +0 -0
  37. package/android/SDKeKYC/finos/sdk/ekyc/ekycui/1.2.2/ekycui-1.2.2.aar +0 -0
  38. package/android/SDKeKYC/finos/sdk/ekyc/ekycui/1.2.2/ekycui-1.2.2.module +0 -131
  39. package/android/SDKeKYC/finos/sdk/ekyc/ekycui/1.2.2/ekycui-1.2.2.pom +0 -43
  40. package/android/SDKeKYC/finos/sdk/ekyc/ekycui/maven-metadata-local.xml +0 -13
  41. package/android/SDKeKYC/finos/sdk/ekyc/faceservice/1.2.2/faceservice-1.2.2-sources.jar +0 -0
  42. package/android/SDKeKYC/finos/sdk/ekyc/faceservice/1.2.2/faceservice-1.2.2.aar +0 -0
  43. package/android/SDKeKYC/finos/sdk/ekyc/faceservice/1.2.2/faceservice-1.2.2.module +0 -110
  44. package/android/SDKeKYC/finos/sdk/ekyc/faceservice/1.2.2/faceservice-1.2.2.pom +0 -37
  45. package/android/SDKeKYC/finos/sdk/ekyc/faceservice/maven-metadata-local.xml +0 -13
  46. package/android/SDKeKYC/finos/sdk/ekyc/liveness/1.2.2/liveness-1.2.2-sources.jar +0 -0
  47. package/android/SDKeKYC/finos/sdk/ekyc/liveness/1.2.2/liveness-1.2.2.aar +0 -0
  48. package/android/SDKeKYC/finos/sdk/ekyc/liveness/1.2.2/liveness-1.2.2.module +0 -138
  49. package/android/SDKeKYC/finos/sdk/ekyc/liveness/1.2.2/liveness-1.2.2.pom +0 -55
  50. package/android/SDKeKYC/finos/sdk/ekyc/liveness/maven-metadata-local.xml +0 -13
  51. package/android/SDKeKYC/finos/sdk/ekyc/nfc/1.2.2/nfc-1.2.2-sources.jar +0 -0
  52. package/android/SDKeKYC/finos/sdk/ekyc/nfc/1.2.2/nfc-1.2.2.aar +0 -0
  53. package/android/SDKeKYC/finos/sdk/ekyc/nfc/1.2.2/nfc-1.2.2.module +0 -131
  54. package/android/SDKeKYC/finos/sdk/ekyc/nfc/1.2.2/nfc-1.2.2.pom +0 -55
  55. package/android/SDKeKYC/finos/sdk/ekyc/nfc/maven-metadata-local.xml +0 -13
  56. package/android/SDKeKYC/finos/sdk/ekyc/ocr/1.2.2/ocr-1.2.2-sources.jar +0 -0
  57. package/android/SDKeKYC/finos/sdk/ekyc/ocr/1.2.2/ocr-1.2.2.aar +0 -0
  58. package/android/SDKeKYC/finos/sdk/ekyc/ocr/1.2.2/ocr-1.2.2.module +0 -124
  59. package/android/SDKeKYC/finos/sdk/ekyc/ocr/1.2.2/ocr-1.2.2.pom +0 -43
  60. package/android/SDKeKYC/finos/sdk/ekyc/ocr/maven-metadata-local.xml +0 -13
  61. package/android/SDKeKYC/finos/sdk/ekyc/qrcode/1.2.2/qrcode-1.2.2-sources.jar +0 -0
  62. package/android/SDKeKYC/finos/sdk/ekyc/qrcode/1.2.2/qrcode-1.2.2.aar +0 -0
  63. package/android/SDKeKYC/finos/sdk/ekyc/qrcode/1.2.2/qrcode-1.2.2.module +0 -138
  64. package/android/SDKeKYC/finos/sdk/ekyc/qrcode/1.2.2/qrcode-1.2.2.pom +0 -55
  65. package/android/SDKeKYC/finos/sdk/ekyc/qrcode/maven-metadata-local.xml +0 -13
  66. package/android/SDKeKYC/finos/sdk/ekyc/sdkcore/1.2.2/sdkcore-1.2.2-sources.jar +0 -0
  67. package/android/SDKeKYC/finos/sdk/ekyc/sdkcore/1.2.2/sdkcore-1.2.2.aar +0 -0
  68. package/android/SDKeKYC/finos/sdk/ekyc/sdkcore/1.2.2/sdkcore-1.2.2.module +0 -341
  69. package/android/SDKeKYC/finos/sdk/ekyc/sdkcore/1.2.2/sdkcore-1.2.2.pom +0 -139
  70. package/android/SDKeKYC/finos/sdk/ekyc/sdkcore/maven-metadata-local.xml +0 -13
  71. package/android/SDKeKYC/finos/sdk/ekyc/sdkcorecamera/1.2.2/sdkcorecamera-1.2.2-sources.jar +0 -0
  72. package/android/SDKeKYC/finos/sdk/ekyc/sdkcorecamera/1.2.2/sdkcorecamera-1.2.2.aar +0 -0
  73. package/android/SDKeKYC/finos/sdk/ekyc/sdkcorecamera/1.2.2/sdkcorecamera-1.2.2.module +0 -201
  74. package/android/SDKeKYC/finos/sdk/ekyc/sdkcorecamera/1.2.2/sdkcorecamera-1.2.2.pom +0 -85
  75. package/android/SDKeKYC/finos/sdk/ekyc/sdkcorecamera/maven-metadata-local.xml +0 -13
  76. package/android/SDKeKYC/finos/sdk/ekyc/sdkui/1.2.2/sdkui-1.2.2-sources.jar +0 -0
  77. package/android/SDKeKYC/finos/sdk/ekyc/sdkui/1.2.2/sdkui-1.2.2.aar +0 -0
  78. package/android/SDKeKYC/finos/sdk/ekyc/sdkui/1.2.2/sdkui-1.2.2.module +0 -208
  79. package/android/SDKeKYC/finos/sdk/ekyc/sdkui/1.2.2/sdkui-1.2.2.pom +0 -103
  80. package/android/SDKeKYC/finos/sdk/ekyc/sdkui/maven-metadata-local.xml +0 -13
  81. package/android/src/main/AndroidManifest.xml +0 -22
  82. package/android/src/main/build.gradle +0 -31
  83. package/dist/App.d.ts +0 -3
  84. package/dist/App.js +0 -497
  85. package/dist/finos_sdk-sdk-ekyc-1.2.2.tgz +0 -0
@@ -8,6 +8,7 @@ import com.facebook.react.bridge.Promise
8
8
  import com.facebook.react.bridge.ReactApplicationContext
9
9
  import com.facebook.react.bridge.ReactContextBaseJavaModule
10
10
  import com.facebook.react.bridge.ReactMethod
11
+ import com.facebook.react.bridge.WritableArray
11
12
  import com.facebook.react.bridge.WritableMap
12
13
  import com.facebook.react.module.annotations.ReactModule
13
14
  import com.facebook.react.modules.core.DeviceEventManagerModule
@@ -31,6 +32,11 @@ import finos.sdk.faceservice.SdkEkycFaceService
31
32
  import finos.sdk.liveness.SdkEkycLiveness
32
33
  import finos.sdk.nfc.SdkEkycNfc
33
34
  import finos.sdk.ocr.SdkEkycOcr
35
+ import finos.sdk.smsotp.SdkSmsOtpService
36
+ import finos.sdk.core.model.sdk.config.SmsOtpConfig
37
+ import vn.softdreams.easyca.sdk.SdkeSign
38
+ import vn.softdreams.easyca.sdk.utils.UserEsignModel
39
+ import org.json.JSONObject
34
40
  import java.io.File
35
41
  import java.io.FileOutputStream
36
42
  import java.util.Date
@@ -51,24 +57,67 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
51
57
  .emit(eventName, params)
52
58
  }
53
59
 
60
+ /**
61
+ * Helper function to create separate maps for event and promise to avoid "Map already consumed" error
62
+ * @param builder Lambda function to build the map content
63
+ * @return Pair of (eventMap, promiseMap)
64
+ */
65
+ private fun createSeparateMaps(builder: (WritableMap) -> Unit): Pair<WritableMap, WritableMap> {
66
+ val eventMap = Arguments.createMap().apply(builder)
67
+ val promiseMap = Arguments.createMap().apply(builder)
68
+ return Pair(eventMap, promiseMap)
69
+ }
70
+
71
+ /**
72
+ * Helper function to create separate maps with array for event and promise
73
+ * @param arrayBuilder Lambda function to build the array content
74
+ * @param mapBuilder Lambda function to build the map with array
75
+ * @return Pair of (eventMap, promiseMap)
76
+ */
77
+ private fun createSeparateMapsWithArray(
78
+ arrayBuilder: (WritableArray) -> Unit,
79
+ mapBuilder: (WritableMap, WritableArray) -> Unit
80
+ ): Pair<WritableMap, WritableMap> {
81
+ val eventArray = Arguments.createArray().apply(arrayBuilder)
82
+ val promiseArray = Arguments.createArray().apply(arrayBuilder)
83
+ val eventMap = Arguments.createMap().apply { mapBuilder(this, eventArray) }
84
+ val promiseMap = Arguments.createMap().apply { mapBuilder(this, promiseArray) }
85
+ return Pair(eventMap, promiseMap)
86
+ }
87
+
54
88
  @ReactMethod
55
89
  fun initSdkEkyc(promise: Promise) {
90
+ Log.d(TAG, "▶️ initSdkEkyc() called")
56
91
  try {
57
92
  SdkEkyc.initSDKEkyc(reactApplicationContext) {
93
+ Log.d(TAG, "✅ initSdkEkyc() success")
58
94
  val params =
59
95
  Arguments.createMap().apply {
60
96
  putString("status", "success")
61
97
  putString("message", "SDK EKYC initialized successfully")
62
98
  }
63
99
  sendEvent("EKYCInitEvent", params)
64
- //promise.resolve("SDK EKYC initialized successfully")
65
100
  promise.resolve(true)
66
101
  }
67
102
  } catch (e: Exception) {
103
+ Log.e(TAG, "❌ initSdkEkyc() failed: ${e.message}", e)
68
104
  promise.reject("INIT_ERROR", "Failed to initialize SDK EKYC: ${e.message}")
69
105
  }
70
106
  }
71
107
 
108
+ @ReactMethod
109
+ fun setTransactionId(transactionId: String, promise: Promise) {
110
+ Log.d(TAG, "▶️ setTransactionId() called with: $transactionId")
111
+ try {
112
+ SdkEkyc.setTransactionId(transactionId)
113
+ Log.d(TAG, "✅ setTransactionId() success")
114
+ promise.resolve(true)
115
+ } catch (e: Exception) {
116
+ Log.e(TAG, "❌ setTransactionId() failed: ${e.message}", e)
117
+ promise.reject("SET_TRANSACTION_ID_ERROR", "Failed to set transaction ID: ${e.message}")
118
+ }
119
+ }
120
+
72
121
  @ReactMethod
73
122
  fun startNfcScan(
74
123
  appKey: String,
@@ -79,14 +128,14 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
79
128
  facePathStorage: String?,
80
129
  promise: Promise
81
130
  ) {
131
+ Log.d(TAG, "▶️ startNfcScan() called")
82
132
  try {
83
- Log.d(TAG, "startNfcScan:::0000")
84
133
  val currentActivity = reactApplicationContext.currentActivity
85
134
  if (currentActivity == null) {
135
+ Log.e(TAG, "❌ startNfcScan() failed: Activity not available")
86
136
  promise.reject("NO_ACTIVITY", "Activity not available")
87
137
  return
88
138
  }
89
- Log.d(TAG, "startNfcScan:::1111")
90
139
  val nfcConfig = NfcConfig(
91
140
  documentNumber = documentNumber,
92
141
  birthDate = birthDate,
@@ -115,6 +164,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
115
164
  }
116
165
 
117
166
  EKYCEvent.SCAN_NFC_SUCCESS -> {
167
+ Log.d(TAG, "✅ startNfcScan() success")
118
168
  val eventMap =
119
169
  Arguments.createMap().apply {
120
170
  putString("event", event.name.toString())
@@ -140,7 +190,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
140
190
  }
141
191
  },
142
192
  callbackError = { event, message ->
143
- Log.e(TAG, "NFC Error - Event: $event, Message: $message")
193
+ Log.e(TAG, " startNfcScan() failed - Event: $event, Message: $message")
144
194
 
145
195
  val errorMap =
146
196
  Arguments.createMap().apply {
@@ -152,9 +202,8 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
152
202
  promise.reject(event.name.toString(), message?.toString() ?: "Unknown NFC error")
153
203
  }
154
204
  )
155
- Log.d(TAG, "startNfcScan:::222222")
156
205
  } catch (e: Exception) {
157
- Log.e(TAG, "Exception in startNfcScan: ${e.message}", e)
206
+ Log.e(TAG, " startNfcScan() exception: ${e.message}", e)
158
207
  promise.reject("NFC_EXCEPTION", e.message, e)
159
208
  }
160
209
  }
@@ -168,6 +217,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
168
217
  transactionId: String?,
169
218
  promise: Promise
170
219
  ) {
220
+ Log.d(TAG, "▶️ checkC06() called")
171
221
  try {
172
222
  val c06Config =
173
223
  C06Config(
@@ -182,7 +232,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
182
232
  SdkEkycC06.startEkyc(
183
233
  ekycConfigSDK = ekycConfig,
184
234
  callbackSuccess = { event, data ->
185
- Log.d(TAG, "C06 Success - Event: $event, Data: $data")
235
+ Log.d(TAG, " checkC06() success")
186
236
 
187
237
  // Create separate maps for event and promise
188
238
  val eventMap =
@@ -200,7 +250,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
200
250
  promise.resolve(promiseMap)
201
251
  },
202
252
  callbackError = { event, message ->
203
- Log.e(TAG, "C06 Error - Event: $event, Message: $message")
253
+ Log.e(TAG, " checkC06() failed - Event: $event, Message: $message")
204
254
 
205
255
  val errorMap =
206
256
  Arguments.createMap().apply {
@@ -213,7 +263,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
213
263
  }
214
264
  )
215
265
  } catch (e: Exception) {
216
- Log.e(TAG, "Exception in checkC06: ${e.message}", e)
266
+ Log.e(TAG, " checkC06() exception: ${e.message}", e)
217
267
  promise.reject("C06_EXCEPTION", e.message, e)
218
268
  }
219
269
  }
@@ -226,9 +276,11 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
226
276
  transactionId: String,
227
277
  promise: Promise
228
278
  ) {
279
+ Log.d(TAG, "▶️ startOcr() called")
229
280
  try {
230
281
  val currentActivity = reactApplicationContext.currentActivity
231
282
  if (currentActivity == null) {
283
+ Log.e(TAG, "❌ startOcr() failed: Activity not available")
232
284
  promise.reject("NO_ACTIVITY", "Activity not available")
233
285
  return
234
286
  }
@@ -249,28 +301,16 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
249
301
  SdkEkycOcr.startEkyc(
250
302
  ekycConfigSDK = ekycConfig,
251
303
  callbackSuccess = { event, data ->
252
- Log.d(TAG, "OCR Success - Event: $event, Data: $data")
253
- val resultMap =
254
- Arguments.createMap().apply {
255
- putString("event", event.name.toString())
256
- putString(
257
- "data",
258
- (data as SDKEkycResult).ocrResponse.toString()
259
- )
260
- }
261
- sendEvent("onOcrSuccess", resultMap)
262
- val promiseMap =
263
- Arguments.createMap().apply {
264
- putString("event", event.name.toString())
265
- putString(
266
- "data",
267
- (data as SDKEkycResult).ocrResponse.toString()
268
- )
269
- }
304
+ Log.d(TAG, " startOcr() success")
305
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
306
+ map.putString("event", event.name.toString())
307
+ map.putString("data", (data as SDKEkycResult).ocrResponse.toString())
308
+ }
309
+ sendEvent("onOcrSuccess", eventMap)
270
310
  promise.resolve(promiseMap)
271
311
  },
272
312
  callbackError = { event, message ->
273
- Log.e(TAG, "OCR Error - Event: $event, Message: $message")
313
+ Log.e(TAG, " startOcr() failed - Event: $event, Message: $message")
274
314
  val errorMap =
275
315
  Arguments.createMap().apply {
276
316
  putString("event", event.name.toString())
@@ -281,7 +321,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
281
321
  }
282
322
  )
283
323
  } catch (e: Exception) {
284
- Log.e(TAG, "Exception in startOcr: ${e.message}", e)
324
+ Log.e(TAG, " startOcr() exception: ${e.message}", e)
285
325
  promise.reject("OCR_ERROR", e.message)
286
326
  }
287
327
  }
@@ -296,9 +336,11 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
296
336
  switchFrontCamera: Boolean?,
297
337
  promise: Promise
298
338
  ) {
339
+ Log.d(TAG, "▶️ startLiveness() called")
299
340
  try {
300
341
  val currentActivity = reactApplicationContext.currentActivity
301
342
  if (currentActivity == null) {
343
+ Log.e(TAG, "❌ startLiveness() failed: Activity not available")
302
344
  promise.reject("NO_ACTIVITY", "Activity not available")
303
345
  return
304
346
  }
@@ -325,28 +367,16 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
325
367
  SdkEkycLiveness.startEkyc(
326
368
  ekycConfigSDK = ekycConfig,
327
369
  callbackSuccess = { event, data ->
328
- Log.d(TAG, "Liveness Success - Event: $event, Data: $data")
329
- val resultMap =
330
- Arguments.createMap().apply {
331
- putString("event", event.name.toString())
332
- putString(
333
- "data",
334
- (data as SDKEkycResult).checkLivenessResponse.toString()
335
- )
336
- }
337
- sendEvent("onLivenessSuccess", resultMap)
338
- val promiseMap =
339
- Arguments.createMap().apply {
340
- putString("event", event.name.toString())
341
- putString(
342
- "data",
343
- (data as SDKEkycResult).checkLivenessResponse.toString()
344
- )
345
- }
370
+ Log.d(TAG, " startLiveness() success")
371
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
372
+ map.putString("event", event.name.toString())
373
+ map.putString("data", (data as SDKEkycResult).checkLivenessResponse.toString())
374
+ }
375
+ sendEvent("onLivenessSuccess", eventMap)
346
376
  promise.resolve(promiseMap)
347
377
  },
348
378
  callbackError = { event, message ->
349
- Log.e(TAG, "Liveness Error - Event: $event, Message: $message")
379
+ Log.e(TAG, " startLiveness() failed - Event: $event, Message: $message")
350
380
  val errorMap =
351
381
  Arguments.createMap().apply {
352
382
  putString("event", event.name.toString())
@@ -357,7 +387,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
357
387
  }
358
388
  )
359
389
  } catch (e: Exception) {
360
- Log.e(TAG, "Exception in startLiveness: ${e.message}", e)
390
+ Log.e(TAG, " startLiveness() exception: ${e.message}", e)
361
391
  promise.reject("LIVENESS_ERROR", e.message)
362
392
  }
363
393
  }
@@ -370,9 +400,11 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
370
400
  idImage: String,
371
401
  promise: Promise
372
402
  ) {
403
+ Log.d(TAG, "▶️ startFaceCompare() called")
373
404
  try {
374
405
  val currentActivity = reactApplicationContext.currentActivity
375
406
  if (currentActivity == null) {
407
+ Log.e(TAG, "❌ startFaceCompare() failed: Activity not available")
376
408
  promise.reject("NO_ACTIVITY", "Activity not available")
377
409
  return
378
410
  }
@@ -393,22 +425,16 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
393
425
  SdkEkycFaceService.startEkyc(
394
426
  ekycConfigSDK = ekycConfig,
395
427
  callbackSuccess = { event, data ->
396
- Log.d(TAG, "Face Compare Success - Event: $event, Data: $data")
397
- val resultMap =
398
- Arguments.createMap().apply {
399
- putString("event", event.name.toString())
400
- putString("data", data.toString())
401
- }
402
- sendEvent("onFaceCompareSuccess", resultMap)
403
- val promiseMap =
404
- Arguments.createMap().apply {
405
- putString("event", event.name.toString())
406
- putString("data", data.toString())
407
- }
428
+ Log.d(TAG, " startFaceCompare() success")
429
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
430
+ map.putString("event", event.name.toString())
431
+ map.putString("data", data.toString())
432
+ }
433
+ sendEvent("onFaceCompareSuccess", eventMap)
408
434
  promise.resolve(promiseMap)
409
435
  },
410
436
  callbackError = { event, message ->
411
- Log.e(TAG, "FaceService Error - Event: $event, Message: $message")
437
+ Log.e(TAG, " startFaceCompare() failed - Event: $event, Message: $message")
412
438
  val errorMap =
413
439
  Arguments.createMap().apply {
414
440
  putString("event", event.name.toString())
@@ -419,7 +445,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
419
445
  }
420
446
  )
421
447
  } catch (e: Exception) {
422
- Log.e(TAG, "Exception in startFaceCompare: ${e.message}", e)
448
+ Log.e(TAG, " startFaceCompare() exception: ${e.message}", e)
423
449
  promise.reject("FACE_COMPARE_ERROR", e.message)
424
450
  }
425
451
  }
@@ -489,15 +515,15 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
489
515
  styleConfigJson: String, // JSON string for style config
490
516
  promise: Promise
491
517
  ) {
518
+ Log.d(TAG, "▶️ startEkycUI() called")
492
519
  try {
493
520
  val currentActivity = currentActivity
494
521
  if (currentActivity == null) {
522
+ Log.e(TAG, "❌ startEkycUI() failed: Activity not available")
495
523
  promise.reject("NO_ACTIVITY", "Activity not available")
496
524
  return
497
525
  }
498
526
 
499
- Log.d(TAG, "startEkycUI: appKey=$appKey, flowSDK=$flowSDK, language=$language, optionConfig=$optionConfigJson, appKeyConfig=$appKeyConfigJson, styleConfig=$styleConfigJson")
500
-
501
527
  // Parse flowSDK JSON string to List<SDKType>
502
528
  val flowList = parseFlowSDK(flowSDK)
503
529
 
@@ -535,29 +561,21 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
535
561
  flowSDK = finalFlow
536
562
  )
537
563
 
538
- // Use actual SdkEkycUI.startEkyc like MainActivity.kt
539
- Log.d(TAG, "Starting SdkEkycUI.startEkyc with config: $ekycConfigSDK")
540
-
541
564
  SdkEkycUI.startEkyc(
542
565
  activity = currentActivity,
543
566
  ekycConfigSDK = ekycConfigSDK,
544
567
  callbackSuccess = { event, data ->
545
- Log.d(TAG, "eKYC UI Success - Event: $event, Data: $data")
546
- val resultMap = Arguments.createMap().apply {
547
- putString("status", "success")
548
- putString("event", event.name.toString())
549
- putString("data", data.toString())
550
- }
551
- val eventMap = Arguments.createMap().apply {
552
- putString("status", "success")
553
- putString("event", event.name.toString())
554
- putString("data", data.toString())
568
+ Log.d(TAG, " startEkycUI() success")
569
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
570
+ map.putString("status", "success")
571
+ map.putString("event", event.name.toString())
572
+ map.putString("data", data.toString())
555
573
  }
556
574
  sendEvent("onEkycUISuccess", eventMap)
557
- promise.resolve(resultMap)
575
+ promise.resolve(promiseMap)
558
576
  },
559
577
  callbackError = { event, errorResult ->
560
- Log.e(TAG, "eKYC UI Error - Event: $event, ErrorResult: $errorResult")
578
+ Log.e(TAG, " startEkycUI() failed - Event: $event, Message: ${errorResult.message}")
561
579
  val errorMap = Arguments.createMap().apply {
562
580
  putString("status", "error")
563
581
  putString("event", event.name.toString())
@@ -576,7 +594,7 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
576
594
  )
577
595
 
578
596
  } catch (e: Exception) {
579
- Log.e(TAG, "Exception in startEkycUI: ${e.message}", e)
597
+ Log.e(TAG, " startEkycUI() exception: ${e.message}", e)
580
598
  promise.reject("EKYC_UI_EXCEPTION", e.message, e)
581
599
  }
582
600
  }
@@ -784,4 +802,696 @@ class EKYCModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaMo
784
802
  }
785
803
  }
786
804
 
805
+ // ==================== SMS OTP Methods ====================
806
+
807
+ @ReactMethod
808
+ fun sendOtp(
809
+ phoneNumber: String,
810
+ purpose: String?,
811
+ referenceId: String,
812
+ promise: Promise
813
+ ) {
814
+ Log.d(TAG, "▶️ sendOtp() called")
815
+ Log.d(TAG, " 📱 Phone: $phoneNumber")
816
+ Log.d(TAG, " 🎯 Purpose: ${purpose ?: "transaction"}")
817
+ Log.d(TAG, " 🔖 ReferenceId: $referenceId")
818
+ try {
819
+ val smsOtpConfig = SmsOtpConfig(
820
+ phoneNumber = phoneNumber,
821
+ purpose = purpose ?: "transaction",
822
+ referenceId = referenceId
823
+ )
824
+
825
+ SdkSmsOtpService.sendOtp(
826
+ smsOtpConfig = smsOtpConfig,
827
+ callbackSuccess = { event, result ->
828
+ Log.d(TAG, "✅ sendOtp() success")
829
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
830
+ map.putString("event", event.name.toString())
831
+ result?.let {
832
+ val dataMap = Arguments.createMap()
833
+ it.customData?.forEach { (key, value) ->
834
+ dataMap.putString(key, value.toString())
835
+ }
836
+ map.putMap("data", dataMap)
837
+ }
838
+ }
839
+ sendEvent("onSmsOtpSendSuccess", eventMap)
840
+ promise.resolve(promiseMap)
841
+ },
842
+ callbackError = { event, error ->
843
+ Log.e(TAG, "❌ sendOtp() failed - Event: $event, Message: ${error.message}")
844
+ Log.e(TAG, " 🔴 Error Code: ${error.code}")
845
+ Log.e(TAG, " 📱 Phone: $phoneNumber, Purpose: ${purpose ?: "transaction"}, RefId: $referenceId")
846
+ val errorMap = Arguments.createMap().apply {
847
+ putString("event", event.name.toString())
848
+ putString("message", error.message)
849
+ putString("code", error.code)
850
+ }
851
+ sendEvent("onSmsOtpError", errorMap)
852
+ promise.reject(event.name.toString(), error.message)
853
+ }
854
+ )
855
+ } catch (e: Exception) {
856
+ Log.e(TAG, "❌ sendOtp() exception: ${e.message}", e)
857
+ promise.reject("SMS_OTP_EXCEPTION", e.message, e)
858
+ }
859
+ }
860
+
861
+ @ReactMethod
862
+ fun verifyOtp(
863
+ phoneNumber: String,
864
+ purpose: String?,
865
+ referenceId: String,
866
+ requestId: String,
867
+ otpCode: String,
868
+ promise: Promise
869
+ ) {
870
+ Log.d(TAG, "▶️ verifyOtp() called")
871
+ try {
872
+ val smsOtpConfig = SmsOtpConfig(
873
+ phoneNumber = phoneNumber,
874
+ purpose = purpose ?: "transaction",
875
+ referenceId = referenceId,
876
+ requestId = requestId
877
+ )
878
+
879
+ SdkSmsOtpService.verifyOtp(
880
+ smsOtpConfig = smsOtpConfig,
881
+ otpCode = otpCode,
882
+ callbackSuccess = { event, result ->
883
+ Log.d(TAG, "✅ verifyOtp() success")
884
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
885
+ map.putString("event", event.name.toString())
886
+ result?.let {
887
+ val dataMap = Arguments.createMap()
888
+ it.customData?.forEach { (key, value) ->
889
+ dataMap.putString(key, value.toString())
890
+ }
891
+ map.putMap("data", dataMap)
892
+ }
893
+ }
894
+ sendEvent("onSmsOtpVerifySuccess", eventMap)
895
+ promise.resolve(promiseMap)
896
+ },
897
+ callbackError = { event, error ->
898
+ Log.e(TAG, "❌ verifyOtp() failed - Event: $event, Message: ${error.message}")
899
+ val errorMap = Arguments.createMap().apply {
900
+ putString("event", event.name.toString())
901
+ putString("message", error.message)
902
+ putString("code", error.code)
903
+ }
904
+ sendEvent("onSmsOtpError", errorMap)
905
+ promise.reject(event.name.toString(), error.message)
906
+ }
907
+ )
908
+ } catch (e: Exception) {
909
+ Log.e(TAG, "❌ verifyOtp() exception: ${e.message}", e)
910
+ promise.reject("SMS_OTP_EXCEPTION", e.message, e)
911
+ }
912
+ }
913
+
914
+ @ReactMethod
915
+ fun resendOtp(
916
+ phoneNumber: String,
917
+ purpose: String?,
918
+ referenceId: String,
919
+ requestId: String,
920
+ promise: Promise
921
+ ) {
922
+ Log.d(TAG, "▶️ resendOtp() called")
923
+ try {
924
+ val smsOtpConfig = SmsOtpConfig(
925
+ phoneNumber = phoneNumber,
926
+ purpose = purpose ?: "transaction",
927
+ referenceId = referenceId,
928
+ requestId = requestId
929
+ )
930
+
931
+ SdkSmsOtpService.resendOtp(
932
+ smsOtpConfig = smsOtpConfig,
933
+ callbackSuccess = { event, result ->
934
+ Log.d(TAG, "✅ resendOtp() success")
935
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
936
+ map.putString("event", event.name.toString())
937
+ result?.let {
938
+ val dataMap = Arguments.createMap()
939
+ it.customData?.forEach { (key, value) ->
940
+ dataMap.putString(key, value.toString())
941
+ }
942
+ map.putMap("data", dataMap)
943
+ }
944
+ }
945
+ sendEvent("onSmsOtpResendSuccess", eventMap)
946
+ promise.resolve(promiseMap)
947
+ },
948
+ callbackError = { event, error ->
949
+ Log.e(TAG, "❌ resendOtp() failed - Event: $event, Message: ${error.message}")
950
+ val errorMap = Arguments.createMap().apply {
951
+ putString("event", event.name.toString())
952
+ putString("message", error.message)
953
+ putString("code", error.code)
954
+ }
955
+ sendEvent("onSmsOtpError", errorMap)
956
+ promise.reject(event.name.toString(), error.message)
957
+ }
958
+ )
959
+ } catch (e: Exception) {
960
+ Log.e(TAG, "❌ resendOtp() exception: ${e.message}", e)
961
+ promise.reject("SMS_OTP_EXCEPTION", e.message, e)
962
+ }
963
+ }
964
+
965
+ // ==================== eSign Methods ====================
966
+
967
+ @ReactMethod
968
+ fun initializeESign(promise: Promise) {
969
+ Log.d(TAG, "▶️ initializeESign() called")
970
+ try {
971
+ val currentActivity = reactApplicationContext.currentActivity
972
+ if (currentActivity == null) {
973
+ Log.e(TAG, "❌ initializeESign() failed: Activity not available")
974
+ promise.reject("NO_ACTIVITY", "Activity not available")
975
+ return
976
+ }
977
+
978
+ SdkeSign.initializeESign(
979
+ context = currentActivity,
980
+ callbackSuccess = { code, message ->
981
+ Log.d(TAG, "✅ initializeESign() success")
982
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
983
+ map.putString("code", code.toString())
984
+ map.putString("message", message)
985
+ }
986
+ sendEvent("onESignInitSuccess", eventMap)
987
+ promise.resolve(promiseMap)
988
+ },
989
+ callbackError = { event, error ->
990
+ Log.e(TAG, "❌ initializeESign() failed - Event: $event, Message: ${error.message}")
991
+ val errorMap = Arguments.createMap().apply {
992
+ putString("event", event.name.toString())
993
+ putString("message", error.message)
994
+ putString("code", error.code)
995
+ }
996
+ sendEvent("onESignError", errorMap)
997
+ promise.reject(event.name.toString(), error.message)
998
+ }
999
+ )
1000
+ } catch (e: Exception) {
1001
+ Log.e(TAG, "❌ initializeESign() exception: ${e.message}", e)
1002
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1003
+ }
1004
+ }
1005
+
1006
+ @ReactMethod
1007
+ fun openSessionId(
1008
+ accessToken: String?,
1009
+ username: String?,
1010
+ rememberMe: Boolean?,
1011
+ userEsignModelJson: String?,
1012
+ privateKeyFilePath: String?,
1013
+ promise: Promise
1014
+ ) {
1015
+ Log.d(TAG, "▶️ openSessionId() called")
1016
+ try {
1017
+ val currentActivity = reactApplicationContext.currentActivity
1018
+ if (currentActivity == null) {
1019
+ Log.e(TAG, "❌ openSessionId() failed: Activity not available")
1020
+ promise.reject("NO_ACTIVITY", "Activity not available")
1021
+ return
1022
+ }
1023
+
1024
+ if (accessToken != null && accessToken.isNotEmpty()) {
1025
+ // Option 1: With existing JWT access token
1026
+ SdkeSign.openSessionId(
1027
+ context = currentActivity,
1028
+ accessToken = accessToken,
1029
+ username = username ?: "",
1030
+ rememberMe = rememberMe ?: false,
1031
+ callbackSuccess = { deviceState, code, message ->
1032
+ Log.d(TAG, "✅ openSessionId() success")
1033
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1034
+ map.putString("deviceState", deviceState)
1035
+ map.putString("code", code.toString())
1036
+ map.putString("message", message)
1037
+ }
1038
+ sendEvent("onESignOpenSessionSuccess", eventMap)
1039
+ promise.resolve(promiseMap)
1040
+ },
1041
+ callbackError = { event, error ->
1042
+ Log.e(TAG, "❌ openSessionId() failed - Event: $event, Message: ${error.message}")
1043
+ val errorMap = Arguments.createMap().apply {
1044
+ putString("event", event.name.toString())
1045
+ putString("message", error.message)
1046
+ putString("code", error.code)
1047
+ }
1048
+ sendEvent("onESignError", errorMap)
1049
+ promise.reject(event.name.toString(), error.message)
1050
+ }
1051
+ )
1052
+ } else if (userEsignModelJson != null && privateKeyFilePath != null) {
1053
+ // Option 2: Auto-create token from user info
1054
+ val json = JSONObject(userEsignModelJson)
1055
+ val userInfo = UserEsignModel(
1056
+ cccd = json.getString("cccd"),
1057
+ name = json.getString("name"),
1058
+ device = json.optString("device", "Android"),
1059
+ deviceId = json.optString("deviceId", android.provider.Settings.Secure.getString(
1060
+ reactApplicationContext.contentResolver,
1061
+ android.provider.Settings.Secure.ANDROID_ID
1062
+ ) ?: "")
1063
+ )
1064
+
1065
+ SdkeSign.openSessionId(
1066
+ context = currentActivity,
1067
+ userEsignModel = userInfo,
1068
+ privateKeyFilePath = privateKeyFilePath,
1069
+ username = username ?: "",
1070
+ rememberMe = rememberMe ?: false,
1071
+ callbackSuccess = { deviceState, code, message ->
1072
+ Log.d(TAG, "✅ openSessionId() success")
1073
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1074
+ map.putString("deviceState", deviceState)
1075
+ map.putString("code", code.toString())
1076
+ map.putString("message", message)
1077
+ }
1078
+ sendEvent("onESignOpenSessionSuccess", eventMap)
1079
+ promise.resolve(promiseMap)
1080
+ },
1081
+ callbackError = { event, error ->
1082
+ Log.e(TAG, "❌ openSessionId() failed - Event: $event, Message: ${error.message}")
1083
+ val errorMap = Arguments.createMap().apply {
1084
+ putString("event", event.name.toString())
1085
+ putString("message", error.message)
1086
+ putString("code", error.code)
1087
+ }
1088
+ sendEvent("onESignError", errorMap)
1089
+ promise.reject(event.name.toString(), error.message)
1090
+ }
1091
+ )
1092
+ } else {
1093
+ Log.e(TAG, "❌ openSessionId() failed: Invalid parameters")
1094
+ promise.reject("INVALID_PARAMS", "Either accessToken or (userEsignModelJson + privateKeyFilePath) must be provided")
1095
+ }
1096
+ } catch (e: Exception) {
1097
+ Log.e(TAG, "❌ openSessionId() exception: ${e.message}", e)
1098
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1099
+ }
1100
+ }
1101
+
1102
+ @ReactMethod
1103
+ fun registerDevice(
1104
+ recoverCode: String,
1105
+ pinCode: String,
1106
+ fcmToken: String?,
1107
+ promise: Promise
1108
+ ) {
1109
+ Log.d(TAG, "▶️ registerDevice() called")
1110
+ try {
1111
+ val currentActivity = reactApplicationContext.currentActivity
1112
+ if (currentActivity == null) {
1113
+ Log.e(TAG, "❌ registerDevice() failed: Activity not available")
1114
+ promise.reject("NO_ACTIVITY", "Activity not available")
1115
+ return
1116
+ }
1117
+
1118
+ SdkeSign.registerDevice(
1119
+ context = currentActivity,
1120
+ recoverCode = recoverCode,
1121
+ pinCode = pinCode,
1122
+ fcmToken = fcmToken ?: "",
1123
+ callbackSuccess = { code, message ->
1124
+ Log.d(TAG, "✅ registerDevice() success")
1125
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1126
+ map.putString("code", code.toString())
1127
+ map.putString("message", message)
1128
+ }
1129
+ sendEvent("onESignRegisterDeviceSuccess", eventMap)
1130
+ promise.resolve(promiseMap)
1131
+ },
1132
+ callbackError = { event, error ->
1133
+ Log.e(TAG, "❌ registerDevice() failed - Event: $event, Message: ${error.message}")
1134
+ val errorMap = Arguments.createMap().apply {
1135
+ putString("event", event.name.toString())
1136
+ putString("message", error.message)
1137
+ putString("code", error.code)
1138
+ }
1139
+ sendEvent("onESignError", errorMap)
1140
+ promise.reject(event.name.toString(), error.message)
1141
+ }
1142
+ )
1143
+ } catch (e: Exception) {
1144
+ Log.e(TAG, "❌ registerDevice() exception: ${e.message}", e)
1145
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1146
+ }
1147
+ }
1148
+
1149
+ @ReactMethod
1150
+ fun listCerts(
1151
+ pageNumber: Int,
1152
+ pageSize: Int,
1153
+ promise: Promise
1154
+ ) {
1155
+ Log.d(TAG, "▶️ listCerts() called")
1156
+ try {
1157
+ val currentActivity = reactApplicationContext.currentActivity
1158
+ if (currentActivity == null) {
1159
+ Log.e(TAG, "❌ listCerts() failed: Activity not available")
1160
+ promise.reject("NO_ACTIVITY", "Activity not available")
1161
+ return
1162
+ }
1163
+
1164
+ SdkeSign.listCerts(
1165
+ context = currentActivity,
1166
+ pageNumber = pageNumber,
1167
+ pageSize = pageSize,
1168
+ callbackSuccess = { certs ->
1169
+ Log.d(TAG, "✅ listCerts() success - Count: ${certs.size}")
1170
+ val (eventMap, promiseMap) = createSeparateMapsWithArray(
1171
+ arrayBuilder = { array: WritableArray ->
1172
+ certs.forEach { cert ->
1173
+ val certMap = Arguments.createMap().apply {
1174
+ putString("serial", cert.serial)
1175
+ putString("subject", cert.subject)
1176
+ putString("validFrom", cert.validFrom)
1177
+ putString("validTo", cert.validTo)
1178
+ }
1179
+ array.pushMap(certMap)
1180
+ }
1181
+ },
1182
+ mapBuilder = { map: WritableMap, array: WritableArray -> map.putArray("certs", array) }
1183
+ )
1184
+ sendEvent("onESignListCertsSuccess", eventMap)
1185
+ promise.resolve(promiseMap)
1186
+ },
1187
+ callbackError = { event, error ->
1188
+ Log.e(TAG, "❌ listCerts() failed - Event: $event, Message: ${error.message}")
1189
+ val errorMap = Arguments.createMap().apply {
1190
+ putString("event", event.name.toString())
1191
+ putString("message", error.message)
1192
+ putString("code", error.code)
1193
+ }
1194
+ sendEvent("onESignError", errorMap)
1195
+ promise.reject(event.name.toString(), error.message)
1196
+ }
1197
+ )
1198
+ } catch (e: Exception) {
1199
+ Log.e(TAG, "❌ listCerts() exception: ${e.message}", e)
1200
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1201
+ }
1202
+ }
1203
+
1204
+ @ReactMethod
1205
+ fun verifyCert(
1206
+ serial: String,
1207
+ promise: Promise
1208
+ ) {
1209
+ Log.d(TAG, "▶️ verifyCert() called")
1210
+ try {
1211
+ val currentActivity = reactApplicationContext.currentActivity
1212
+ if (currentActivity == null) {
1213
+ Log.e(TAG, "❌ verifyCert() failed: Activity not available")
1214
+ promise.reject("NO_ACTIVITY", "Activity not available")
1215
+ return
1216
+ }
1217
+
1218
+ SdkeSign.verifyCert(
1219
+ context = currentActivity,
1220
+ serial = serial,
1221
+ callbackSuccess = { code, message ->
1222
+ Log.d(TAG, "✅ verifyCert() success")
1223
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1224
+ map.putString("code", code.toString())
1225
+ map.putString("message", message)
1226
+ }
1227
+ sendEvent("onESignVerifyCertSuccess", eventMap)
1228
+ promise.resolve(promiseMap)
1229
+ },
1230
+ callbackError = { event, error ->
1231
+ Log.e(TAG, "❌ verifyCert() failed - Event: $event, Message: ${error.message}")
1232
+ val errorMap = Arguments.createMap().apply {
1233
+ putString("event", event.name.toString())
1234
+ putString("message", error.message)
1235
+ putString("code", error.code)
1236
+ }
1237
+ sendEvent("onESignError", errorMap)
1238
+ promise.reject(event.name.toString(), error.message)
1239
+ }
1240
+ )
1241
+ } catch (e: Exception) {
1242
+ Log.e(TAG, "❌ verifyCert() exception: ${e.message}", e)
1243
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1244
+ }
1245
+ }
1246
+
1247
+ @ReactMethod
1248
+ fun listSignRequest(
1249
+ pageNumber: Int,
1250
+ pageSize: Int,
1251
+ promise: Promise
1252
+ ) {
1253
+ Log.d(TAG, "▶️ listSignRequest() called")
1254
+ try {
1255
+ val currentActivity = reactApplicationContext.currentActivity
1256
+ if (currentActivity == null) {
1257
+ Log.e(TAG, "❌ listSignRequest() failed: Activity not available")
1258
+ promise.reject("NO_ACTIVITY", "Activity not available")
1259
+ return
1260
+ }
1261
+
1262
+ SdkeSign.listSignRequest(
1263
+ context = currentActivity,
1264
+ pageNumber = pageNumber,
1265
+ pageSize = pageSize,
1266
+ callbackSuccess = { requests ->
1267
+ Log.d(TAG, "✅ listSignRequest() success - Count: ${requests.size}")
1268
+ val (eventMap, promiseMap) = createSeparateMapsWithArray(
1269
+ arrayBuilder = { array: WritableArray ->
1270
+ requests.forEach { request ->
1271
+ val requestMap = Arguments.createMap().apply {
1272
+ putString("requestId", request.requestId)
1273
+ putString("documentName", request.documentName)
1274
+ putString("status", request.status)
1275
+ }
1276
+ array.pushMap(requestMap)
1277
+ }
1278
+ },
1279
+ mapBuilder = { map: WritableMap, array: WritableArray -> map.putArray("requests", array) }
1280
+ )
1281
+ sendEvent("onESignListSignRequestSuccess", eventMap)
1282
+ promise.resolve(promiseMap)
1283
+ },
1284
+ callbackError = { event, error ->
1285
+ Log.e(TAG, "❌ listSignRequest() failed - Event: $event, Message: ${error.message}")
1286
+ val errorMap = Arguments.createMap().apply {
1287
+ putString("event", event.name.toString())
1288
+ putString("message", error.message)
1289
+ putString("code", error.code)
1290
+ }
1291
+ sendEvent("onESignError", errorMap)
1292
+ promise.reject(event.name.toString(), error.message)
1293
+ }
1294
+ )
1295
+ } catch (e: Exception) {
1296
+ Log.e(TAG, "❌ listSignRequest() exception: ${e.message}", e)
1297
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1298
+ }
1299
+ }
1300
+
1301
+ @ReactMethod
1302
+ fun confirmSign(
1303
+ signRequestId: String,
1304
+ pinCode: String,
1305
+ authId: String?,
1306
+ authData: String?,
1307
+ confirm: Boolean,
1308
+ promise: Promise
1309
+ ) {
1310
+ Log.d(TAG, "▶️ confirmSign() called")
1311
+ try {
1312
+ val currentActivity = reactApplicationContext.currentActivity
1313
+ if (currentActivity == null) {
1314
+ Log.e(TAG, "❌ confirmSign() failed: Activity not available")
1315
+ promise.reject("NO_ACTIVITY", "Activity not available")
1316
+ return
1317
+ }
1318
+
1319
+ SdkeSign.confirmSign(
1320
+ context = currentActivity,
1321
+ signRequestId = signRequestId,
1322
+ pinCode = pinCode,
1323
+ authId = authId ?: "",
1324
+ authData = authData ?: "",
1325
+ confirm = confirm,
1326
+ callbackSuccess = { code, message ->
1327
+ Log.d(TAG, "✅ confirmSign() success")
1328
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1329
+ map.putString("code", code.toString())
1330
+ map.putString("message", message)
1331
+ }
1332
+ sendEvent("onESignConfirmSignSuccess", eventMap)
1333
+ promise.resolve(promiseMap)
1334
+ },
1335
+ callbackError = { event, error ->
1336
+ Log.e(TAG, "❌ confirmSign() failed - Event: $event, Message: ${error.message}")
1337
+ val errorMap = Arguments.createMap().apply {
1338
+ putString("event", event.name.toString())
1339
+ putString("message", error.message)
1340
+ putString("code", error.code)
1341
+ }
1342
+ sendEvent("onESignError", errorMap)
1343
+ promise.reject(event.name.toString(), error.message)
1344
+ }
1345
+ )
1346
+ } catch (e: Exception) {
1347
+ Log.e(TAG, "❌ confirmSign() exception: ${e.message}", e)
1348
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1349
+ }
1350
+ }
1351
+
1352
+ @ReactMethod
1353
+ fun authenticate(
1354
+ username: String,
1355
+ password: String,
1356
+ promise: Promise
1357
+ ) {
1358
+ Log.d(TAG, "▶️ authenticate() called")
1359
+ try {
1360
+ SdkeSign.authenticate(
1361
+ username = username,
1362
+ password = password,
1363
+ callbackSuccess = { token, userId ->
1364
+ Log.d(TAG, "✅ authenticate() success")
1365
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1366
+ map.putString("token", token)
1367
+ map.putString("userId", userId.toString())
1368
+ }
1369
+ sendEvent("onESignAuthenticateSuccess", eventMap)
1370
+ promise.resolve(promiseMap)
1371
+ },
1372
+ callbackError = { event, error ->
1373
+ Log.e(TAG, "❌ authenticate() failed - Event: $event, Message: ${error.message}")
1374
+ val errorMap = Arguments.createMap().apply {
1375
+ putString("event", event.name.toString())
1376
+ putString("message", error.message)
1377
+ putString("code", error.code)
1378
+ }
1379
+ sendEvent("onESignError", errorMap)
1380
+ promise.reject(event.name.toString(), error.message)
1381
+ }
1382
+ )
1383
+ } catch (e: Exception) {
1384
+ Log.e(TAG, "❌ authenticate() exception: ${e.message}", e)
1385
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1386
+ }
1387
+ }
1388
+
1389
+ @ReactMethod
1390
+ fun registerRemoteSigning(
1391
+ accessToken: String,
1392
+ requestJson: String,
1393
+ promise: Promise
1394
+ ) {
1395
+ Log.d(TAG, "▶️ registerRemoteSigning() called")
1396
+ try {
1397
+ SdkeSign.registerRemoteSigning(
1398
+ accessToken = accessToken,
1399
+ requestJson = requestJson,
1400
+ callbackSuccess = { rawResponse ->
1401
+ Log.d(TAG, "✅ registerRemoteSigning() success")
1402
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1403
+ map.putString("response", rawResponse)
1404
+ }
1405
+ sendEvent("onESignRegisterRemoteSigningSuccess", eventMap)
1406
+ promise.resolve(promiseMap)
1407
+ },
1408
+ callbackError = { event, error ->
1409
+ Log.e(TAG, "❌ registerRemoteSigning() failed - Event: $event, Message: ${error.message}")
1410
+ val errorMap = Arguments.createMap().apply {
1411
+ putString("event", event.name.toString())
1412
+ putString("message", error.message)
1413
+ putString("code", error.code)
1414
+ }
1415
+ sendEvent("onESignError", errorMap)
1416
+ promise.reject(event.name.toString(), error.message)
1417
+ }
1418
+ )
1419
+ } catch (e: Exception) {
1420
+ Log.e(TAG, "❌ registerRemoteSigning() exception: ${e.message}", e)
1421
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1422
+ }
1423
+ }
1424
+
1425
+ @ReactMethod
1426
+ fun signPdf(
1427
+ accessToken: String,
1428
+ requestJson: String,
1429
+ promise: Promise
1430
+ ) {
1431
+ Log.d(TAG, "▶️ signPdf() called")
1432
+ try {
1433
+ SdkeSign.signPdf(
1434
+ accessToken = accessToken,
1435
+ requestJson = requestJson,
1436
+ callbackSuccess = { rawResponse ->
1437
+ Log.d(TAG, "✅ signPdf() success")
1438
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1439
+ map.putString("response", rawResponse)
1440
+ }
1441
+ sendEvent("onESignSignPdfSuccess", eventMap)
1442
+ promise.resolve(promiseMap)
1443
+ },
1444
+ callbackError = { event, error ->
1445
+ Log.e(TAG, "❌ signPdf() failed - Event: $event, Message: ${error.message}")
1446
+ val errorMap = Arguments.createMap().apply {
1447
+ putString("event", event.name.toString())
1448
+ putString("message", error.message)
1449
+ putString("code", error.code)
1450
+ }
1451
+ sendEvent("onESignError", errorMap)
1452
+ promise.reject(event.name.toString(), error.message)
1453
+ }
1454
+ )
1455
+ } catch (e: Exception) {
1456
+ Log.e(TAG, "❌ signPdf() exception: ${e.message}", e)
1457
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1458
+ }
1459
+ }
1460
+
1461
+ @ReactMethod
1462
+ fun sendConfirmationDocument(
1463
+ accessToken: String,
1464
+ requestJson: String,
1465
+ promise: Promise
1466
+ ) {
1467
+ Log.d(TAG, "▶️ sendConfirmationDocument() called")
1468
+ try {
1469
+ SdkeSign.sendConfirmationDocument(
1470
+ accessToken = accessToken,
1471
+ requestJson = requestJson,
1472
+ callbackSuccess = { rawResponse ->
1473
+ Log.d(TAG, "✅ sendConfirmationDocument() success")
1474
+ val (eventMap, promiseMap) = createSeparateMaps { map ->
1475
+ map.putString("response", rawResponse)
1476
+ }
1477
+ sendEvent("onESignSendConfirmationDocumentSuccess", eventMap)
1478
+ promise.resolve(promiseMap)
1479
+ },
1480
+ callbackError = { event, error ->
1481
+ Log.e(TAG, "❌ sendConfirmationDocument() failed - Event: $event, Message: ${error.message}")
1482
+ val errorMap = Arguments.createMap().apply {
1483
+ putString("event", event.name.toString())
1484
+ putString("message", error.message)
1485
+ putString("code", error.code)
1486
+ }
1487
+ sendEvent("onESignError", errorMap)
1488
+ promise.reject(event.name.toString(), error.message)
1489
+ }
1490
+ )
1491
+ } catch (e: Exception) {
1492
+ Log.e(TAG, "❌ sendConfirmationDocument() exception: ${e.message}", e)
1493
+ promise.reject("ESIGN_EXCEPTION", e.message, e)
1494
+ }
1495
+ }
1496
+
787
1497
  }