diff --git a/android/src/main/java/com/onfido/reactnative/sdk/OnfidoSdkModule.java b/android/src/main/java/com/onfido/reactnative/sdk/OnfidoSdkModule.java index d8ef5c1..e8254cd 100644 --- a/android/src/main/java/com/onfido/reactnative/sdk/OnfidoSdkModule.java +++ b/android/src/main/java/com/onfido/reactnative/sdk/OnfidoSdkModule.java @@ -2,6 +2,8 @@ import android.app.Activity; +import androidx.annotation.NonNull; + import com.facebook.react.bridge.NoSuchKeyException; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; @@ -13,10 +15,14 @@ import java.util.List; import java.util.ArrayList; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.bridge.WritableMap; + import com.facebook.react.bridge.Arguments; import com.onfido.android.sdk.capture.Onfido; import com.onfido.android.sdk.capture.EnterpriseFeatures; +import com.onfido.android.sdk.capture.UserEventHandler; import com.onfido.android.sdk.capture.ui.options.FlowStep; import com.onfido.android.sdk.capture.OnfidoConfig; import com.onfido.android.sdk.capture.OnfidoFactory; @@ -26,6 +32,7 @@ import com.onfido.android.sdk.capture.utils.CountryCode; import com.onfido.android.sdk.capture.ui.options.CaptureScreenStep; import com.onfido.android.sdk.capture.errors.*; +import com.onfido.segment.analytics.Properties; public class OnfidoSdkModule extends ReactContextBaseJavaModule { @@ -38,6 +45,23 @@ public OnfidoSdkModule(final ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; this.client = OnfidoFactory.create(reactContext).getClient(); + Onfido.Companion.setUserEventHandler(new UserEventHandler() { + @Override + public void handleEvent(@NonNull String s, @NonNull Properties properties) { + WritableMap params = Arguments.createMap(); + params.putString("event_name", properties.get("name").toString()); + if (properties.get("doc_type") != null) { + params.putString("doc_type", properties.get("doc_type").toString()); + } + if (properties.get("country") != null) { + params.putString("country", properties.get("country").toString()); + } + if (properties.get("mode") != null) { + params.putString("mode", properties.get("mode").toString()); + } + reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("Onfido", params); + } + }); this.activityEventListener = new OnfidoSdkActivityEventListener(client); reactContext.addActivityEventListener(activityEventListener); } diff --git a/ios/OnfidoSdk-Bridging-Header.h b/ios/OnfidoSdk-Bridging-Header.h index 84805a3..ebf12f6 100644 --- a/ios/OnfidoSdk-Bridging-Header.h +++ b/ios/OnfidoSdk-Bridging-Header.h @@ -3,3 +3,4 @@ // #import +#import diff --git a/ios/OnfidoSdk.m b/ios/OnfidoSdk.m index 777e8ab..606d285 100644 --- a/ios/OnfidoSdk.m +++ b/ios/OnfidoSdk.m @@ -1,7 +1,8 @@ #import #import +#import -@interface RCT_EXTERN_MODULE(OnfidoSdk, NSObject) +@interface RCT_EXTERN_MODULE(OnfidoSdk, RCTEventEmitter) RCT_EXTERN_METHOD( start:(NSDictionary *)config diff --git a/ios/OnfidoSdk.swift b/ios/OnfidoSdk.swift index c6c6a6f..6125c9b 100644 --- a/ios/OnfidoSdk.swift +++ b/ios/OnfidoSdk.swift @@ -162,12 +162,26 @@ public func buildOnfidoConfig(config:NSDictionary, appearance: Appearance) throw } @objc(OnfidoSdk) -class OnfidoSdk: NSObject { +class OnfidoSdk: RCTEventEmitter { - @objc static func requiresMainQueueSetup() -> Bool { + var hasListeners = false + + @objc override static func requiresMainQueueSetup() -> Bool { return false } + @objc override func supportedEvents() -> [String] { + return ["Onfido"] + } + + @objc override func startObserving() -> Void { + self.hasListeners = true + } + + @objc override func stopObserving() -> Void { + self.hasListeners = false + } + @objc func start(_ config: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) -> Void { @@ -192,6 +206,25 @@ class OnfidoSdk: NSObject { let faceVariant = captureFace?["type"] as? String let onfidoFlow = OnfidoFlow(withConfiguration: builtOnfidoConfig) + .with(eventHandler: { + (event: Event) -> () in + if (self.hasListeners) { + var mode = "" + do { + let data = try JSONSerialization.data(withJSONObject: event.properties["mode"] ?? [], options: []) + mode = String(data: data, encoding: String.Encoding.utf8) ?? "" + } catch { + mode = "" + } + let body = [ + "event_name": event.properties["name"], + "doc_type": event.properties["doc_type"], + "country": event.properties["country"], + "mode": mode, + ] + self.sendEvent(withName: "Onfido", body: body) + } + }) .with(responseHandler: { [weak self] response in guard let `self` = self else { return } switch response { diff --git a/js/Onfido.js b/js/Onfido.js index 30cd248..d67a1b9 100644 --- a/js/Onfido.js +++ b/js/Onfido.js @@ -1,4 +1,4 @@ -import { NativeModules, Platform } from 'react-native'; +import { NativeModules, NativeEventEmitter, Platform } from 'react-native'; import { OnfidoDocumentType, OnfidoCaptureType, OnfidoCountryCode, OnfidoAlpha2CountryCode } from "./config_constants"; const { OnfidoSdk } = NativeModules; @@ -59,6 +59,10 @@ const Onfido = { console.log(error); throw error; }); + }, + addEventListener(callback) { + const eventEmitter = new NativeEventEmitter(OnfidoSdk); + return eventEmitter.addListener("Onfido", callback) } };