Updated on 2026-08-14

This commit is contained in:
Tangem 2025-11-14 21:32:29 +05:00
parent 5e854cd424
commit 7ff4227443
14 changed files with 63 additions and 21 deletions

View file

@ -570,6 +570,7 @@ internal class ChildFactory @Inject constructor(
context = context,
params = UpdateAccessCodeComponent.Params(
userWalletId = route.userWalletId,
isFirstSetup = route.isFirstSetup,
),
componentFactory = updateAccessCodeComponentFactory,
)

View file

@ -369,6 +369,7 @@ sealed class AppRoute(val path: String) : Route {
@Serializable
data class UpdateAccessCode(
val userWalletId: UserWalletId,
val isFirstSetup: Boolean,
) : AppRoute(path = "/update_access_code/${userWalletId.stringValue}")
@Serializable

View file

@ -5,6 +5,9 @@ import com.tangem.core.ui.decompose.ComposableContentComponent
import com.tangem.domain.models.wallet.UserWalletId
interface UpdateAccessCodeComponent : ComposableContentComponent {
data class Params(val userWalletId: UserWalletId)
data class Params(
val userWalletId: UserWalletId,
val isFirstSetup: Boolean,
)
interface Factory : ComponentFactory<Params, UpdateAccessCodeComponent>
}

View file

@ -150,7 +150,7 @@ internal class AddExistingWalletModel @Inject constructor(
inner class MobileWalletSetupFinishedComponentModelCallbacks :
MobileWalletSetupFinishedComponent.ModelCallbacks {
override fun onContinueClick() {
override fun onFinishClick() {
router.replaceAll(AppRoute.Wallet)
}
}

View file

@ -27,7 +27,7 @@ internal class MobileWalletSetupFinishedComponent @AssistedInject constructor(
}
interface ModelCallbacks {
fun onContinueClick()
fun onFinishClick()
}
data class Params(

View file

@ -20,7 +20,7 @@ internal class MobileWalletSetupFinishedModel @Inject constructor(
internal val uiState: StateFlow<MobileWalletSetupFinishedUM>
field = MutableStateFlow(
MobileWalletSetupFinishedUM(
onContinueClick = params.callbacks::onContinueClick,
onFinishClick = params.callbacks::onFinishClick,
),
)
}

View file

@ -1,5 +1,5 @@
package com.tangem.features.hotwallet.setupfinished.entity
internal data class MobileWalletSetupFinishedUM(
val onContinueClick: () -> Unit,
val onFinishClick: () -> Unit,
)

View file

@ -70,7 +70,7 @@ internal fun MobileWalletSetupFinishedContent(state: MobileWalletSetupFinishedUM
top = 12.dp,
end = 48.dp,
),
text = stringResourceSafe(R.string.backup_complete_description),
text = stringResourceSafe(R.string.onboarding_done_wallet),
style = TangemTheme.typography.body1,
color = TangemTheme.colors.text.secondary,
textAlign = TextAlign.Center,
@ -78,10 +78,10 @@ internal fun MobileWalletSetupFinishedContent(state: MobileWalletSetupFinishedUM
Spacer(modifier = Modifier.weight(2f))
PrimaryButton(
modifier = Modifier.fillMaxWidth(),
text = stringResourceSafe(R.string.common_continue),
text = stringResourceSafe(R.string.common_finish),
showProgress = false,
enabled = true,
onClick = state.onContinueClick,
onClick = state.onFinishClick,
)
}
@ -112,7 +112,7 @@ private fun PreviewMobileWalletSetupFinishedContent() {
TangemThemePreview {
MobileWalletSetupFinishedContent(
state = MobileWalletSetupFinishedUM(
onContinueClick = {},
onFinishClick = {},
),
)
}

View file

@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.arkivanov.decompose.extensions.compose.stack.Children
import com.arkivanov.decompose.extensions.compose.stack.animation.slide
@ -31,11 +32,19 @@ internal fun SetAccessCodeContent(
.imePadding()
.systemBarsPadding(),
) {
TangemTopAppBar(
modifier = Modifier,
title = stringResourceSafe(R.string.access_code_navtitle),
startButton = TopAppBarButtonUM.Back(onBackClick),
)
if (stackState.active.configuration is UpdateAccessCodeRoute.SetupFinished) {
TangemTopAppBar(
modifier = Modifier,
title = stringResourceSafe(R.string.access_code_navtitle),
titleAlignment = Alignment.CenterHorizontally,
)
} else {
TangemTopAppBar(
modifier = Modifier,
title = stringResourceSafe(R.string.access_code_navtitle),
startButton = TopAppBarButtonUM.Back(onBackClick),
)
}
Children(
stack = stackState,
animation = stackAnimation(slide()),

View file

@ -11,6 +11,7 @@ import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.features.hotwallet.UpdateAccessCodeComponent
import com.tangem.features.hotwallet.updateaccesscode.routing.UpdateAccessCodeRoute
import com.tangem.features.hotwallet.accesscode.AccessCodeComponent
import com.tangem.features.hotwallet.setupfinished.MobileWalletSetupFinishedComponent
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
import javax.inject.Inject
@ -27,11 +28,13 @@ internal class UpdateAccessCodeModel @Inject constructor(
val stackNavigation = StackNavigation<UpdateAccessCodeRoute>()
val startRoute: UpdateAccessCodeRoute = UpdateAccessCodeRoute.SetAccessCode(params.userWalletId)
val currentRoute: MutableStateFlow<UpdateAccessCodeRoute> = MutableStateFlow(startRoute)
val mobileWalletSetupFinishedComponentModelCallbacks = MobileWalletSetupFinishedComponentModelCallbacks()
fun onChildBack() {
when (currentRoute.value) {
is UpdateAccessCodeRoute.SetAccessCode -> router.pop()
is UpdateAccessCodeRoute.ConfirmAccessCode -> stackNavigation.pop()
is UpdateAccessCodeRoute.SetupFinished -> Unit
}
}
@ -40,6 +43,16 @@ internal class UpdateAccessCodeModel @Inject constructor(
}
override fun onAccessCodeUpdated(userWalletId: UserWalletId) {
router.pop()
if (params.isFirstSetup) {
stackNavigation.push(UpdateAccessCodeRoute.SetupFinished)
} else {
router.pop()
}
}
inner class MobileWalletSetupFinishedComponentModelCallbacks : MobileWalletSetupFinishedComponent.ModelCallbacks {
override fun onFinishClick() {
router.pop()
}
}
}

View file

@ -4,6 +4,7 @@ import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.core.ui.decompose.ComposableContentComponent
import com.tangem.features.hotwallet.updateaccesscode.UpdateAccessCodeModel
import com.tangem.features.hotwallet.accesscode.AccessCodeComponent
import com.tangem.features.hotwallet.setupfinished.MobileWalletSetupFinishedComponent
import javax.inject.Inject
internal class UpdateAccessCodeChildFactory @Inject constructor(
@ -31,6 +32,12 @@ internal class UpdateAccessCodeChildFactory @Inject constructor(
callbacks = model,
),
)
is UpdateAccessCodeRoute.SetupFinished -> MobileWalletSetupFinishedComponent(
context = childContext,
params = MobileWalletSetupFinishedComponent.Params(
callbacks = model.mobileWalletSetupFinishedComponentModelCallbacks,
),
)
}
}
}

View file

@ -16,4 +16,7 @@ internal sealed class UpdateAccessCodeRoute : Route {
val userWalletId: UserWalletId,
val accessCode: String,
) : UpdateAccessCodeRoute()
@Serializable
data object SetupFinished : UpdateAccessCodeRoute()
}

View file

@ -176,7 +176,7 @@ internal class WalletActivationModel @Inject constructor(
}
inner class MobileWalletSetupFinishedModelCallbacks : MobileWalletSetupFinishedComponent.ModelCallbacks {
override fun onContinueClick() {
override fun onFinishClick() {
router.pop()
}
}

View file

@ -361,8 +361,13 @@ internal class WalletSettingsModel @Inject constructor(
if (!state.value.isWalletBackedUp) {
showMakeBackupAtFirstAlertBS(isUpgradeFlow = false)
} else {
unlockWalletIfNeedAndProceed {
router.push(AppRoute.UpdateAccessCode(params.userWalletId))
unlockWalletIfNeedAndProceed { authorizationRequired ->
router.push(
route = AppRoute.UpdateAccessCode(
userWalletId = params.userWalletId,
isFirstSetup = !authorizationRequired,
),
)
}
}
}
@ -409,14 +414,14 @@ internal class WalletSettingsModel @Inject constructor(
messageSender.send(message)
}
private fun unlockWalletIfNeedAndProceed(action: () -> Unit) {
private fun unlockWalletIfNeedAndProceed(action: (authorizationRequired: Boolean) -> Unit) {
val userWallet = getUserWalletUseCase(params.userWalletId)
.getOrElse { error("User wallet with id ${params.userWalletId} not found") }
if (userWallet is UserWallet.Hot) {
val hotWalletId = userWallet.hotWalletId
when (hotWalletId.authType) {
HotWalletId.AuthType.NoPassword -> {
action()
action(false)
}
HotWalletId.AuthType.Password,
HotWalletId.AuthType.Biometry,
@ -426,7 +431,7 @@ internal class WalletSettingsModel @Inject constructor(
Timber.e(it, "Unable to unlock wallet with id ${params.userWalletId}")
}
.onRight {
action()
action(true)
}
}
}