package com.reactnativetink 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.google.gson.Gson import com.reactnativetink.activity.ConnectAccountActivity import com.reactnativetink.activity.FinanceOverviewActivity import com.reactnativetink.models.TinkLinkError import com.reactnativetink.utils.UPDATE_CONSENT_REQUEST_CODE import com.reactnativetink.utils.Utils //import com.tink.core.Tink //import com.tink.service.network.Environment //import com.tink.service.network.TinkConfiguration class ReactNativeTinkModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), ActivityEventListener { companion object { const val NAME = "ReactNativeTink" const val CONNECT_ACCOUNT_REQUEST_CODE = 1995 const val FM_REQUEST_CODE = 1999 lateinit var bridgePromise: Promise } init { reactContext.addActivityEventListener(this) } override fun getName(): String { return NAME } @ReactMethod fun connectAccount( clientId: String, redirectUri: String, authorizationCode: String, market: String, locale: String, promise: Promise, ) { bridgePromise = promise val intent = Intent(reactApplicationContext, ConnectAccountActivity::class.java) intent.putExtra("ClientID", clientId) intent.putExtra("RedirectUri", redirectUri) intent.putExtra("AuthorizationCode", authorizationCode) intent.putExtra("Market", market) intent.putExtra("Locale", locale) currentActivity!!.startActivityForResult(intent, CONNECT_ACCOUNT_REQUEST_CODE) } @ReactMethod fun updateConsent( clientId: String, redirectUri: String, authorizationCode: String, credentialID: String, promise: Promise, ) { bridgePromise = promise val intent = Intent(reactApplicationContext, ConnectAccountActivity::class.java) intent.putExtra("ClientID", clientId) intent.putExtra("RedirectUri", redirectUri) intent.putExtra("AuthorizationCode", authorizationCode) intent.putExtra("CredentialsId", credentialID) intent.putExtra("IsUpdateConsent", true) currentActivity!!.startActivityForResult(intent, UPDATE_CONSENT_REQUEST_CODE) } @ReactMethod fun launchFinanceOverview( clientId: String, userAccessToken: String, appAccessToken: String, userId: String, idHint: String, actorClientId: String, scope: String, redirectUri: String, promise: Promise, ) { if (clientId == null || userAccessToken == null) { throw Exception("ClientId or AccessToken missing") } bridgePromise = promise val intent = Intent(reactApplicationContext, FinanceOverviewActivity::class.java).apply { putExtra("clientId", clientId) putExtra("userAccessToken", userAccessToken) putExtra("appAccessToken", appAccessToken) putExtra("userId", userId) putExtra("idHint", idHint) putExtra("actorClientId", actorClientId) putExtra("scope", scope) putExtra("redirectUri", redirectUri) } currentActivity!!.startActivityForResult(intent, FM_REQUEST_CODE) } @ReactMethod fun initTink( clientId: String, promise: Promise, ) { // val config = // TinkConfiguration( // environment = Environment.Production, // oAuthClientId = clientId, // ) // Tink.init(config, reactApplicationContext) // promise.resolve("success") } override fun onActivityResult( activity: Activity?, requestCode: Int, resultCode: Int, intent: Intent?, ) { if ((requestCode == CONNECT_ACCOUNT_REQUEST_CODE || requestCode == UPDATE_CONSENT_REQUEST_CODE) && intent != null) { if (resultCode == Activity.RESULT_OK) { val credentialsId: String? = intent.getStringExtra("credentialsId") bridgePromise.resolve(credentialsId) } else { val error: TinkLinkError = Utils().getSerializable(intent, "error", TinkLinkError::class.java) bridgePromise.reject("Error", Gson().toJson(error)) } } else { if (requestCode == FM_REQUEST_CODE && intent != null) { if (resultCode == Activity.RESULT_OK) { bridgePromise.resolve("Finance overview success") } else { bridgePromise.reject("Error", Gson().toJson("Finance overview error")) } } } } override fun onNewIntent(p0: Intent) { } }