Updated on 2026-08-14

This commit is contained in:
Tangem 2023-01-30 10:55:23 +03:00
parent 6ac57c67fd
commit d112773ff0
6 changed files with 42 additions and 24 deletions

View file

@ -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(

View file

@ -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,

View file

@ -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,
)

View file

@ -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,
),
)
}

View file

@ -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 " +

View file

@ -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 {