Updated on 2026-08-14
This commit is contained in:
parent
55c47c7838
commit
b01d80ea23
5 changed files with 61 additions and 6 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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(), {})
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue