Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-26 17:54:31 +04:00
parent d2d9669097
commit b4e99d2459
6 changed files with 82 additions and 32 deletions

View file

@ -37,15 +37,14 @@ internal class DefaultSwapSelectTokensComponent @AssistedInject constructor(
),
)
private val selectToTokenListComponent: AvailableSwapPairsComponent =
availableSwapPairsComponentFactory.create(
context = child(key = "select_to_token_list"),
params = AvailableSwapPairsComponent.Params(
userWalletId = params.userWalletId,
selectedStatus = model.fromCurrencyStatus,
onTokenClick = model::selectToToken,
),
)
private val selectToTokenListComponent: AvailableSwapPairsComponent = availableSwapPairsComponentFactory.create(
context = child(key = "select_to_token_list"),
params = AvailableSwapPairsComponent.Params(
userWalletId = params.userWalletId,
selectedStatus = model.fromCurrencyStatus,
onTokenClick = model::selectToToken,
),
)
@Composable
override fun Content(modifier: Modifier) {

View file

@ -81,6 +81,7 @@ internal class AvailableSwapPairsModel @Inject constructor(
val (appCurrency, isBalanceHidden) = appCurrencyAndBalanceHiding
val filterTokenList = currencies
.filter { it.currency != selectedStatus?.currency }
.filterByQuery(query = query)
.filterByAvailability(availablePairs = availablePairs)

View file

@ -0,0 +1,29 @@
package com.tangem.features.onramp.swap.entity.transformer
import com.tangem.features.onramp.swap.entity.ExchangeCardUM
import com.tangem.features.onramp.swap.entity.SwapSelectTokensUM
import com.tangem.features.onramp.swap.entity.SwapSelectTokensUMTransformer
import com.tangem.features.onramp.swap.entity.utils.createEmptyExchangeTo
/**
* Transformer for removing selected "to" token
*
[REDACTED_AUTHOR]
*/
internal class RemoveSelectedToTokenTransformer(
private val onRemoveFromTokenClick: () -> Unit,
) : SwapSelectTokensUMTransformer {
override fun transform(prevState: SwapSelectTokensUM): SwapSelectTokensUM {
return prevState.copy(
exchangeFrom = prevState.exchangeFrom.showRemoveButton(onClick = onRemoveFromTokenClick),
exchangeTo = createEmptyExchangeTo(),
)
}
private fun ExchangeCardUM.showRemoveButton(onClick: () -> Unit): ExchangeCardUM {
return (this as? ExchangeCardUM.Filled)
?.copy(removeButtonUM = ExchangeCardUM.RemoveButtonUM(onClick = onClick))
?: this
}
}

View file

@ -10,11 +10,15 @@ import com.tangem.features.onramp.component.SwapSelectTokensComponent
import com.tangem.features.onramp.swap.entity.SwapSelectTokensController
import com.tangem.features.onramp.swap.entity.SwapSelectTokensUM
import com.tangem.features.onramp.swap.entity.transformer.RemoveSelectedFromTokenTransformer
import com.tangem.features.onramp.swap.entity.transformer.RemoveSelectedToTokenTransformer
import com.tangem.features.onramp.swap.entity.transformer.SelectFromTokenTransformer
import com.tangem.features.onramp.swap.entity.transformer.SelectToTokenTransformer
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeout
import javax.inject.Inject
@Suppress("LongParameterList")
@ -46,7 +50,7 @@ internal class SwapSelectTokensModel @Inject constructor(
controller.update(
transformer = SelectFromTokenTransformer(
selectedTokenItemState = selectedTokenItemState,
onRemoveClick = ::onRemoveClick,
onRemoveClick = ::removeSelectedFromToken,
),
)
}
@ -58,22 +62,43 @@ internal class SwapSelectTokensModel @Inject constructor(
* @param status crypto currency status
*/
fun selectToToken(selectedTokenItemState: TokenItemState, status: CryptoCurrencyStatus) {
_toCurrencyStatus.value = status
modelScope.launch {
_toCurrencyStatus.value = status
controller.update(transformer = SelectToTokenTransformer(selectedTokenItemState))
controller.update(transformer = SelectToTokenTransformer(selectedTokenItemState))
router.push(
route = AppRoute.Swap(
currencyFrom = requireNotNull(fromCurrencyStatus.value).currency,
currencyTo = status.currency,
userWalletId = params.userWalletId,
),
)
// require some delay to show state with selected "from" and "to" tokens
delay(timeMillis = 500)
router.push(
route = AppRoute.Swap(
currencyFrom = requireNotNull(fromCurrencyStatus.value).currency,
currencyTo = status.currency,
userWalletId = params.userWalletId,
),
onComplete = {
modelScope.launch {
withTimeout(timeMillis = 500) {
// Return a state with selected only "from" token
removeSelectedToToken()
}
}
},
)
}
}
private fun onRemoveClick() {
private fun removeSelectedFromToken() {
_fromCurrencyStatus.value = null
controller.update(transformer = RemoveSelectedFromTokenTransformer)
}
private fun removeSelectedToToken() {
_toCurrencyStatus.value = null
controller.update(
transformer = RemoveSelectedToTokenTransformer(onRemoveFromTokenClick = ::removeSelectedFromToken),
)
}
}

View file

@ -51,7 +51,6 @@ import com.tangem.feature.swap.router.SwapNavScreen
import com.tangem.feature.swap.router.SwapRouter
import com.tangem.feature.swap.ui.StateBuilder
import com.tangem.feature.swap.utils.formatToUIRepresentation
import com.tangem.features.wallet.featuretoggles.WalletFeatureToggles
import com.tangem.utils.Provider
import com.tangem.utils.coroutines.*
import com.tangem.utils.isNullOrZero
@ -87,7 +86,6 @@ internal class SwapViewModel @Inject constructor(
private val saveBlockchainErrorUseCase: SaveBlockchainErrorUseCase,
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
private val getMinimumTransactionAmountSyncUseCase: GetMinimumTransactionAmountSyncUseCase,
private val walletFeatureToggles: WalletFeatureToggles,
swapInteractorFactory: SwapInteractor.Factory,
private val savedStateHandle: SavedStateHandle,
) : ViewModel(), DefaultLifecycleObserver {
@ -99,13 +97,8 @@ internal class SwapViewModel @Inject constructor(
?: error("no expected parameter CryptoCurrency (from) found")
}
private val initialCurrencyTo: CryptoCurrency?
get() = if (walletFeatureToggles.isMainActionButtonsEnabled) {
savedStateHandle.get<Bundle>(AppRoute.Swap.CURRENCY_TO_KEY)
?.unbundle(CryptoCurrency.serializer())
} else {
null
}
private val initialCurrencyTo: CryptoCurrency? = savedStateHandle.get<Bundle>(AppRoute.Swap.CURRENCY_TO_KEY)
?.unbundle(CryptoCurrency.serializer())
private val userWalletId: UserWalletId = savedStateHandle.get<Bundle>(AppRoute.Swap.USER_WALLET_ID_KEY)
?.unbundle(UserWalletId.serializer())