diff --git a/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt b/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt index 492ca42a8b..ad66a52dce 100644 --- a/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt +++ b/app/src/main/java/com/tangem/tap/routing/ProxyAppRouter.kt @@ -40,6 +40,12 @@ internal class ProxyAppRouter( } } + override fun replaceCurrent(route: AppRoute, onComplete: (Boolean) -> Unit) { + safeNavigate(onComplete, message = "Replace a current route with $route") { + innerRouter.replaceCurrent(route, onComplete) + } + } + override fun replaceAll(vararg routes: AppRoute, onComplete: (isSuccess: Boolean) -> Unit) { safeNavigate(onComplete, message = "Replace all routes with $routes") { runCatching { diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index a4c618527d..791434d17b 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -562,6 +562,7 @@ internal class ChildFactory @Inject constructor( params = CreateWalletBackupComponent.Params( userWalletId = route.userWalletId, isUpgradeFlow = route.isUpgradeFlow, + setAccessCode = route.setAccessCode, ), componentFactory = createWalletBackupComponentFactory, ) diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index 009e76a239..95aab2d822 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -364,7 +364,8 @@ sealed class AppRoute(val path: String) : Route { @Serializable data class CreateWalletBackup( val userWalletId: UserWalletId, - val isUpgradeFlow: Boolean, + val isUpgradeFlow: Boolean = false, + val setAccessCode: Boolean = false, ) : AppRoute(path = "/create_wallet_backup/${userWalletId.stringValue}") @Serializable diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRouter.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRouter.kt index 9f8d5f4111..1f03d452d1 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRouter.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRouter.kt @@ -30,6 +30,19 @@ interface AppRouter { }, ) + /** + * Replaces a current route with a new one. + * + * @param route The route to replace a current one. + * @param onComplete The callback to be invoked when the operation is complete. + */ + fun replaceCurrent( + route: AppRoute, + onComplete: (isSuccess: Boolean) -> Unit = { isSuccess -> + defaultCompletionHandler(isSuccess, errorMessage = "Unable to replace a current route with $route") + }, + ) + /** * Replaces ***all*** routes in the navigation stack with the specified [routes]. * diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/utils/RouterProxy.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/utils/RouterProxy.kt index 0761de97a5..cacdcfadba 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/utils/RouterProxy.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/utils/RouterProxy.kt @@ -28,6 +28,12 @@ private class RouterProxy( } } + override fun replaceCurrent(route: Route, onComplete: (Boolean) -> Unit) { + if (route is AppRoute) { + appRouter.replaceCurrent(route, onComplete) + } + } + override fun replaceAll(vararg routes: Route, onComplete: (isSuccess: Boolean) -> Unit) { routes.filterIsInstance().let { appRouter.replaceAll(*it.toTypedArray(), onComplete = onComplete) diff --git a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DefaultRouter.kt b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DefaultRouter.kt index ed5cb7be3f..20947a1913 100644 --- a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DefaultRouter.kt +++ b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DefaultRouter.kt @@ -1,9 +1,9 @@ package com.tangem.core.decompose.navigation -import com.arkivanov.decompose.ExperimentalDecomposeApi import com.arkivanov.decompose.router.stack.StackNavigation import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.router.stack.pushNew +import com.arkivanov.decompose.router.stack.replaceCurrent import com.arkivanov.essenty.instancekeeper.InstanceKeeper import kotlin.reflect.KClass @@ -14,11 +14,14 @@ internal class DefaultRouter( private val navigation: StackNavigation get() = navigationProvider.getOrCreate() - @OptIn(ExperimentalDecomposeApi::class) override fun push(route: Route, onComplete: (isSuccess: Boolean) -> Unit) { navigation.pushNew(route, onComplete) } + override fun replaceCurrent(route: Route, onComplete: (Boolean) -> Unit) { + navigation.replaceCurrent(route, { onComplete(true) }) + } + override fun replaceAll(vararg routes: Route, onComplete: (isSuccess: Boolean) -> Unit) { val newRoutes = routes.toList() diff --git a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DummyRouter.kt b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DummyRouter.kt index 77e7a8f59d..b08ad9b3b5 100644 --- a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DummyRouter.kt +++ b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/DummyRouter.kt @@ -8,6 +8,10 @@ class DummyRouter : Router { onComplete(true) } + override fun replaceCurrent(route: Route, onComplete: (Boolean) -> Unit) { + onComplete(true) + } + override fun replaceAll(vararg routes: Route, onComplete: (isSuccess: Boolean) -> Unit) { onComplete(true) } diff --git a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/Router.kt b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/Router.kt index da7f859b8f..4fe5c05082 100644 --- a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/Router.kt +++ b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/Router.kt @@ -16,6 +16,14 @@ interface Router { */ fun push(route: Route, onComplete: (isSuccess: Boolean) -> Unit = {}) + /** + * Replaces a current route with a new one. + * + * @param route The route to replace a current one. + * @param onComplete The callback to be invoked when the operation is complete. + */ + fun replaceCurrent(route: Route, onComplete: (isSuccess: Boolean) -> Unit = {}) + /** * Replaces ***all*** routes in the navigation stack with the specified [routes]. * diff --git a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerPopRouter.kt b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerPopRouter.kt index 12242d09b7..310910ddc0 100644 --- a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerPopRouter.kt +++ b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerPopRouter.kt @@ -18,6 +18,10 @@ inline fun AppComponentContext.InnerPopRouter( router.push(route, onComplete) } + override fun replaceCurrent(route: Route, onComplete: (Boolean) -> Unit) { + router.replaceCurrent(route, onComplete) + } + override fun replaceAll(vararg routes: Route, onComplete: (Boolean) -> Unit) { router.replaceAll(*routes, onComplete = onComplete) } diff --git a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerRouter.kt b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerRouter.kt index 788afecd42..d187947ff5 100644 --- a/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerRouter.kt +++ b/core/decompose/src/main/kotlin/com/tangem/core/decompose/navigation/inner/InnerRouter.kt @@ -3,6 +3,7 @@ package com.tangem.core.decompose.navigation.inner import com.arkivanov.decompose.router.stack.StackNavigation import com.arkivanov.decompose.router.stack.pop import com.arkivanov.decompose.router.stack.pushNew +import com.arkivanov.decompose.router.stack.replaceCurrent import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.navigation.Route import com.tangem.core.decompose.navigation.Router @@ -32,6 +33,14 @@ inline fun AppComponentContext.InnerRouter( } } + override fun replaceCurrent(route: Route, onComplete: (Boolean) -> Unit) { + if (route is T) { + stackNavigation.replaceCurrent(route, { onComplete(true) }) + } else { + fallBackRouter.replaceCurrent(route, onComplete) + } + } + override fun replaceAll(vararg routes: Route, onComplete: (Boolean) -> Unit) { if (routes.any { it is T }) { val newRoutes = routes.toList().filterIsInstance() diff --git a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt index 4c21e1dfd8..c8de6fdca5 100644 --- a/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt +++ b/features/hot-wallet/api/src/main/kotlin/com/tangem/features/hotwallet/CreateWalletBackupComponent.kt @@ -9,6 +9,7 @@ interface CreateWalletBackupComponent : ComposableContentComponent { data class Params( val userWalletId: UserWalletId, val isUpgradeFlow: Boolean, + val setAccessCode: Boolean, ) interface Factory : ComponentFactory diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt index 54458af212..727dc3b81a 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/createwalletbackup/CreateWalletBackupModel.kt @@ -71,7 +71,11 @@ internal class CreateWalletBackupModel @Inject constructor( } fun onManualBackupCompleted() { - router.pop() + if (params.setAccessCode) { + router.replaceCurrent(AppRoute.UpdateAccessCode(userWalletId = params.userWalletId)) + } else { + router.pop() + } } inner class ManualBackupStartModelCallbacks : ManualBackupStartComponent.ModelCallbacks { diff --git a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt index 5b5c884ea0..5af5ba9913 100644 --- a/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt +++ b/features/hot-wallet/impl/src/main/kotlin/com/tangem/features/hotwallet/walletbackup/model/WalletBackupModel.kt @@ -128,7 +128,6 @@ internal class WalletBackupModel @Inject constructor( router.push( AppRoute.CreateWalletBackup( userWalletId = params.userWalletId, - isUpgradeFlow = false, ), ) } diff --git a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt index cec439982b..830597bcaf 100644 --- a/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt +++ b/features/wallet-settings/impl/src/main/kotlin/com/tangem/feature/walletsettings/model/WalletSettingsModel.kt @@ -525,7 +525,6 @@ internal class WalletSettingsModel @Inject constructor( router.push( AppRoute.CreateWalletBackup( userWalletId = userWallet.walletId, - isUpgradeFlow = false, ), ) closeBs() diff --git a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRouter.kt b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRouter.kt index cf545cf82d..d46d895ded 100644 --- a/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRouter.kt +++ b/features/walletconnect/impl/src/main/kotlin/com/tangem/features/walletconnect/connections/routing/WcRouter.kt @@ -17,6 +17,10 @@ internal class WcRouter( onComplete(isComplete) } + override fun replaceCurrent(route: Route, onComplete: (Boolean) -> Unit) { + /** Not allowed */ + } + override fun replaceAll(vararg routes: Route, onComplete: (Boolean) -> Unit) { /** Not allowed */ }