diff --git a/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/SendComponent.kt b/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/SendComponent.kt index 34f945d37c..88b5f8d9e2 100644 --- a/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/SendComponent.kt +++ b/features/send-v2/api/src/main/java/com/tangem/features/send/v2/api/SendComponent.kt @@ -20,6 +20,6 @@ interface SendComponent : ComposableContentComponent { interface Factory : ComponentFactory interface ModelCallback { - fun onConvertToAnotherToken(lastAmount: String) + fun onConvertToAnotherToken(lastAmount: String, isEnterInFiatSelected: Boolean) } } \ No newline at end of file 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 f18192f9f9..24f122f9bd 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 @@ -30,9 +30,11 @@ internal class SendEntryPointModel @Inject constructor( ChooseManagedTokensComponent.ModelCallback { private var lastSavedAmount = "" + private var isEnterInFiat = false - override fun onConvertToAnotherToken(lastAmount: String) { + override fun onConvertToAnotherToken(lastAmount: String, isEnterInFiatSelected: Boolean) { lastSavedAmount = lastAmount + isEnterInFiat = isEnterInFiatSelected modelScope.launch { val showSendViaSwapNotification = shouldShowNotificationUseCase( NotificationId.SendViaSwapTokenSelectorNotification.key, @@ -45,12 +47,11 @@ internal class SendEntryPointModel @Inject constructor( } } - override fun onCloseSwap(lastAmount: String) { + override fun onCloseSwap(lastAmount: String, isEnterInFiatSelected: Boolean) { lastSavedAmount = lastAmount + isEnterInFiat = isEnterInFiatSelected modelScope.launch { - if (lastAmount.isNotBlank()) { - sendAmountUpdateTrigger.triggerUpdateAmount(lastAmount) - } + sendAmountUpdateTrigger.triggerUpdateAmount(lastAmount, isEnterInFiat) router.replaceAll(SendEntryRoute.Send) } } @@ -58,9 +59,7 @@ internal class SendEntryPointModel @Inject constructor( @Suppress("MagicNumber") override fun onResult() { modelScope.launch { - if (lastSavedAmount.isNotBlank()) { - swapAmountUpdateTrigger.triggerUpdateAmount(lastSavedAmount) - } + swapAmountUpdateTrigger.triggerUpdateAmount(lastSavedAmount, isEnterInFiat) // Workaround in order to execute correct exit animation on SendEntryRoute.ChooseToken router.pop() delay(10L) @@ -70,7 +69,7 @@ internal class SendEntryPointModel @Inject constructor( override fun onBack() { modelScope.launch { - sendAmountUpdateTrigger.triggerUpdateAmount(lastSavedAmount) + sendAmountUpdateTrigger.triggerUpdateAmount(lastSavedAmount, isEnterInFiat) router.pop() } } 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 f0a63844c1..1aa522334b 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 @@ -227,14 +227,14 @@ internal class SendModel @Inject constructor( } } - override fun onConvertToAnotherToken(lastAmount: String) { + override fun onConvertToAnotherToken(lastAmount: String, isEnterInFiatSelected: Boolean) { analyticsEventHandler.send( SendAnalyticEvents.ConvertTokenButtonClicked( token = cryptoCurrency.symbol, blockchain = cryptoCurrency.network.name, ), ) - params.callback?.onConvertToAnotherToken(lastAmount = lastAmount) + params.callback?.onConvertToAnotherToken(lastAmount = lastAmount, isEnterInFiatSelected = isEnterInFiatSelected) } override fun resetSendNavigation() { @@ -455,7 +455,7 @@ internal class SendModel @Inject constructor( ) // If it is in active state use flow to update value in amount component modelScope.launch { - amount?.let { sendAmountUpdateTrigger.triggerUpdateAmount(it) } + amount?.let { sendAmountUpdateTrigger.triggerUpdateAmount(it, null) } } } 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 14068d2093..0dcbee1083 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 @@ -40,7 +40,7 @@ internal class SendAmountComponent( interface ModelCallback : NavigationModelCallback { fun onAmountResult(amountUM: AmountState, isResetPredefined: Boolean) - fun onConvertToAnotherToken(lastAmount: String) + fun onConvertToAnotherToken(lastAmount: String, isEnterInFiatSelected: Boolean) fun resetSendNavigation() fun onError(error: GetUserWalletError) } diff --git a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountReduceTrigger.kt b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountReduceTrigger.kt index 1bd91ddafa..d3085ff9a2 100644 --- a/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountReduceTrigger.kt +++ b/features/send-v2/impl/src/main/java/com/tangem/features/send/v2/subcomponents/amount/SendAmountReduceTrigger.kt @@ -30,7 +30,7 @@ interface SendAmountReduceListener { * Different from another triggers because it takes raw string instead of BigDecimal */ interface SendAmountUpdateTrigger { - suspend fun triggerUpdateAmount(amountValue: String) + suspend fun triggerUpdateAmount(amountValue: String, isEnterInFiatSelected: Boolean?) } /** @@ -38,7 +38,7 @@ interface SendAmountUpdateTrigger { * Different from another triggers because it takes raw string instead of BigDecimal */ interface SendAmountUpdateListener { - val updateAmountTriggerFlow: Flow + val updateAmountTriggerFlow: Flow> } @Singleton @@ -51,7 +51,7 @@ internal class DefaultSendAmountReduceTrigger @Inject constructor() : override val reduceToTriggerFlow = MutableSharedFlow() override val reduceByTriggerFlow = MutableSharedFlow() override val ignoreReduceTriggerFlow = MutableSharedFlow() - override val updateAmountTriggerFlow = MutableSharedFlow() + override val updateAmountTriggerFlow = MutableSharedFlow>() override suspend fun triggerReduceBy(reduceBy: ReduceByData) { reduceByTriggerFlow.emit(reduceBy) @@ -65,7 +65,7 @@ internal class DefaultSendAmountReduceTrigger @Inject constructor() : ignoreReduceTriggerFlow.emit(Unit) } - override suspend fun triggerUpdateAmount(amountValue: String) { - updateAmountTriggerFlow.emit(amountValue) + override suspend fun triggerUpdateAmount(amountValue: String, isEnterInFiatSelected: Boolean?) { + updateAmountTriggerFlow.emit(amountValue to isEnterInFiatSelected) } } \ 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 edf9d9aa4f..3a215bc03b 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 @@ -290,7 +290,15 @@ internal class SendAmountModel @Inject constructor( isPrimaryButtonEnabled = false, ) ?: it } - amountParams.callback.onConvertToAnotherToken(amountFieldData?.amountTextField?.value.orEmpty()) + + val isEnterInFiatSelected = amountFieldData?.amountTextField?.isFiatValue == true + val lastAmount = if (isEnterInFiatSelected) { + amountFieldData.amountTextField.fiatValue + } else { + amountFieldData?.amountTextField?.value + } + + amountParams.callback.onConvertToAnotherToken(lastAmount.orEmpty(), isEnterInFiatSelected) } private fun subscribeOnAmountReduceToTriggerUpdates() { @@ -346,7 +354,8 @@ internal class SendAmountModel @Inject constructor( private fun subscribeOnAmountUpdateTriggerUpdates() { sendAmountUpdateListener.updateAmountTriggerFlow - .onEach { amount -> + .onEach { (amount, isEnterInFiat) -> + isEnterInFiat?.let { onCurrencyChangeClick(isEnterInFiat) } onAmountValueChange(amount) saveResult() }.launchIn(modelScope) diff --git a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SendWithSwapComponent.kt b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SendWithSwapComponent.kt index 20384b89c5..365495e6e5 100644 --- a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SendWithSwapComponent.kt +++ b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/SendWithSwapComponent.kt @@ -16,6 +16,6 @@ interface SendWithSwapComponent : ComposableContentComponent { interface Factory : ComponentFactory interface ModelCallback { - fun onCloseSwap(lastAmount: String) + fun onCloseSwap(lastAmount: String, isEnterInFiatSelected: Boolean) } } \ No newline at end of file diff --git a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/subcomponents/SwapAmountUpdateTrigger.kt b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/subcomponents/SwapAmountUpdateTrigger.kt index 5cec5c47df..7c9a0f4b91 100644 --- a/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/subcomponents/SwapAmountUpdateTrigger.kt +++ b/features/swap-v2/api/src/main/java/com/tangem/features/swap/v2/api/subcomponents/SwapAmountUpdateTrigger.kt @@ -5,7 +5,7 @@ package com.tangem.features.swap.v2.api.subcomponents * Different from another triggers because it takes raw string instead of BigDecimal */ interface SwapAmountUpdateTrigger { - suspend fun triggerUpdateAmount(amountValue: String) + suspend fun triggerUpdateAmount(amountValue: String, isEnterInFiatSelected: Boolean) suspend fun triggerQuoteReload() } \ No newline at end of file diff --git a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/DefaultSwapAmountUpdateTrigger.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/DefaultSwapAmountUpdateTrigger.kt index 3fe62bce62..33f79518f4 100644 --- a/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/DefaultSwapAmountUpdateTrigger.kt +++ b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/DefaultSwapAmountUpdateTrigger.kt @@ -14,7 +14,7 @@ import javax.inject.Singleton * Different from another triggers because it takes raw string instead of BigDecimal */ interface SwapAmountUpdateListener { - val updateAmountTriggerFlow: Flow + val updateAmountTriggerFlow: Flow> val reloadQuotesTriggerFlow: Flow } @@ -44,8 +44,8 @@ internal class DefaultSwapAmountUpdateTrigger @Inject constructor() : SwapAmountReduceTrigger, SwapAmountReduceListener { - override val updateAmountTriggerFlow: SharedFlow - field = MutableSharedFlow() + override val updateAmountTriggerFlow: SharedFlow> + field = MutableSharedFlow>() override val reduceToTriggerFlow: SharedFlow field = MutableSharedFlow() @@ -59,8 +59,8 @@ internal class DefaultSwapAmountUpdateTrigger @Inject constructor() : override val reloadQuotesTriggerFlow: Flow field = MutableSharedFlow() - override suspend fun triggerUpdateAmount(amountValue: String) { - updateAmountTriggerFlow.emit(amountValue) + override suspend fun triggerUpdateAmount(amountValue: String, isEnterInFiatSelected: Boolean) { + updateAmountTriggerFlow.emit(amountValue to isEnterInFiatSelected) } override suspend fun triggerQuoteReload() { 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 cb025a05e8..035c016356 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 @@ -46,7 +46,7 @@ internal class SwapAmountComponent @AssistedInject constructor( interface ModelCallback : NavigationModelCallback { fun onAmountResult(amountUM: SwapAmountUM) - fun onSeparatorClick(lastAmount: String) + fun onSeparatorClick(lastAmount: String, isEnterInFiatSelected: Boolean) 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/SwapAmountModel.kt b/features/swap-v2/impl/src/main/java/com/tangem/features/swap/v2/impl/amount/model/SwapAmountModel.kt index a6f5cf8206..53c158cd76 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 @@ -348,7 +348,10 @@ internal class SwapAmountModel @Inject constructor( private fun confirmSendWithSwapClose() { val amountParams = params as? SwapAmountComponentParams.AmountParams ?: return - val amountFieldData = uiState.value.primaryAmount.amountField as? AmountState.Data + val amountField = uiState.value.swapDirection.withSwapDirection( + onDirect = { uiState.value.primaryAmount }, + onReverse = { uiState.value.secondaryAmount }, + ).amountField as? AmountState.Data val primaryCryptoCurrencyStatus = (uiState.value as? SwapAmountUM.Content)?.primaryCryptoCurrencyStatus if (primaryCryptoCurrencyStatus != null) { @@ -367,7 +370,16 @@ internal class SwapAmountModel @Inject constructor( ) } - amountParams.callback.onSeparatorClick(lastAmount = amountFieldData?.amountTextField?.value.orEmpty()) + val isEnterInFiatSelected = amountField?.amountTextField?.isFiatValue == true + val lastAmount = if (isEnterInFiatSelected) { + amountField.amountTextField.fiatValue + } else { + amountField?.amountTextField?.value + } + amountParams.callback.onSeparatorClick( + lastAmount = lastAmount.orEmpty(), + isEnterInFiatSelected = isEnterInFiatSelected, + ) } private fun subscribeOnCryptoCurrencyStatusFlow() { @@ -407,9 +419,10 @@ internal class SwapAmountModel @Inject constructor( private fun subscribeOnAmountUpdateTriggerUpdates() { swapAmountUpdateListener.updateAmountTriggerFlow - .onEach { + .onEach { (amount, isEnterInFiat) -> if (uiState.value is SwapAmountUM.Content) { - onAmountValueChange(it) + onCurrencyChangeClick(isEnterInFiat) + onAmountValueChange(amount) saveResult() } } 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 ede2387f9d..a92ea2bbff 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 @@ -110,8 +110,8 @@ internal class SendWithSwapModel @Inject constructor( uiState.update { it.copy(navigationUM = navigationUM) } } - override fun onSeparatorClick(lastAmount: String) { - params.callback?.onCloseSwap(lastAmount) + override fun onSeparatorClick(lastAmount: String, isEnterInFiatSelected: Boolean) { + params.callback?.onCloseSwap(lastAmount, isEnterInFiatSelected) router.popTo(initialRoute) }