From 485430f6f4e13edf8bade98845674adf42e2183e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 25 Jul 2025 15:23:03 +0500 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/routing/utils/ChildFactory.kt | 1 + .../com/tangem/common/routing/AppRoute.kt | 1 + .../component/ChooseManagedTokensComponent.kt | 1 + .../DefaultChooseManagedTokensComponent.kt | 7 ++- .../ChooseManageTokensBottomSheetConfig.kt | 1 + .../model/ChooseManagedTokensModel.kt | 1 + .../entrypoint/model/SendEntryPointModel.kt | 1 + .../features/send/v2/send/model/SendModel.kt | 17 ++++++ .../amount/SendAmountComponent.kt | 1 + .../amount/model/SendAmountAlertFactory.kt | 37 +++++++++++++ .../amount/model/SendAmountModel.kt | 21 ++++++-- .../SwapChooseTokenNetworkComponent.kt | 1 + .../SwapChooseTokenNetworkTrigger.kt | 12 +++-- .../v2/impl/amount/SwapAmountComponent.kt | 1 + .../amount/model/SwapAmountAlertFactory.kt | 26 ++++++++++ .../v2/impl/amount/model/SwapAmountModel.kt | 49 ++++++++++++----- .../DefaultSwapChooseTokenNetworkTrigger.kt | 19 +++++-- .../model/SwapChooseTokenAlertFactory.kt | 52 +++++++++++++++++++ .../model/SwapChooseTokenNetworkModel.kt | 35 +++++++------ .../sendviaswap/model/SendWithSwapModel.kt | 20 +++++-- 20 files changed, 259 insertions(+), 45 deletions(-) create mode 100644 features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountAlertFactory.kt create mode 100644 features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenAlertFactory.kt 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 e28474943c..894658edf5 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 @@ -431,6 +431,7 @@ internal class ChildFactory @Inject constructor( params = ChooseManagedTokensComponent.Params( userWalletId = route.userWalletId, initialCurrency = route.initialCurrency, + selectedCurrency = route.selectedCurrency, source = ChooseManagedTokensComponent.Source.valueOf(route.source.name), ), componentFactory = chooseManagedTokensComponentFactory, 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 4f2fdceec3..77a7b1f113 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 @@ -126,6 +126,7 @@ sealed class AppRoute(val path: String) : Route { data class ChooseManagedTokens( val userWalletId: UserWalletId, val initialCurrency: CryptoCurrency, + val selectedCurrency: CryptoCurrency?, val source: Source, ) : AppRoute(path = "/$source/choose_managed_tokens/$userWalletId/${initialCurrency.id.value}") { enum class Source { diff --git a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/component/ChooseManagedTokensComponent.kt b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/component/ChooseManagedTokensComponent.kt index 3c6268d8b9..a12efc7654 100644 --- a/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/component/ChooseManagedTokensComponent.kt +++ b/features/manage-tokens/api/src/main/kotlin/com/tangem/features/managetokens/component/ChooseManagedTokensComponent.kt @@ -10,6 +10,7 @@ interface ChooseManagedTokensComponent : ComposableContentComponent { data class Params( val userWalletId: UserWalletId, val initialCurrency: CryptoCurrency, + val selectedCurrency: CryptoCurrency?, val source: Source, ) diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/DefaultChooseManagedTokensComponent.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/DefaultChooseManagedTokensComponent.kt index 0480397472..8e71b560bf 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/DefaultChooseManagedTokensComponent.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/DefaultChooseManagedTokensComponent.kt @@ -60,11 +60,16 @@ internal class DefaultChooseManagedTokensComponent @AssistedInject constructor( params = SwapChooseTokenNetworkComponent.Params( userWalletId = config.userWalletId, initialCurrency = config.initialCurrency, + selectedCurrency = config.selectedCurrency, token = config.token, onDismiss = model.bottomSheetNavigation::dismiss, onResult = { swapCurrencies, cryptoCurrency -> componentScope.launch { - swapChooseTokenNetworkTrigger.trigger(swapCurrencies, cryptoCurrency) + swapChooseTokenNetworkTrigger.trigger( + swapCurrencies = swapCurrencies, + cryptoCurrency = cryptoCurrency, + shouldResetNavigation = params.selectedCurrency != null, + ) router.pop() } }, diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/entity/ChooseManageTokensBottomSheetConfig.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/entity/ChooseManageTokensBottomSheetConfig.kt index 53adb4a66f..77ee44682a 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/entity/ChooseManageTokensBottomSheetConfig.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/entity/ChooseManageTokensBottomSheetConfig.kt @@ -12,6 +12,7 @@ internal sealed class ChooseManageTokensBottomSheetConfig { data class SwapTokensBottomSheetConfig( val userWalletId: UserWalletId, val initialCurrency: CryptoCurrency, + val selectedCurrency: CryptoCurrency?, val token: ManagedCryptoCurrency.Token, ) : ChooseManageTokensBottomSheetConfig() } \ No newline at end of file diff --git a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt index ad0f6fe8f2..83d65cc3a8 100644 --- a/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt +++ b/features/manage-tokens/impl/src/main/kotlin/com/tangem/features/managetokens/choosetoken/model/ChooseManagedTokensModel.kt @@ -55,6 +55,7 @@ internal class ChooseManagedTokensModel @Inject constructor( ChooseManageTokensBottomSheetConfig.SwapTokensBottomSheetConfig( userWalletId = params.userWalletId, initialCurrency = params.initialCurrency, + selectedCurrency = params.selectedCurrency, token = token, ), ) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt index 9e284bbd4f..2f52fcdd3e 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/entrypoint/model/SendEntryPointModel.kt @@ -40,6 +40,7 @@ internal class SendEntryPointModel @Inject constructor( AppRoute.ChooseManagedTokens( userWalletId = params.userWalletId, initialCurrency = params.cryptoCurrency, + selectedCurrency = null, source = AppRoute.ChooseManagedTokens.Source.SendViaSwap, ), ) diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt index b8d9cbdf1f..333bfe1c2a 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/send/model/SendModel.kt @@ -230,6 +230,23 @@ internal class SendModel @Inject constructor( params.callback?.onConvertToAnotherToken(lastAmount = lastAmount) } + override fun resetSendNavigation() { + uiState.update { + it.copy( + destinationUM = SendDestinationInitialStateTransformer( + cryptoCurrency = cryptoCurrency, + isRedesignEnabled = sendFeatureToggles.isSendRedesignEnabled, + ).transform(DestinationUM.Empty()), + feeUM = FeeUM.Empty(), + feeSelectorUM = FeeSelectorUM.Loading, + confirmUM = ConfirmUM.Empty, + confirmData = null, + navigationUM = NavigationUM.Empty, + ) + } + router.popTo(Amount(isEditMode = false)) + } + override fun onError(error: GetUserWalletError) { Timber.w(error.toString()) showAlertError() diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponent.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponent.kt index 7ec675a483..14068d2093 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponent.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountComponent.kt @@ -41,6 +41,7 @@ internal class SendAmountComponent( interface ModelCallback : NavigationModelCallback { fun onAmountResult(amountUM: AmountState, isResetPredefined: Boolean) fun onConvertToAnotherToken(lastAmount: String) + fun resetSendNavigation() fun onError(error: GetUserWalletError) } } \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountAlertFactory.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountAlertFactory.kt new file mode 100644 index 0000000000..dadd0ea67c --- /dev/null +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountAlertFactory.kt @@ -0,0 +1,37 @@ +package com.tangem.features.send.v2.subcomponents.amount.model + +import com.tangem.core.decompose.di.ModelScoped +import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.message.DialogMessage +import com.tangem.core.ui.message.EventMessageAction +import javax.inject.Inject + +@ModelScoped +internal class SendAmountAlertFactory @Inject constructor( + private val uiMessageSender: UiMessageSender, +) { + + fun showResetSendingAlert(onConfirm: () -> Unit) { + // todo fix localization [REDACTED_TASK_KEY] + uiMessageSender.send( + DialogMessage( + title = stringReference("Confirm Convert"), + message = stringReference("Proceed with conversion? Previous data will be reset."), + firstActionBuilder = { + EventMessageAction( + title = stringReference("Confirm"), + onClick = onConfirm, + ) + }, + secondActionBuilder = { + EventMessageAction( + title = stringReference("Not Now"), + onClick = onDismissRequest, + ) + }, + dismissOnFirstAction = true, + ), + ) + } +} \ No newline at end of file diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt index fc6affca28..addae81ffd 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/model/SendAmountModel.kt @@ -22,11 +22,11 @@ import com.tangem.core.ui.extensions.resourceReference import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.exchange.RampStateManager +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.tokens.GetMinimumTransactionAmountSyncUseCase import com.tangem.domain.tokens.model.CryptoCurrencyStatus import com.tangem.domain.tokens.model.ScenarioUnavailabilityReason -import com.tangem.domain.models.wallet.UserWallet -import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.features.send.v2.api.SendFeatureToggles import com.tangem.features.send.v2.api.entity.PredefinedValues @@ -65,6 +65,7 @@ internal class SendAmountModel @Inject constructor( private val feeSelectorReloadTrigger: FeeSelectorReloadTrigger, private val getUserWalletUseCase: GetUserWalletUseCase, private val rampStateManager: RampStateManager, + private val sendAmountAlertFactory: SendAmountAlertFactory, ) : Model(), SendAmountClickIntents { private val params: SendAmountComponentParams = paramsContainer.require() @@ -242,9 +243,21 @@ internal class SendAmountModel @Inject constructor( } override fun onConvertToAnotherToken() { + val amountParams = params as? SendAmountComponentParams.AmountParams ?: return + if (amountParams.currentRoute.value.isEditMode) { + sendAmountAlertFactory.showResetSendingAlert { + params.callback.resetSendNavigation() + confirmConvertToToken() + } + } else { + confirmConvertToToken() + } + } + + private fun confirmConvertToToken() { + val amountParams = params as? SendAmountComponentParams.AmountParams ?: return val amountFieldData = uiState.value as? AmountState.Data - val amountParams = params as? SendAmountComponentParams.AmountParams - amountParams?.callback?.onConvertToAnotherToken(amountFieldData?.amountTextField?.value.orEmpty()) + amountParams.callback.onConvertToAnotherToken(amountFieldData?.amountTextField?.value.orEmpty()) } private fun subscribeOnAmountReduceToTriggerUpdates() { diff --git a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkComponent.kt b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkComponent.kt index 047c21c44f..15418e847b 100644 --- a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkComponent.kt +++ b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkComponent.kt @@ -12,6 +12,7 @@ interface SwapChooseTokenNetworkComponent : ComposableBottomSheetComponent { data class Params( val userWalletId: UserWalletId, val initialCurrency: CryptoCurrency, + val selectedCurrency: CryptoCurrency?, val token: ManagedCryptoCurrency.Token, val onDismiss: () -> Unit, val onResult: (SwapCurrencies, CryptoCurrency) -> Unit, diff --git a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkTrigger.kt b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkTrigger.kt index 5f9cd14eee..00c103b6c4 100644 --- a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkTrigger.kt +++ b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/choosetoken/SwapChooseTokenNetworkTrigger.kt @@ -9,12 +9,18 @@ import kotlinx.coroutines.flow.SharedFlow */ interface SwapChooseTokenNetworkTrigger { - suspend fun trigger(swapCurrencies: SwapCurrencies, cryptoCurrency: CryptoCurrency) + suspend fun trigger(swapCurrencies: SwapCurrencies, cryptoCurrency: CryptoCurrency, shouldResetNavigation: Boolean) } /** * Listens to swap token selection */ interface SwapChooseTokenNetworkListener { - val swapChooseTokenNetworkResultFlow: SharedFlow> -} \ No newline at end of file + val swapChooseTokenNetworkResultFlow: SharedFlow +} + +data class SwapChooseTokenTriggerData( + val swapCurrencies: SwapCurrencies, + val cryptoCurrency: CryptoCurrency, + val shouldResetNavigation: Boolean, +) \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/SwapAmountComponent.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/SwapAmountComponent.kt index 8105a965b0..18e1ded3b1 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/SwapAmountComponent.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/SwapAmountComponent.kt @@ -39,5 +39,6 @@ internal class SwapAmountComponent @AssistedInject constructor( interface ModelCallback : NavigationModelCallback { fun onAmountResult(amountUM: SwapAmountUM) fun onSeparatorClick(lastAmount: String) + fun resetSendWithSwapNavigation(resetNavigation: Boolean) } } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountAlertFactory.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountAlertFactory.kt index 42d272be56..8b467ba82b 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountAlertFactory.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountAlertFactory.kt @@ -4,6 +4,7 @@ import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender import com.tangem.core.ui.extensions.* import com.tangem.core.ui.message.DialogMessage +import com.tangem.core.ui.message.EventMessageAction import com.tangem.core.ui.utils.parseBigDecimal import com.tangem.domain.express.models.ExpressProvider import com.tangem.domain.express.models.ExpressProviderType @@ -61,4 +62,29 @@ internal class SwapAmountAlertFactory @Inject constructor( ), ) } + + fun showCloseSendWithSwapAlert(onConfirm: () -> Unit) { + // todo fix localization [REDACTED_TASK_KEY] + uiMessageSender.send( + DialogMessage( + title = stringReference("Confirm cancellation"), + message = stringReference( + "Are you sure you want to cancel the conversion? After changing, previous data will be reset.", + ), + firstActionBuilder = { + EventMessageAction( + title = stringReference("Confirm"), + onClick = onConfirm, + ) + }, + secondActionBuilder = { + EventMessageAction( + title = stringReference("Not Now"), + onClick = onDismissRequest, + ) + }, + dismissOnFirstAction = true, + ), + ) + } } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index 3a97328278..5c95d1518e 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt @@ -181,19 +181,40 @@ internal class SwapAmountModel @Inject constructor( } override fun onSelectTokenClick() { - appRouter.push( - AppRoute.ChooseManagedTokens( - userWalletId = userWallet.walletId, - initialCurrency = primaryCryptoCurrency, - source = AppRoute.ChooseManagedTokens.Source.SendViaSwap, - ), - ) + val amountParams = params as? SwapAmountComponentParams.AmountParams ?: return + modelScope.launch { + val isEditMode = amountParams.currentRoute.firstOrNull()?.isEditMode == true + val selectedCurrency = (uiState.value as? SwapAmountUM.Content)?.secondaryCryptoCurrencyStatus?.currency + appRouter.push( + AppRoute.ChooseManagedTokens( + userWalletId = userWallet.walletId, + initialCurrency = primaryCryptoCurrency, + selectedCurrency = selectedCurrency.takeIf { isEditMode }, + source = AppRoute.ChooseManagedTokens.Source.SendViaSwap, + ), + ) + } } override fun onSeparatorClick() { - // todo handle reverse pair click with swap redesign + val amountParams = params as? SwapAmountComponentParams.AmountParams ?: return + + modelScope.launch { + if (amountParams.currentRoute.firstOrNull()?.isEditMode == true) { + swapAmountAlertFactory.showCloseSendWithSwapAlert { + params.callback.resetSendWithSwapNavigation(resetNavigation = true) + confirmSendWithSwapClose() + } + } else { + confirmSendWithSwapClose() + amountParams.callback.onAmountResult(uiState.value) + } + } + } + + private fun confirmSendWithSwapClose() { + val amountParams = params as? SwapAmountComponentParams.AmountParams ?: return val amountFieldData = uiState.value.primaryAmount.amountField as? AmountState.Data - val callback = (params as? SwapAmountComponentParams.AmountParams)?.callback ?: return val primaryCryptoCurrencyStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus if (primaryCryptoCurrencyStatus != null) { @@ -209,8 +230,7 @@ internal class SwapAmountModel @Inject constructor( ) } - callback.onSeparatorClick(lastAmount = amountFieldData?.amountTextField?.value.orEmpty()) - callback.onAmountResult(uiState.value) + amountParams.callback.onSeparatorClick(lastAmount = amountFieldData?.amountTextField?.value.orEmpty()) } private fun subscribeOnCryptoCurrencyStatusFlow() { @@ -302,10 +322,13 @@ internal class SwapAmountModel @Inject constructor( private fun observeChooseSelectToken() { swapChooseTokenNetworkListener.swapChooseTokenNetworkResultFlow - .onEach { (swapCurrencies, currency) -> + .onEach { data -> + (params as? SwapAmountComponentParams.AmountParams)?.callback?.resetSendWithSwapNavigation( + data.shouldResetNavigation, + ) uiState.update { amountUM -> if (amountUM is SwapAmountUM.Content) { - initPairs(swapCurrencies, currency) + initPairs(data.swapCurrencies, data.cryptoCurrency) amountUM.copy( isPrimaryButtonEnabled = false, secondaryAmount = SwapAmountFieldUM.Loading( diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/DefaultSwapChooseTokenNetworkTrigger.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/DefaultSwapChooseTokenNetworkTrigger.kt index 601f8942db..7a0ffa5011 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/DefaultSwapChooseTokenNetworkTrigger.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/DefaultSwapChooseTokenNetworkTrigger.kt @@ -4,6 +4,7 @@ import com.tangem.domain.models.currency.CryptoCurrency import com.tangem.domain.swap.models.SwapCurrencies import com.tangem.features.swap.v2.api.choosetoken.SwapChooseTokenNetworkListener import com.tangem.features.swap.v2.api.choosetoken.SwapChooseTokenNetworkTrigger +import com.tangem.features.swap.v2.api.choosetoken.SwapChooseTokenTriggerData import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import javax.inject.Inject @@ -14,10 +15,20 @@ internal class DefaultSwapChooseTokenNetworkTrigger @Inject constructor() : SwapChooseTokenNetworkTrigger, SwapChooseTokenNetworkListener { - override val swapChooseTokenNetworkResultFlow: SharedFlow> - field = MutableSharedFlow>() + override val swapChooseTokenNetworkResultFlow: SharedFlow + field = MutableSharedFlow() - override suspend fun trigger(swapCurrencies: SwapCurrencies, cryptoCurrency: CryptoCurrency) { - swapChooseTokenNetworkResultFlow.emit(swapCurrencies to cryptoCurrency) + override suspend fun trigger( + swapCurrencies: SwapCurrencies, + cryptoCurrency: CryptoCurrency, + shouldResetNavigation: Boolean, + ) { + swapChooseTokenNetworkResultFlow.emit( + SwapChooseTokenTriggerData( + swapCurrencies = swapCurrencies, + cryptoCurrency = cryptoCurrency, + shouldResetNavigation = shouldResetNavigation, + ), + ) } } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenAlertFactory.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenAlertFactory.kt new file mode 100644 index 0000000000..70433b8957 --- /dev/null +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenAlertFactory.kt @@ -0,0 +1,52 @@ +package com.tangem.features.swap.v2.impl.choosetoken.fromSupported.model + +import com.tangem.core.decompose.di.ModelScoped +import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.message.DialogMessage +import com.tangem.core.ui.message.EventMessageAction +import com.tangem.features.swap.v2.impl.R +import javax.inject.Inject + +@ModelScoped +internal class SwapChooseTokenAlertFactory @Inject constructor( + private val uiMessageSender: UiMessageSender, +) { + + fun getGenericErrorState(onDismiss: () -> Unit) { + uiMessageSender.send( + DialogMessage( + title = resourceReference(id = R.string.common_error), + message = resourceReference(id = R.string.common_unknown_error), + onDismissRequest = onDismiss, + firstActionBuilder = { okAction() }, + ), + ) + } + + fun showChangeTokenAlert(onConfirm: () -> Unit, onDismiss: () -> Unit) { + // todo fix localization [REDACTED_TASK_KEY] + uiMessageSender.send( + DialogMessage( + title = stringReference("Changing token"), + message = stringReference( + "Are you sure you want to change the token? After changing, previous data will be reset.", + ), + firstActionBuilder = { + EventMessageAction( + title = stringReference("Change"), + onClick = onConfirm, + ) + }, + secondActionBuilder = { + EventMessageAction( + title = stringReference("Cancel"), + onClick = onDismiss, + ) + }, + dismissOnFirstAction = true, + ), + ) + } +} \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt index 98b18cc39d..496e806384 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/choosetoken/fromSupported/model/SwapChooseTokenNetworkModel.kt @@ -4,15 +4,13 @@ import arrow.core.getOrElse 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.ui.UiMessageSender import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig -import com.tangem.core.ui.extensions.resourceReference -import com.tangem.core.ui.message.DialogMessage import com.tangem.domain.managetokens.CreateCryptoCurrencyUseCase +import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.swap.models.SwapCurrencies import com.tangem.domain.swap.usecase.GetSwapSupportedPairsUseCase import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.features.swap.v2.api.choosetoken.SwapChooseTokenNetworkComponent -import com.tangem.features.swap.v2.impl.R import com.tangem.features.swap.v2.impl.choosetoken.fromSupported.entity.SwapChooseTokenNetworkContentUM import com.tangem.features.swap.v2.impl.choosetoken.fromSupported.entity.SwapChooseTokenNetworkUM import com.tangem.features.swap.v2.impl.choosetoken.fromSupported.model.SwapChooseTokenFactory.getErrorMessage @@ -35,7 +33,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor( private val getSwapSupportedPairsUseCase: GetSwapSupportedPairsUseCase, private val createCryptoCurrencyUseCase: CreateCryptoCurrencyUseCase, private val getUserWalletUseCase: GetUserWalletUseCase, - private val uiMessageSender: UiMessageSender, + private val swapChooseTokenAlertFactory: SwapChooseTokenAlertFactory, ) : Model() { private val params: SwapChooseTokenNetworkComponent.Params = paramsContainer.require() @@ -63,7 +61,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor( private fun initContent() { val userWallet = getUserWalletUseCase(params.userWalletId).getOrElse { Timber.e("Failed to get user wallet: $it") - getGenericErrorState() + swapChooseTokenAlertFactory.getGenericErrorState(params.onDismiss) return } @@ -73,7 +71,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor( userWalletId = params.userWalletId, ).getOrElse { Timber.e("Failed to get crypto currency") - getGenericErrorState() + swapChooseTokenAlertFactory.getGenericErrorState(params.onDismiss) return@launch } val pairs = getSwapSupportedPairsUseCase.invoke( @@ -95,7 +93,7 @@ internal class SwapChooseTokenNetworkModel @Inject constructor( uiState.update( SwapChooseContentStateTransformer( pairs = pairs, - onNetworkClick = params.onResult, + onNetworkClick = ::onSwapTokenClick, tokenName = params.token.name, onDismiss = params.onDismiss, ), @@ -103,15 +101,18 @@ internal class SwapChooseTokenNetworkModel @Inject constructor( } } - private fun getGenericErrorState() { - uiMessageSender.send( - DialogMessage( - title = resourceReference(id = R.string.common_error), - message = resourceReference(id = R.string.common_unknown_error), - onDismissRequest = params.onDismiss, - firstActionBuilder = { okAction() }, - ), - ) + private fun onSwapTokenClick(swapCurrencies: SwapCurrencies, cryptoCurrency: CryptoCurrency) { + val prevSelectedCurrency = params.selectedCurrency?.network + if (prevSelectedCurrency == null || cryptoCurrency.network == prevSelectedCurrency) { + params.onResult(swapCurrencies, cryptoCurrency) + } else { + swapChooseTokenAlertFactory.showChangeTokenAlert( + onConfirm = { + params.onResult(swapCurrencies, cryptoCurrency) + }, + onDismiss = params.onDismiss, + ) + } } private companion object { diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt index f2c7bde219..d8a7e41bde 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/sendviaswap/model/SendWithSwapModel.kt @@ -13,13 +13,13 @@ import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.express.models.ExpressError import com.tangem.domain.models.currency.CryptoCurrency +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.swap.models.SwapDirection import com.tangem.domain.tokens.GetFeePaidCryptoCurrencyStatusSyncUseCase import com.tangem.domain.tokens.GetSingleCryptoCurrencyStatusUseCase import com.tangem.domain.tokens.error.CurrencyStatusError import com.tangem.domain.tokens.model.CryptoCurrencyStatus -import com.tangem.domain.models.wallet.UserWallet -import com.tangem.domain.models.wallet.isMultiCurrency import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.features.send.v2.api.entity.FeeSelectorUM import com.tangem.features.send.v2.api.subcomponents.destination.SendDestinationComponent @@ -27,8 +27,8 @@ import com.tangem.features.send.v2.api.subcomponents.destination.entity.Destinat import com.tangem.features.swap.v2.api.SendWithSwapComponent import com.tangem.features.swap.v2.impl.amount.SwapAmountComponent import com.tangem.features.swap.v2.impl.amount.entity.SwapAmountUM -import com.tangem.features.swap.v2.impl.common.entity.ConfirmUM import com.tangem.features.swap.v2.impl.common.SwapAlertFactory +import com.tangem.features.swap.v2.impl.common.entity.ConfirmUM import com.tangem.features.swap.v2.impl.sendviaswap.SendWithSwapRoute import com.tangem.features.swap.v2.impl.sendviaswap.confirm.SendWithSwapConfirmComponent import com.tangem.features.swap.v2.impl.sendviaswap.entity.SendWithSwapUM @@ -113,6 +113,20 @@ internal class SendWithSwapModel @Inject constructor( router.popTo(initialRoute) } + override fun resetSendWithSwapNavigation(resetNavigation: Boolean) { + uiState.update { + it.copy( + destinationUM = DestinationUM.Empty(), + feeSelectorUM = FeeSelectorUM.Loading, + confirmUM = ConfirmUM.Empty, + navigationUM = NavigationUM.Empty, + ) + } + if (resetNavigation) { + router.popTo(SendWithSwapRoute.Amount(false)) + } + } + override fun onBackClick() = router.pop() override fun onNextClick() {