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 74c7fa09ce..c1fc30f253 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 @@ -303,12 +303,13 @@ internal class DefaultSendComponent @AssistedInject constructor( val isEmptyStack = childStack.value.backStack.isEmpty() val isSuccess = model.uiState.value.confirmUM is ConfirmUM.Success val isStubComponent = childStack.value.active.instance is StubComponent + val isSendingInProgress = (model.uiState.value.confirmUM as? ConfirmUM.Content)?.isSending == true val isPopSend = isEmptyRoute || isEmptyStack || isSuccess || isStubComponent - if (isPopSend) { - router.pop() - } else { - stackNavigation.pop() + when { + isSendingInProgress -> Unit // Do not anything while transaction sending in progress + isPopSend -> router.pop() + else -> stackNavigation.pop() } } 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 2a66af2d55..f12e8292a3 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 @@ -215,11 +215,13 @@ internal class DefaultNFTSendComponent @AssistedInject constructor( val isEmptyRoute = childStack.value.active.configuration == CommonSendRoute.Empty val isEmptyStack = childStack.value.backStack.isEmpty() val isSuccess = model.uiState.value.confirmUM is ConfirmUM.Success + val isSendingInProgress = (model.uiState.value.confirmUM as? ConfirmUM.Content)?.isSending == true - if (isEmptyRoute || isEmptyStack || isSuccess) { - router.pop() - } else { - stackNavigation.pop() + val isPopSend = isEmptyRoute || isEmptyStack || isSuccess + when { + isSendingInProgress -> Unit // Do not anything while transaction sending in progress + isPopSend -> router.pop() + else -> stackNavigation.pop() } } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt index b59ca862d9..df40299e1b 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/DefaultSendWithSwapComponent.kt @@ -31,6 +31,7 @@ import com.tangem.features.swap.v2.impl.amount.SwapAmountComponent import com.tangem.features.swap.v2.impl.amount.SwapAmountComponentParams import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountUM import com.tangem.features.swap.v2.impl.common.SwapUtils.SEND_WITH_SWAP_PROVIDER_TYPES +import com.tangem.features.swap.v2.impl.common.entity.ConfirmUM import com.tangem.features.swap.v2.impl.sendviaswap.confirm.SendWithSwapConfirmComponent import com.tangem.features.swap.v2.impl.sendviaswap.model.SendWithSwapModel import com.tangem.features.swap.v2.impl.sendviaswap.success.SendWithSwapSuccessComponent @@ -202,11 +203,15 @@ internal class DefaultSendWithSwapComponent @AssistedInject constructor( private fun onChildBack() { val isEmptyStack = childStack.value.backStack.isEmpty() + val isSuccess = model.uiState.value.confirmUM is ConfirmUM.Success + val isSendingInProgress = (model.uiState.value.confirmUM as? ConfirmUM.Content)?.isTransactionInProcess == true - if (isEmptyStack) { - router.pop() - } else { - stackNavigation.pop() + val isPopSend = isEmptyStack || isSuccess + + when { + isSendingInProgress -> Unit // Do not anything while transaction sending in progress + isPopSend -> router.pop() + else -> stackNavigation.pop() } } diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt index e480cd76c5..13b3ec8c25 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/SendWithSwapConfirmModel.kt @@ -52,6 +52,8 @@ import com.tangem.features.swap.v2.impl.sendviaswap.SendWithSwapRoute import com.tangem.features.swap.v2.impl.sendviaswap.analytics.SendWithSwapAnalyticEvents import com.tangem.features.swap.v2.impl.sendviaswap.confirm.SendWithSwapConfirmComponent import com.tangem.features.swap.v2.impl.sendviaswap.confirm.model.transformers.SendWithSwapConfirmInitialStateTransformer +import com.tangem.features.swap.v2.impl.sendviaswap.confirm.model.transformers.SendWithSwapConfirmSendingStateTransformer +import com.tangem.features.swap.v2.impl.sendviaswap.confirm.model.transformers.SendWithSwapConfirmSentStateTransformer import com.tangem.features.swap.v2.impl.sendviaswap.confirm.model.transformers.SendWithSwapConfirmationNotificationsTransformer import com.tangem.features.swap.v2.impl.sendviaswap.entity.SendWithSwapUM import com.tangem.lib.crypto.BlockchainFeeUtils.patchTransactionFeeForSwap @@ -241,10 +243,12 @@ internal class SendWithSwapConfirmModel @Inject constructor( private fun onSendClick() { val provider = confirmData.quote?.provider ?: return modelScope.launch { + uiState.transformerUpdate(SendWithSwapConfirmSendingStateTransformer(true)) swapTransactionSender.sendTransaction( confirmData = confirmData, isAmountSubtractAvailable = isAmountSubtractAvailable, onExpressError = { expressError -> + uiState.transformerUpdate(SendWithSwapConfirmSendingStateTransformer(false)) swapAlertFactory.getGenericErrorState( expressError = expressError, onFailedTxEmailClick = { @@ -261,6 +265,7 @@ internal class SendWithSwapConfirmModel @Inject constructor( ) }, onSendError = { error -> + uiState.transformerUpdate(SendWithSwapConfirmSendingStateTransformer(false)) swapAlertFactory.getSendTransactionErrorState( error = error, onFailedTxEmailClick = { @@ -282,17 +287,14 @@ internal class SendWithSwapConfirmModel @Inject constructor( networkId = primaryCurrencyStatus.currency.network.id, ).getOrNull().orEmpty() sendSuccessAnalytics() - uiState.update { - it.copy( - confirmUM = ConfirmUM.Success( - isPrimaryButtonEnabled = true, - transactionDate = timestamp, - txUrl = txUrl, - provider = provider, - swapDataModel = data, - ), - ) - } + uiState.transformerUpdate( + SendWithSwapConfirmSentStateTransformer( + timestamp = timestamp, + txUrl = txUrl, + provider = provider, + swapDataModel = data, + ), + ) router.replaceAll(SendWithSwapRoute.Success) }, expressOperationType = ExpressOperationType.SEND_WITH_SWAP, @@ -428,7 +430,15 @@ internal class SendWithSwapConfirmModel @Inject constructor( backIconRes = R.drawable.ic_back_24, backIconClick = router::pop, primaryButton = NavigationButton( - textReference = resourceReference(R.string.common_send), + textReference = when (confirmUM) { + is ConfirmUM.Success -> resourceReference(R.string.common_close) + is ConfirmUM.Content -> if (confirmUM.isTransactionInProcess) { + resourceReference(R.string.send_sending) + } else { + resourceReference(R.string.common_send) + } + else -> resourceReference(R.string.common_send) + }, iconRes = R.drawable.ic_tangem_24, isIconVisible = isReadyToSend, isHapticClick = isReadyToSend, diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/transformers/SendWithSwapConfirmSendingStateTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/transformers/SendWithSwapConfirmSendingStateTransformer.kt new file mode 100644 index 0000000000..2fc1f54df8 --- /dev/null +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/transformers/SendWithSwapConfirmSendingStateTransformer.kt @@ -0,0 +1,19 @@ +package com.tangem.features.swap.v2.impl.sendviaswap.confirm.model.transformers + +import com.tangem.features.swap.v2.impl.common.entity.ConfirmUM +import com.tangem.features.swap.v2.impl.sendviaswap.entity.SendWithSwapUM +import com.tangem.utils.transformer.Transformer + +internal class SendWithSwapConfirmSendingStateTransformer( + private val isTransactionInProcess: Boolean, +) : Transformer { + override fun transform(prevState: SendWithSwapUM): SendWithSwapUM { + val confirmUM = prevState.confirmUM as? ConfirmUM.Content ?: return prevState + return prevState.copy( + confirmUM = confirmUM.copy( + isPrimaryButtonEnabled = !isTransactionInProcess, + isTransactionInProcess = isTransactionInProcess, + ), + ) + } +} \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/transformers/SendWithSwapConfirmSentStateTransformer.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/transformers/SendWithSwapConfirmSentStateTransformer.kt new file mode 100644 index 0000000000..970c3f1f93 --- /dev/null +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/confirm/model/transformers/SendWithSwapConfirmSentStateTransformer.kt @@ -0,0 +1,26 @@ +package com.tangem.features.swap.v2.impl.sendviaswap.confirm.model.transformers + +import com.tangem.domain.express.models.ExpressProvider +import com.tangem.domain.swap.models.SwapDataModel +import com.tangem.features.swap.v2.impl.common.entity.ConfirmUM +import com.tangem.features.swap.v2.impl.sendviaswap.entity.SendWithSwapUM +import com.tangem.utils.transformer.Transformer + +internal class SendWithSwapConfirmSentStateTransformer( + private val txUrl: String, + private val timestamp: Long, + private val provider: ExpressProvider, + private val swapDataModel: SwapDataModel, +) : Transformer { + override fun transform(prevState: SendWithSwapUM): SendWithSwapUM { + return prevState.copy( + confirmUM = ConfirmUM.Success( + isPrimaryButtonEnabled = true, + transactionDate = timestamp, + txUrl = txUrl, + provider = provider, + swapDataModel = swapDataModel, + ), + ) + } +} \ No newline at end of file