From d112773ff05ba79cb63bb6f773418749b928ed58 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 30 Jan 2023 10:55:23 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../feature/swap/domain/SwapInteractorImpl.kt | 2 +- .../swap/converters/TokensDataConverter.kt | 18 +++++--------- .../swap/models/SwapSelectTokenStateHolder.kt | 1 + .../tangem/feature/swap/ui/StateBuilder.kt | 10 +++++--- .../feature/swap/ui/SwapSelectTokenScreen.kt | 24 ++++++++++++++----- .../feature/swap/viewmodels/SwapViewModel.kt | 11 +++++++-- 6 files changed, 42 insertions(+), 24 deletions(-) diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 340adffa9c..2fcdcc5b52 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -266,7 +266,7 @@ internal class SwapInteractorImpl @Inject constructor( appCurrency: ProxyFiatCurrency, ): List { return tokens.map { - val balance = balances[it.id] + val balance = balances[it.symbol] TokenWithBalance( token = it, tokenBalanceData = TokenBalanceData( diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/converters/TokensDataConverter.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/converters/TokensDataConverter.kt index 16443ce5cc..7491904442 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/converters/TokensDataConverter.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/converters/TokensDataConverter.kt @@ -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 { +) { - 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, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapSelectTokenStateHolder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapSelectTokenStateHolder.kt index 9a79105dea..b51831dedb 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapSelectTokenStateHolder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapSelectTokenStateHolder.kt @@ -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, ) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index dca8404141..0d24f31906 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -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, ), ) } diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt index a19e8f7d1d..f086d605b3 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSelectTokenScreen.kt @@ -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 " + diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index 5ec0265f58..1056c842c6 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -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 {