Updated on 2026-08-14
This commit is contained in:
parent
d2d9669097
commit
b4e99d2459
6 changed files with 82 additions and 32 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -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())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue