package com.onramp import com.buyhatke.onrampsdk.OnrampSDK import com.buyhatke.onrampsdk.listeners.OnrampSDKEventListener import com.buyhatke.onrampsdk.ui.WidgetResponse import com.facebook.react.bridge.Arguments 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.bridge.WritableMap import com.facebook.react.bridge.WritableNativeMap import com.facebook.react.modules.core.DeviceEventManagerModule import com.google.gson.Gson import java.util.Objects import org.json.JSONException import org.json.JSONObject class OnrampModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), OnrampSDKEventListener { override fun getName(): String { return NAME } companion object { const val NAME = "OnrampSDK" } private fun sendEvent(eventName: String, params: WritableMap?) { reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) .emit(eventName, params) } @ReactMethod fun startSdk(args: ReadableMap) { var appId = 0 var walletAddress: String? = null var flowType = 1 var coinCode: String? = null var network: String? = null var coinAmount: Double? = null var fiatAmount: Double? = null var merchantRecognitionId: String? = null var paymentMethod: Int? = null var authToken: String? = null var assetDescription: String? = null var assetImage: String? = null var fiatType: Int? = null var phoneNumber: String? = null var lang: String? = null var addressTag: String? = null var sellCoinCode: String? = null var receiveCoinCode: String? = null var sellAmount: Double? = null var receiveAmount: Double? = null var sellNetwork: String? = null var receiveNetwork: String? = null var redirectUrl: String? = null var defaultCoinCode: String? = null var defaultSellCoinCode: String? = null if (args.hasKey("appId")) { appId = args.getInt("appId") } if (args.hasKey("walletAddress")) { walletAddress = args.getString("walletAddress").toString() } if (args.hasKey("flowType")) { flowType = args.getInt("flowType") } if (args.hasKey("coinCode")) { coinCode = args.getString("coinCode") } if (args.hasKey("network")) { network = args.getString("network") } if (args.hasKey("coinAmount")) { coinAmount = args.getDouble("coinAmount") } if (args.hasKey("fiatAmount")) { fiatAmount = args.getDouble("fiatAmount") } if (args.hasKey("merchantRecognitionId")) { merchantRecognitionId = args.getString("merchantRecognitionId") } if (args.hasKey("paymentMethod")) { paymentMethod = args.getInt("paymentMethod") } if (args.hasKey("authToken")) { authToken = args.getString("authToken") } if (args.hasKey("assetDescription")) { assetDescription = args.getString("assetDescription") } if (args.hasKey("assetImage")) { assetImage = args.getString("assetImage") } if (args.hasKey("fiatType")) { fiatType = args.getInt("fiatType") } if (args.hasKey("phoneNumber")) { phoneNumber = args.getString("phoneNumber") } if (args.hasKey("lang")) { lang = args.getString("lang") } if (args.hasKey("addressTag")) { addressTag = args.getString("addressTag") } if (args.hasKey("sellCoinCode")) { sellCoinCode = args.getString("sellCoinCode") } if (args.hasKey("receiveCoinCode")) { receiveCoinCode = args.getString("receiveCoinCode") } if (args.hasKey("sellAmount") && !args.isNull("sellAmount")) { sellAmount = args.getDouble("sellAmount") } if (args.hasKey("receiveAmount") && !args.isNull("receiveAmount")) { receiveAmount = args.getDouble("receiveAmount") } if (args.hasKey("sellNetwork")) { sellNetwork = args.getString("sellNetwork") } if (args.hasKey("receiveNetwork")) { receiveNetwork = args.getString("receiveNetwork") } if (args.hasKey("redirectUrl")) { redirectUrl = args.getString("redirectUrl") } if (args.hasKey("defaultCoinCode")) { defaultCoinCode = args.getString("defaultCoinCode") } if (args.hasKey("defaultSellCoinCode")) { defaultSellCoinCode = args.getString("defaultSellCoinCode") } OnrampSDK.startOnrampSDK( reactApplicationContext, appId, walletAddress, flowType, coinCode, network, coinAmount, fiatAmount, merchantRecognitionId, paymentMethod, authToken, assetDescription, assetImage, fiatType, phoneNumber, lang, addressTag, sellCoinCode, receiveCoinCode, sellAmount, receiveAmount, sellNetwork, receiveNetwork, redirectUrl, defaultCoinCode, defaultSellCoinCode ) OnrampSDK.registerOnrampSDKEventListener(this) } @ReactMethod fun startOnrampLogin(args: ReadableMap) { var appId = 0 var closeAfterLogin = false var signature: String? = null var phoneNumber: String? = null var lang: String? = null if (args.hasKey("appId")) { appId = args.getInt("appId") } if (args.hasKey("closeAfterLogin")) { closeAfterLogin = args.getBoolean("closeAfterLogin") } if (args.hasKey("signature")) { signature = args.getString("signature").toString() } if (args.hasKey("phoneNumber")) { phoneNumber = args.getString("phoneNumber").toString() } if (args.hasKey("lang")) { lang = args.getString("lang") } OnrampSDK.startOnrampLogin( reactApplicationContext, appId, closeAfterLogin, signature, phoneNumber, lang ) OnrampSDK.registerOnrampSDKEventListener(this) } @ReactMethod fun initiateOnrampKyc(args: ReadableMap) { var appId = 0 var payload = "" var signature = "" var customerId = "" var apiKey = "" var lang: String? = null if (args.hasKey("appId")) { appId = args.getInt("appId") } if (args.hasKey("payload")) { payload = args.getString("payload").toString() } if (args.hasKey("signature")) { signature = args.getString("signature").toString() } if (args.hasKey("customerId")) { customerId = args.getString("customerId").toString() } if (args.hasKey("apiKey")) { apiKey = args.getString("apiKey").toString() } if (args.hasKey("lang")) { lang = args.getString("lang") } OnrampSDK.initiateOnrampKyc( reactApplicationContext, appId, payload, signature, customerId, apiKey, lang ) OnrampSDK.registerOnrampSDKEventListener(this) } @ReactMethod fun closeSdk() { OnrampSDK.stopOnrampSDK() } @Throws(JSONException::class) private fun convertJsonToMap(jsonObject: JSONObject): WritableMap? { val map: WritableMap = WritableNativeMap() val iterator = jsonObject.keys() while (iterator.hasNext()) { val key = iterator.next() val value = jsonObject.opt(key) when (value) { is JSONObject -> { map.putMap(key, convertJsonToMap(value)) } is Boolean -> { map.putBoolean(key, value) } is Int -> { map.putInt(key, value) } is Double -> { map.putDouble(key, value) } is String -> { map.putString(key, value) } null -> { map.putNull(key) } else -> { map.putString(key, value.toString()) } } } return map } @ReactMethod override fun onDataReceived(data: WidgetResponse) { val resultMap = Arguments.createMap() val g = Gson() resultMap.putString("type", Objects.requireNonNull(data).type) resultMap.putBoolean("isOnramp", Objects.requireNonNull(data).isOnramp) val jo = JSONObject(g.toJson(data.data)) val wm = convertJsonToMap(jo) resultMap.putMap("data", wm) sendEvent("widgetEvents", resultMap) } @ReactMethod fun addListener(eventName: String) { // Keep: Required for RN built in Event Emitter Calls. } @ReactMethod fun removeListeners(count: Int) { // Keep: Required for RN built in Event Emitter Calls. } }