Updated on 2026-08-14
This commit is contained in:
parent
6ac57c67fd
commit
d112773ff0
6 changed files with 42 additions and 24 deletions
|
|
@ -266,7 +266,7 @@ internal class SwapInteractorImpl @Inject constructor(
|
|||
appCurrency: ProxyFiatCurrency,
|
||||
): List<TokenWithBalance> {
|
||||
return tokens.map {
|
||||
val balance = balances[it.id]
|
||||
val balance = balances[it.symbol]
|
||||
TokenWithBalance(
|
||||
token = it,
|
||||
tokenBalanceData = TokenBalanceData(
|
||||
|
|
|
|||
|
|
@ -1,33 +1,26 @@
|
|||
package com.tangem.feature.swap.converters
|
||||
|
||||
import com.tangem.feature.swap.domain.models.domain.Currency
|
||||
import com.tangem.feature.swap.domain.models.domain.NetworkInfo
|
||||
import com.tangem.feature.swap.domain.models.ui.FoundTokensState
|
||||
import com.tangem.feature.swap.domain.models.ui.TokenWithBalance
|
||||
import com.tangem.feature.swap.models.Network
|
||||
import com.tangem.feature.swap.models.SwapSelectTokenStateHolder
|
||||
import com.tangem.feature.swap.models.TokenBalanceData
|
||||
import com.tangem.feature.swap.models.TokenToSelect
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
class TokensDataConverter(
|
||||
private val onSearchEntered: (String) -> Unit,
|
||||
private val onTokenSelected: (String) -> Unit,
|
||||
) : Converter<FoundTokensState, SwapSelectTokenStateHolder> {
|
||||
) {
|
||||
|
||||
private var networkName: String? = null
|
||||
private var blockchainId: String? = null
|
||||
|
||||
fun setNetworkData(networkName: String, blockchainId: String) {
|
||||
this.networkName = networkName
|
||||
this.blockchainId = blockchainId
|
||||
}
|
||||
|
||||
override fun convert(value: FoundTokensState): SwapSelectTokenStateHolder {
|
||||
fun convertWithNetwork(value: FoundTokensState, network: NetworkInfo): SwapSelectTokenStateHolder {
|
||||
return SwapSelectTokenStateHolder(
|
||||
addedTokens = value.tokensInWallet.map { tokenWithBalanceToTokenToSelect(it) },
|
||||
otherTokens = value.loadedTokens.map { tokenWithBalanceToTokenToSelect(it) },
|
||||
onSearchEntered = onSearchEntered,
|
||||
onTokenSelected = onTokenSelected,
|
||||
network = Network(networkName ?: "", blockchainId ?: ""),
|
||||
network = Network(network.name, network.blockchainId),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -37,6 +30,7 @@ class TokensDataConverter(
|
|||
name = tokenWithBalance.token.name,
|
||||
symbol = tokenWithBalance.token.symbol,
|
||||
iconUrl = tokenWithBalance.token.logoUrl,
|
||||
isNative = tokenWithBalance.token is Currency.NativeToken,
|
||||
addedTokenBalanceData = TokenBalanceData(
|
||||
amount = tokenWithBalance.tokenBalanceData?.amount,
|
||||
amountEquivalent = tokenWithBalance.tokenBalanceData?.amountEquivalent,
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ data class TokenToSelect(
|
|||
val name: String,
|
||||
val symbol: String,
|
||||
val iconUrl: String,
|
||||
val isNative: Boolean,
|
||||
val available: Boolean = true,
|
||||
val addedTokenBalanceData: TokenBalanceData? = null,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -30,7 +30,6 @@ internal class StateBuilder(val actions: UiActions) {
|
|||
private val tokensDataConverter = TokensDataConverter(actions.onSearchEntered, actions.onTokenSelected)
|
||||
|
||||
fun createInitialLoadingState(initialCurrency: Currency, networkInfo: NetworkInfo): SwapStateHolder {
|
||||
tokensDataConverter.setNetworkData(networkInfo.name, networkInfo.blockchainId)
|
||||
return SwapStateHolder(
|
||||
networkId = initialCurrency.networkId,
|
||||
blockchainId = networkInfo.blockchainId,
|
||||
|
|
@ -206,10 +205,15 @@ internal class StateBuilder(val actions: UiActions) {
|
|||
)
|
||||
}
|
||||
|
||||
fun addTokensToState(uiState: SwapStateHolder, dataState: FoundTokensState): SwapStateHolder {
|
||||
fun addTokensToState(
|
||||
uiState: SwapStateHolder,
|
||||
dataState: FoundTokensState,
|
||||
networkInfo: NetworkInfo,
|
||||
): SwapStateHolder {
|
||||
return uiState.copy(
|
||||
selectTokenState = tokensDataConverter.convert(
|
||||
selectTokenState = tokensDataConverter.convertWithNetwork(
|
||||
value = dataState,
|
||||
network = networkInfo,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.tangem.feature.swap.ui
|
||||
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.background
|
||||
|
|
@ -79,7 +80,7 @@ private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier =
|
|||
}
|
||||
|
||||
itemsIndexed(items = state.addedTokens) { index, item ->
|
||||
TokenItem(token = item, onTokenClick = { state.onTokenSelected(item.id) })
|
||||
TokenItem(token = item, network = state.network, onTokenClick = { state.onTokenSelected(item.id) })
|
||||
|
||||
if (index != state.addedTokens.lastIndex) {
|
||||
Divider(
|
||||
|
|
@ -94,7 +95,7 @@ private fun ListOfTokens(state: SwapSelectTokenStateHolder, modifier: Modifier =
|
|||
}
|
||||
|
||||
itemsIndexed(items = state.otherTokens) { index, item ->
|
||||
TokenItem(token = item, onTokenClick = { state.onTokenSelected(item.id) })
|
||||
TokenItem(token = item, network = state.network, onTokenClick = { state.onTokenSelected(item.id) })
|
||||
if (index != state.otherTokens.lastIndex) {
|
||||
Divider(
|
||||
color = TangemTheme.colors.stroke.primary,
|
||||
|
|
@ -121,8 +122,9 @@ private fun Header(@StringRes title: Int) {
|
|||
)
|
||||
}
|
||||
|
||||
@Suppress("LongMethod")
|
||||
@Composable
|
||||
private fun TokenItem(token: TokenToSelect, onTokenClick: () -> Unit) {
|
||||
private fun TokenItem(token: TokenToSelect, network: Network, onTokenClick: () -> Unit) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
|
@ -133,7 +135,10 @@ private fun TokenItem(token: TokenToSelect, onTokenClick: () -> Unit) {
|
|||
),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
TokenIcon(token = token)
|
||||
TokenIcon(
|
||||
token = token,
|
||||
iconPlaceholder = if (token.isNative) getActiveIconRes(network.blockchainId) else null,
|
||||
)
|
||||
|
||||
Column(modifier = Modifier.align(Alignment.CenterVertically)) {
|
||||
Text(
|
||||
|
|
@ -185,7 +190,13 @@ private fun TokenItem(token: TokenToSelect, onTokenClick: () -> Unit) {
|
|||
|
||||
@Suppress("MagicNumber")
|
||||
@Composable
|
||||
private fun TokenIcon(token: TokenToSelect) {
|
||||
private fun TokenIcon(
|
||||
token: TokenToSelect,
|
||||
@DrawableRes iconPlaceholder: Int?,
|
||||
) {
|
||||
val data = token.iconUrl.ifEmpty {
|
||||
iconPlaceholder
|
||||
}
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.padding(end = TangemTheme.dimens.spacing12),
|
||||
|
|
@ -201,7 +212,7 @@ private fun TokenIcon(token: TokenToSelect) {
|
|||
SubcomposeAsyncImage(
|
||||
modifier = iconModifier,
|
||||
model = ImageRequest.Builder(LocalContext.current)
|
||||
.data(token.iconUrl)
|
||||
.data(data)
|
||||
.crossfade(true)
|
||||
.build(),
|
||||
contentDescription = token.id,
|
||||
|
|
@ -234,6 +245,7 @@ private val token = TokenToSelect(
|
|||
name = "USDC",
|
||||
symbol = "USDC",
|
||||
iconUrl = "",
|
||||
isNative = false,
|
||||
addedTokenBalanceData = TokenBalanceData(
|
||||
amount = "15 000 $",
|
||||
amountEquivalent = "15 000 " +
|
||||
|
|
|
|||
|
|
@ -123,7 +123,11 @@ internal class SwapViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun updateTokensState(dataState: FoundTokensState) {
|
||||
uiState = stateBuilder.addTokensToState(uiState, dataState)
|
||||
uiState = stateBuilder.addTokensToState(
|
||||
uiState = uiState,
|
||||
dataState = dataState,
|
||||
networkInfo = blockchainInteractor.getBlockchainInfo(currency.networkId),
|
||||
)
|
||||
}
|
||||
|
||||
private fun startLoadingQuotes(fromToken: Currency, toToken: Currency, amount: String) {
|
||||
|
|
@ -331,7 +335,10 @@ internal class SwapViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
@Suppress("UnusedPrivateMember")
|
||||
private fun onAmountSelected(selected: Boolean) { // TODO
|
||||
private fun onAmountSelected(selected: Boolean) {
|
||||
if (selected) {
|
||||
analyticsEventHandler.send(SwapEvents.SendTokenBalanceClicked)
|
||||
}
|
||||
}
|
||||
|
||||
private fun cutAmountWithDecimals(maxDecimals: Int, amount: String): String {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue