package io.scanbot.sdk.reactnative import android.app.Activity import android.content.Intent import com.facebook.react.bridge.ActivityEventListener import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap import com.facebook.react.modules.core.DeviceEventManagerModule import io.scanbot.sdk.reactnative.extensions.toJSON import io.scanbot.sdk.reactnative.extensions.toWritableMap import io.scanbot.sdk_wrapper.document.rtuui.SBDRtuUi import org.json.JSONObject class ScanbotSDKUIModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), ActivityEventListener { companion object { const val NAME = "RNScanbotRTUUI" const val BARCODE_ITEM_MAPPER_EVENT = "barcodeItemMapperEvent" } override fun getName(): String { return NAME } override fun initialize() { super.initialize() reactApplicationContext?.addActivityEventListener(this) } override fun invalidate() { reactApplicationContext?.removeActivityEventListener(this) super.invalidate() } @ReactMethod fun startDocumentScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startDocumentScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startCroppingScreen(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startCroppingScreen( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startMrzScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startMrzScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startTextPatternScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startTextPatternScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startCreditCardScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startCreditCardScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startCheckScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startCheckScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startDDEScreen(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startDocumentDataExtractor( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startVinScanner(configuration: ReadableMap, promise: Promise) = runOperationWithSafeActivity(promise) { SBDRtuUi.startVinScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } @ReactMethod fun startBarcodeScanner( configuration: ReadableMap, barcodeItemMapperImplemented: Boolean, promise: Promise ) = runOperationWithSafeActivity(promise) { if (barcodeItemMapperImplemented) { SBDRtuUi.startBarcodeScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) { barcodeItemAsJson: JSONObject -> reactApplicationContextIfActiveOrWarn?.getJSModule( DeviceEventManagerModule.RCTDeviceEventEmitter::class.java )?.emit(BARCODE_ITEM_MAPPER_EVENT, barcodeItemAsJson.toWritableMap()) } } else { SBDRtuUi.startBarcodeScanner( it, configuration.toJSON(), ScanbotSDKPluginResultDelegate(promise) ) } } @ReactMethod fun onBarcodeItemMapper(barcodeItemUuid: String, barcodeMappedData: ReadableMap?) { SBDRtuUi.onBarcodeItemMapper(barcodeItemUuid, barcodeMappedData?.toJSON()) } override fun onActivityResult( activity: Activity, requestCode: Int, resultCode: Int, data: Intent? ) { SBDRtuUi.onActivityResult(requestCode, resultCode, data) } override fun onNewIntent(data: Intent) { // NO-OP } @Suppress("UNUSED_PARAMETER") @ReactMethod fun addListener(type: String) { // Keep: Required for RN built in Event Emitter Calls, otherwise warnings are thrown in the console log. } @Suppress("UNUSED_PARAMETER") @ReactMethod fun removeListeners(type: Int) { // Keep: Required for RN built in Event Emitter Calls, otherwise warnings are thrown in the console log. } //region Helpers private fun runOperationWithSafeActivity( promise: Promise, operation: (currentActivity: Activity) -> Unit ) { reactApplicationContext?.currentActivity?.let { operation(it) } ?: run { promise.reject(Exception("$NAME is not attached to activity")) } } //endregion Helpers }