package uz.myid.cmp import android.app.Activity import android.content.Context import android.content.ContextWrapper import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext import uz.myid.android.sdk.capture.MyIdClient import uz.myid.android.sdk.capture.MyIdConfig import uz.myid.android.sdk.capture.MyIdException import uz.myid.android.sdk.capture.MyIdResult import uz.myid.android.sdk.capture.MyIdResultListener import uz.myid.android.sdk.capture.model.MyIdBuildMode import uz.myid.android.sdk.capture.model.MyIdGraphicFieldType @Composable actual fun rememberMyIdManager( onCompleted: (String?, ImageBitmap?) -> Unit, onFailed: (String?) -> Unit, onCancelled: () -> Unit, ): MyIdManager { val context = LocalContext.current val client = remember { MyIdClient() } val launcher = rememberLauncherForActivityResult( contract = ActivityResultContracts.StartActivityForResult() ) { client.handleActivityResult(it.resultCode, object : MyIdResultListener { override fun onSuccess(result: MyIdResult) { onCompleted( result.code, result.getGraphicFieldImageByType(MyIdGraphicFieldType.FACE_PORTRAIT)?.asImageBitmap() ) } override fun onError(exception: MyIdException) { onFailed(exception.message) } override fun onUserExited() { onCancelled() } }) } return remember { MyIdManager { data -> context.findActivity()?.let { val config = MyIdConfig.builder(data.clientId) .withClientHash(data.clientHash, data.clientHashId) .withBuildMode(MyIdBuildMode.DEBUG) .build() val intent = client.createIntent(it, config) launcher.launch(intent) } } } } private fun Context.findActivity(): Activity? { var currentContext = this while (currentContext is ContextWrapper) { if (currentContext is Activity) { return currentContext } currentContext = currentContext.baseContext } return null }