Updated on 2026-08-14

This commit is contained in:
Tangem 2025-09-18 11:22:27 +04:00
parent 55c47c7838
commit b01d80ea23
5 changed files with 61 additions and 6 deletions

View file

@ -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)

View file

@ -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

View file

@ -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<TangemPayOnboardingComponent.Params>()
val screenState: StateFlow<TangemPayOnboardingScreenState>
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()
}
}

View file

@ -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(), {})
}
}

View file

@ -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,
),
)
}