From 42b90de54daab00b8c95a997ae7d21ed3cea38bc Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 12 May 2025 18:48:43 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../send/v2/common/CommonSendRoute.kt | 2 +- .../send/v2/common/utils/SendRouteUtils.kt | 28 +++++++++ .../send/v2/send/DefaultSendComponent.kt | 59 ++++++++++--------- .../v2/sendnft/DefaultNFTSendComponent.kt | 48 ++++++++------- 4 files changed, 87 insertions(+), 50 deletions(-) create mode 100644 features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/utils/SendRouteUtils.kt diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/CommonSendRoute.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/CommonSendRoute.kt index 7493c4d073..e0889d71a4 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/CommonSendRoute.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/CommonSendRoute.kt @@ -14,7 +14,7 @@ internal sealed class CommonSendRoute : Route { @Serializable data object Confirm : CommonSendRoute() { - override val isEditMode: Boolean = false + override val isEditMode: Boolean = true } @Serializable diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/utils/SendRouteUtils.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/utils/SendRouteUtils.kt new file mode 100644 index 0000000000..eba835865e --- /dev/null +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/common/utils/SendRouteUtils.kt @@ -0,0 +1,28 @@ +package com.tangem.features.send.v2.common.utils + +import com.arkivanov.decompose.router.stack.ChildStack +import com.arkivanov.decompose.value.Value +import com.tangem.core.decompose.navigation.Router +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.send.v2.common.CommonSendRoute + +/** + * Workaround to try fix duplicate route crash + */ +internal fun Router.safeNextClick( + currentRoute: CommonSendRoute, + nextRoute: CommonSendRoute, + childStack: Value>, + popBack: () -> Unit, +) { + if (currentRoute.isEditMode) { + popBack() + } else { + val isAlreadyInStack = childStack.value.items.any { it.configuration == nextRoute } + if (isAlreadyInStack) { + popTo(nextRoute) + } else { + push(nextRoute) + } + } +} \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/DefaultSendComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/DefaultSendComponent.kt index 895ac9ac94..3f2eba602f 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/DefaultSendComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/DefaultSendComponent.kt @@ -26,6 +26,7 @@ import com.tangem.features.send.v2.common.analytics.CommonSendAnalyticEvents import com.tangem.features.send.v2.common.analytics.CommonSendAnalyticEvents.SendScreenSource import com.tangem.features.send.v2.common.ui.SendContent import com.tangem.features.send.v2.common.ui.state.ConfirmUM +import com.tangem.features.send.v2.common.utils.safeNextClick import com.tangem.features.send.v2.impl.R import com.tangem.features.send.v2.send.confirm.SendConfirmComponent import com.tangem.features.send.v2.send.model.SendModel @@ -139,28 +140,31 @@ internal class DefaultSendComponent @AssistedInject constructor( CommonSendRoute.Confirm -> getConfirmComponent(factoryContext) } - private fun getDestinationComponent(factoryContext: AppComponentContext, route: CommonSendRoute) = - SendDestinationComponent( - appComponentContext = factoryContext, - params = SendDestinationComponentParams.DestinationParams( - state = model.uiState.value.destinationUM, - currentRoute = currentRoute.filterIsInstance(), - isBalanceHidingFlow = model.isBalanceHiddenFlow, - analyticsCategoryName = analyticCategoryName, - title = resourceReference(R.string.send_recipient_label), - userWalletId = params.userWalletId, - cryptoCurrency = params.currency, - callback = model, - onBackClick = ::onChildBack, - onNextClick = { - if (route.isEditMode) { - onChildBack() - } else { - innerRouter.push(CommonSendRoute.Amount(isEditMode = false)) - } - }, - ), - ) + private fun getDestinationComponent( + factoryContext: AppComponentContext, + route: CommonSendRoute, + ): SendDestinationComponent = SendDestinationComponent( + appComponentContext = factoryContext, + params = SendDestinationComponentParams.DestinationParams( + state = model.uiState.value.destinationUM, + currentRoute = currentRoute.filterIsInstance(), + isBalanceHidingFlow = model.isBalanceHiddenFlow, + analyticsCategoryName = analyticCategoryName, + title = resourceReference(R.string.send_recipient_label), + userWalletId = params.userWalletId, + cryptoCurrency = params.currency, + callback = model, + onBackClick = ::onChildBack, + onNextClick = { + innerRouter.safeNextClick( + currentRoute = route, + nextRoute = CommonSendRoute.Amount(isEditMode = false), + popBack = ::onChildBack, + childStack = childStack, + ) + }, + ), + ) private fun getAmountComponent( factoryContext: AppComponentContext, @@ -196,11 +200,12 @@ internal class DefaultSendComponent @AssistedInject constructor( } }, onNextClick = { - if (route.isEditMode) { - onChildBack() - } else { - innerRouter.push(CommonSendRoute.Confirm) - } + innerRouter.safeNextClick( + currentRoute = route, + nextRoute = CommonSendRoute.Confirm, + popBack = ::onChildBack, + childStack = childStack, + ) }, ), ) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt index 7fc4f402c2..49bcae92d6 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/sendnft/DefaultNFTSendComponent.kt @@ -24,6 +24,7 @@ import com.tangem.features.send.v2.common.CommonSendRoute import com.tangem.features.send.v2.common.analytics.CommonSendAnalyticEvents import com.tangem.features.send.v2.common.ui.SendContent import com.tangem.features.send.v2.common.ui.state.ConfirmUM +import com.tangem.features.send.v2.common.utils.safeNextClick import com.tangem.features.send.v2.impl.R import com.tangem.features.send.v2.sendnft.confirm.NFTSendConfirmComponent import com.tangem.features.send.v2.sendnft.model.NFTSendModel @@ -126,28 +127,31 @@ internal class DefaultNFTSendComponent @AssistedInject constructor( else -> getStubComponent() } - private fun getDestinationComponent(factoryContext: AppComponentContext, route: CommonSendRoute) = - SendDestinationComponent( - appComponentContext = factoryContext, - params = SendDestinationComponentParams.DestinationParams( - state = model.uiState.value.destinationUM, - currentRoute = currentRouteFlow.filterIsInstance(), - isBalanceHidingFlow = model.isBalanceHiddenFlow, - title = resourceReference(R.string.nft_send), - analyticsCategoryName = analyticsCategoryName, - userWalletId = params.userWalletId, - cryptoCurrency = model.cryptoCurrency, - callback = model, - onBackClick = ::onChildBack, - onNextClick = { - if (route.isEditMode) { - onChildBack() - } else { - innerRouter.push(CommonSendRoute.Confirm) - } - }, - ), - ) + private fun getDestinationComponent( + factoryContext: AppComponentContext, + route: CommonSendRoute, + ): SendDestinationComponent = SendDestinationComponent( + appComponentContext = factoryContext, + params = SendDestinationComponentParams.DestinationParams( + state = model.uiState.value.destinationUM, + currentRoute = currentRouteFlow.filterIsInstance(), + isBalanceHidingFlow = model.isBalanceHiddenFlow, + title = resourceReference(R.string.nft_send), + analyticsCategoryName = analyticsCategoryName, + userWalletId = params.userWalletId, + cryptoCurrency = model.cryptoCurrency, + callback = model, + onBackClick = ::onChildBack, + onNextClick = { + innerRouter.safeNextClick( + currentRoute = route, + nextRoute = CommonSendRoute.Confirm, + popBack = ::onChildBack, + childStack = childStack, + ) + }, + ), + ) private fun getFeeComponent(factoryContext: AppComponentContext): ComposableContentComponent { val state = model.uiState.value