diff --git a/features/tangempay/onboarding/impl/build.gradle.kts b/features/tangempay/onboarding/impl/build.gradle.kts index 1d205ff513..0b2af70dd3 100644 --- a/features/tangempay/onboarding/impl/build.gradle.kts +++ b/features/tangempay/onboarding/impl/build.gradle.kts @@ -15,6 +15,8 @@ dependencies { /** Core */ implementation(projects.core.decompose) implementation(projects.core.ui) + implementation(projects.core.error) + implementation(deps.arrow.core) /** Common */ implementation(projects.common.routing) @@ -25,6 +27,9 @@ dependencies { implementation(projects.features.tangempay.details.api) implementation(projects.features.kyc.api) + /** Domain */ + implementation(projects.domain.visa) + /** Compose */ implementation(deps.compose.foundation) implementation(deps.compose.material3) diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/components/DefaultTangemPayOnboardingComponent.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/components/DefaultTangemPayOnboardingComponent.kt index c770c768d1..58a1454848 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/components/DefaultTangemPayOnboardingComponent.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/components/DefaultTangemPayOnboardingComponent.kt @@ -5,6 +5,8 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.context.child +import com.tangem.features.kyc.KycComponent import com.tangem.core.decompose.model.getOrCreateModel import com.tangem.features.tangempay.model.TangemPayOnboardingModel import dagger.assisted.Assisted @@ -15,14 +17,21 @@ import com.tangem.features.tangempay.ui.TandemPayOnboardingScreen internal class DefaultTangemPayOnboardingComponent @AssistedInject constructor( @Assisted appComponentContext: AppComponentContext, @Assisted params: TangemPayOnboardingComponent.Params, + kycComponentFactory: KycComponent.Factory, ) : TangemPayOnboardingComponent, AppComponentContext by appComponentContext { + private val kycComponent = kycComponentFactory.create(child("kycComponent")) + private val model: TangemPayOnboardingModel = getOrCreateModel(params) @Composable override fun Content(modifier: Modifier) { val state by model.screenState.collectAsStateWithLifecycle() - TandemPayOnboardingScreen(modifier = modifier, state = state) + TandemPayOnboardingScreen(modifier = modifier, state = state, onButtonClick = ::onButtonClick) + } + + private fun onButtonClick() { + kycComponent.launch() } @AssistedFactory diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt index 10c89f97a8..61b942c805 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt @@ -4,23 +4,55 @@ import androidx.compose.runtime.Stable import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.core.decompose.navigation.Router +import com.tangem.domain.pay.repository.OnboardingRepository import com.tangem.features.tangempay.components.TangemPayOnboardingComponent import com.tangem.features.tangempay.ui.TangemPayOnboardingScreenState import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch import javax.inject.Inject @Stable @ModelScoped internal class TangemPayOnboardingModel @Inject constructor( paramsContainer: ParamsContainer, + private val router: Router, override val dispatchers: CoroutineDispatcherProvider, + private val repository: OnboardingRepository, ) : Model() { - @Suppress("UnusedPrivateMember") private val params = paramsContainer.require() val screenState: StateFlow field = MutableStateFlow(TangemPayOnboardingScreenState()) + + init { + modelScope.launch { + repository.validateDeeplink(params.deeplink) + .onRight { isValid -> if (isValid) checkCustomerInfo() } + .onLeft { exit() } + } + } + + private suspend fun checkCustomerInfo() { + repository.getCustomerInfo() + .onRight { customerInfo -> + when { + !customerInfo.isKycApproved() -> { + screenState.value = screenState.value.copy(fullScreenLoading = false) + } + !customerInfo.isProductInstanceActive() -> { + // TODO [REDACTED_TASK_KEY]: create order and poll order status (API is not ready yet) + } + else -> exit() + } + } + .onLeft { exit() } + } + + private fun exit() { + router.pop() + } } \ No newline at end of file diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt index 42882bafb0..b0b18abdd6 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt @@ -13,7 +13,11 @@ import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.res.TangemThemePreview @Composable -internal fun TandemPayOnboardingScreen(state: TangemPayOnboardingScreenState, modifier: Modifier = Modifier) { +internal fun TandemPayOnboardingScreen( + state: TangemPayOnboardingScreenState, + onButtonClick: () -> Unit, + modifier: Modifier = Modifier, +) { Scaffold( modifier = modifier, topBar = { @@ -29,6 +33,7 @@ internal fun TandemPayOnboardingScreen(state: TangemPayOnboardingScreenState, mo .padding(paddingValues) .fillMaxSize(), state = state, + onButtonClick = onButtonClick, ) }, ) @@ -39,6 +44,6 @@ internal fun TandemPayOnboardingScreen(state: TangemPayOnboardingScreenState, mo @Composable private fun PreviewDarkTheme() { TangemThemePreview { - TandemPayOnboardingScreen(state = TangemPayOnboardingScreenState()) + TandemPayOnboardingScreen(state = TangemPayOnboardingScreenState(), {}) } } \ No newline at end of file diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt index ee247407a6..1933e8480e 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt @@ -19,7 +19,11 @@ import com.tangem.core.ui.res.TangemTheme import com.tangem.features.tangempay.onboarding.impl.R @Composable -internal fun TangemPayOnboardingContent(state: TangemPayOnboardingScreenState, modifier: Modifier = Modifier) { +internal fun TangemPayOnboardingContent( + state: TangemPayOnboardingScreenState, + onButtonClick: () -> Unit, + modifier: Modifier = Modifier, +) { if (state.fullScreenLoading) { Box( modifier = modifier.fillMaxSize(), @@ -72,7 +76,7 @@ internal fun TangemPayOnboardingContent(state: TangemPayOnboardingScreenState, m iconRes = R.drawable.ic_tangem_24, isIconVisible = true, showProgress = state.buttonLoading, - onClick = {}, + onClick = onButtonClick, ), ) }