From 61fbf9a6ea4a04ee6d8f0ece83504014bd4ae71b Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 30 Nov 2023 18:14:51 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../feature/swap/models/SwapStateHolder.kt | 3 +- .../tangem/feature/swap/ui/StateBuilder.kt | 11 +- .../feature/swap/ui/SwapScreenContent.kt | 13 +- .../tangem/feature/swap/ui/TransactionCard.kt | 175 +++++++++--------- 4 files changed, 103 insertions(+), 99 deletions(-) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt index 9fc0d8a9c1..e30eff225c 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt @@ -1,5 +1,6 @@ package com.tangem.feature.swap.models +import androidx.annotation.DrawableRes import androidx.compose.ui.text.input.TextFieldValue import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.notifications.NotificationConfig @@ -14,7 +15,6 @@ data class SwapStateHolder( val sendCardData: SwapCardState, val receiveCardData: SwapCardState, val networkCurrency: String, - val networkId: String, val blockchainId: String, // not the same as networkId, its local id in app val warnings: List = emptyList(), val alert: SwapWarning.GenericWarning? = null, @@ -42,6 +42,7 @@ data class SwapStateHolder( sealed class SwapCardState { data class SwapCardData( + @DrawableRes val networkIconRes: Int?, val type: TransactionCardType, val amountEquivalent: String?, val token: CryptoCurrencyStatus?, 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 b81bbb59e4..4bab76b4a3 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 @@ -49,7 +49,6 @@ internal class StateBuilder( fun createInitialLoadingState(initialCurrency: CryptoCurrency, networkInfo: NetworkInfo): SwapStateHolder { return SwapStateHolder( - networkId = initialCurrency.network.backendId, blockchainId = networkInfo.blockchainId, sendCardData = SwapCardState.SwapCardData( type = TransactionCardType.SendCard(actions.onAmountChanged, actions.onAmountSelected), @@ -62,6 +61,7 @@ internal class StateBuilder( canSelectAnotherToken = false, isNotNativeToken = initialCurrency is CryptoCurrency.Token, balance = "", + networkIconRes = getActiveIconRes(initialCurrency.network.id.value), isBalanceHidden = true, ), receiveCardData = SwapCardState.SwapCardData( @@ -74,6 +74,7 @@ internal class StateBuilder( canSelectAnotherToken = false, balance = "", isNotNativeToken = false, + networkIconRes = null, coinId = null, isBalanceHidden = true, ), @@ -109,6 +110,7 @@ internal class StateBuilder( tokenCurrency = uiStateHolder.sendCardData.tokenCurrency, canSelectAnotherToken = uiStateHolder.sendCardData.canSelectAnotherToken, balance = fromToken.getFormattedAmount(), + networkIconRes = getActiveIconRes(fromToken.currency.network.id.value), isBalanceHidden = isBalanceHiddenProvider(), ), receiveCardData = SwapCardState.Empty( @@ -163,6 +165,7 @@ internal class StateBuilder( isNotNativeToken = fromToken is CryptoCurrency.Token, canSelectAnotherToken = canSelectSendToken, balance = if (!canSelectSendToken) uiStateHolder.sendCardData.balance else "", + networkIconRes = getActiveIconRes(fromToken.network.id.value), isBalanceHidden = isBalanceHiddenProvider(), ), receiveCardData = SwapCardState.SwapCardData( @@ -176,6 +179,7 @@ internal class StateBuilder( isNotNativeToken = toToken is CryptoCurrency.Token, canSelectAnotherToken = canSelectReceiveToken, balance = if (!canSelectReceiveToken) uiStateHolder.receiveCardData.balance else "", + networkIconRes = getActiveIconRes(toToken.network.id.value), isBalanceHidden = isBalanceHiddenProvider(), ), warnings = emptyList(), @@ -256,6 +260,7 @@ internal class StateBuilder( isNotNativeToken = uiStateHolder.sendCardData.isNotNativeToken, tokenCurrency = uiStateHolder.sendCardData.tokenCurrency, canSelectAnotherToken = uiStateHolder.sendCardData.canSelectAnotherToken, + networkIconRes = uiStateHolder.sendCardData.networkIconRes, balance = fromCurrencyStatus.getFormattedAmount(), isBalanceHidden = isBalanceHiddenProvider(), ), @@ -269,6 +274,7 @@ internal class StateBuilder( isNotNativeToken = uiStateHolder.receiveCardData.isNotNativeToken, tokenCurrency = uiStateHolder.receiveCardData.tokenCurrency, canSelectAnotherToken = uiStateHolder.receiveCardData.canSelectAnotherToken, + networkIconRes = uiStateHolder.receiveCardData.networkIconRes, balance = toCurrencyStatus.getFormattedAmount(), isBalanceHidden = isBalanceHiddenProvider(), ), @@ -329,6 +335,7 @@ internal class StateBuilder( isNotNativeToken = uiStateHolder.receiveCardData.isNotNativeToken, tokenCurrency = uiStateHolder.receiveCardData.tokenCurrency, canSelectAnotherToken = uiStateHolder.receiveCardData.canSelectAnotherToken, + networkIconRes = uiStateHolder.receiveCardData.networkIconRes, balance = toToken.getFormattedAmount(), isBalanceHidden = isBalanceHiddenProvider(), ) @@ -421,6 +428,7 @@ internal class StateBuilder( isNotNativeToken = uiStateHolder.sendCardData.isNotNativeToken, tokenCurrency = uiStateHolder.sendCardData.tokenCurrency, canSelectAnotherToken = uiStateHolder.sendCardData.canSelectAnotherToken, + networkIconRes = uiStateHolder.sendCardData.networkIconRes, balance = emptyAmountState.fromTokenWalletBalance, isBalanceHidden = isBalanceHiddenProvider(), ), @@ -434,6 +442,7 @@ internal class StateBuilder( isNotNativeToken = uiStateHolder.receiveCardData.isNotNativeToken, tokenCurrency = uiStateHolder.receiveCardData.tokenCurrency, canSelectAnotherToken = uiStateHolder.receiveCardData.canSelectAnotherToken, + networkIconRes = uiStateHolder.receiveCardData.networkIconRes, balance = emptyAmountState.toTokenWalletBalance, isBalanceHidden = isBalanceHiddenProvider(), ), diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt index cd6c2ea2fa..0ba2059fab 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapScreenContent.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -21,7 +20,6 @@ import com.tangem.core.ui.components.* import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.components.notifications.Notification import com.tangem.core.ui.components.notifications.NotificationConfig -import com.tangem.core.ui.extensions.getActiveIconRes import com.tangem.core.ui.extensions.getActiveIconResByCoinId import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemTheme @@ -135,14 +133,10 @@ private fun MainInfo(state: SwapStateHolder) { ConstraintLayout( modifier = Modifier.fillMaxWidth(), ) { - val networkIconRes = remember { - getActiveIconRes(state.blockchainId) - } val (topCard, bottomCard, button) = createRefs() val priceImpactWarning = state.warnings.filterIsInstance().firstOrNull() TransactionCardData( priceImpactWarning = priceImpactWarning, - networkIconRes = networkIconRes, swapCardState = state.sendCardData, modifier = Modifier.constrainAs(topCard) { top.linkTo(parent.top) @@ -152,7 +146,6 @@ private fun MainInfo(state: SwapStateHolder) { val marginCard = TangemTheme.dimens.spacing16 TransactionCardData( priceImpactWarning = priceImpactWarning, - networkIconRes = networkIconRes, swapCardState = state.receiveCardData, modifier = Modifier.constrainAs(bottomCard) { top.linkTo(topCard.bottom, margin = marginCard) @@ -174,7 +167,6 @@ private fun MainInfo(state: SwapStateHolder) { @Composable private fun TransactionCardData( priceImpactWarning: SwapWarning.HighPriceImpact?, - networkIconRes: Int?, swapCardState: SwapCardState, onSelectTokenClick: (() -> Unit)?, modifier: Modifier = Modifier, @@ -202,7 +194,7 @@ private fun TransactionCardData( tokenIconUrl = swapCardState.tokenIconUrl ?: "", tokenCurrency = swapCardState.tokenCurrency, priceImpact = priceImpactWarning, - networkIconRes = if (swapCardState.isNotNativeToken) networkIconRes else null, + networkIconRes = if (swapCardState.isNotNativeToken) swapCardState.networkIconRes else null, iconPlaceholder = swapCardState.coinId?.let { getActiveIconResByCoinId(it) }, @@ -355,6 +347,7 @@ private val sendCard = SwapCardState.SwapCardData( balance = "123", coinId = "", token = null, + networkIconRes = R.drawable.img_polygon_22, isBalanceHidden = false, ) @@ -369,11 +362,11 @@ private val receiveCard = SwapCardState.SwapCardData( balance = "33333", coinId = "", token = null, + networkIconRes = R.drawable.img_polygon_22, isBalanceHidden = false, ) private val state = SwapStateHolder( - networkId = "ethereum", sendCardData = sendCard, receiveCardData = receiveCard, fee = FeeItemState.Content( diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt index d5996c36a5..f4bd0ae799 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/TransactionCard.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.Card import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -17,6 +16,7 @@ import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext @@ -55,53 +55,53 @@ fun TransactionCard( @DrawableRes networkIconRes: Int? = null, onChangeTokenClick: (() -> Unit)? = null, ) { - Card( - shape = RoundedCornerShape(TangemTheme.dimens.radius12), - backgroundColor = TangemTheme.colors.background.primary, - elevation = TangemTheme.dimens.elevation2, - modifier = modifier, + Box( + modifier = modifier + .background( + shape = RoundedCornerShape(TangemTheme.dimens.radius12), + color = TangemTheme.colors.background.primary, + ) + .fillMaxSize(), ) { - Box(modifier = Modifier.fillMaxSize()) { - Column( - modifier = Modifier - .fillMaxWidth(), - verticalArrangement = Arrangement.Top, - horizontalAlignment = Alignment.Start, - ) { - Header(balance = stringResource(R.string.common_balance, balance), type = type) + Column( + modifier = Modifier + .fillMaxWidth(), + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start, + ) { + Header(balance = stringResource(R.string.common_balance, balance), type = type) - Content( - type = type, - amountEquivalent = amountEquivalent, - textFieldValue = textFieldValue, - priceImpact = priceImpact, - ) - } + Content( + type = type, + amountEquivalent = amountEquivalent, + textFieldValue = textFieldValue, + priceImpact = priceImpact, + ) + } - Box(modifier = Modifier.align(Alignment.BottomEnd)) { - Token( - tokenIconUrl = tokenIconUrl, - tokenCurrency = tokenCurrency, - networkIconRes = networkIconRes, - iconPlaceholder = iconPlaceholder, - ) - } + Box(modifier = Modifier.align(Alignment.BottomEnd)) { + Token( + tokenIconUrl = tokenIconUrl, + tokenCurrency = tokenCurrency, + networkIconRes = networkIconRes, + iconPlaceholder = iconPlaceholder, + ) + } - if (onChangeTokenClick != null) { - Box(modifier = Modifier.align(Alignment.CenterEnd)) { - ChangeTokenSelector() - } - Box( - Modifier - .align(Alignment.CenterEnd) - .height(TangemTheme.dimens.size116) - .width(TangemTheme.dimens.size102) - .clickable( - indication = rememberRipple(bounded = false), - interactionSource = remember { MutableInteractionSource() }, - ) { onChangeTokenClick() }, - ) + if (onChangeTokenClick != null) { + Box(modifier = Modifier.align(Alignment.CenterEnd)) { + ChangeTokenSelector() } + Box( + Modifier + .align(Alignment.CenterEnd) + .height(TangemTheme.dimens.size116) + .width(TangemTheme.dimens.size102) + .clickable( + indication = rememberRipple(bounded = false), + interactionSource = remember { MutableInteractionSource() }, + ) { onChangeTokenClick() }, + ) } } } @@ -114,55 +114,55 @@ fun TransactionCardEmpty( modifier: Modifier = Modifier, onChangeTokenClick: (() -> Unit)? = null, ) { - Card( - shape = RoundedCornerShape(TangemTheme.dimens.radius12), - backgroundColor = TangemTheme.colors.background.primary, - elevation = TangemTheme.dimens.elevation2, - modifier = modifier, + Box( + modifier = modifier + .background( + shape = RoundedCornerShape(TangemTheme.dimens.radius12), + color = TangemTheme.colors.background.primary, + ) + .fillMaxSize(), ) { - Box(modifier = Modifier.fillMaxSize()) { - Column( - modifier = Modifier - .fillMaxWidth(), - verticalArrangement = Arrangement.Top, - horizontalAlignment = Alignment.Start, - ) { - Header( - balance = stringResource(id = R.string.swapping_token_not_available), - type = type, - ) + Column( + modifier = Modifier + .fillMaxWidth(), + verticalArrangement = Arrangement.Top, + horizontalAlignment = Alignment.Start, + ) { + Header( + balance = stringResource(id = R.string.swapping_token_not_available), + type = type, + ) - Content( - type = type, - amountEquivalent = amountEquivalent, - textFieldValue = textFieldValue, - priceImpact = null, - ) - } + Content( + type = type, + amountEquivalent = amountEquivalent, + textFieldValue = textFieldValue, + priceImpact = null, + ) + } - Box(modifier = Modifier.align(Alignment.BottomEnd)) { - Token( - tokenIconUrl = "", - tokenCurrency = "", - iconPlaceholder = R.drawable.ic_no_token_44, - ) - } + Box(modifier = Modifier.align(Alignment.BottomEnd)) { + Token( + tokenIconUrl = "", + tokenCurrency = "", + iconPlaceholder = R.drawable.ic_no_token_44, + ) + } - if (onChangeTokenClick != null) { - Box(modifier = Modifier.align(Alignment.CenterEnd)) { - ChangeTokenSelector() - } - Box( - Modifier - .align(Alignment.CenterEnd) - .height(TangemTheme.dimens.size116) - .width(TangemTheme.dimens.size102) - .clickable( - indication = rememberRipple(bounded = false), - interactionSource = remember { MutableInteractionSource() }, - ) { onChangeTokenClick() }, - ) + if (onChangeTokenClick != null) { + Box(modifier = Modifier.align(Alignment.CenterEnd)) { + ChangeTokenSelector() } + Box( + Modifier + .align(Alignment.CenterEnd) + .height(TangemTheme.dimens.size116) + .width(TangemTheme.dimens.size102) + .clickable( + indication = rememberRipple(bounded = false), + interactionSource = remember { MutableInteractionSource() }, + ) { onChangeTokenClick() }, + ) } } } @@ -372,6 +372,7 @@ private fun TokenIcon( color = iconBackgroundColor, shape = TangemTheme.shapes.roundedCorners8, ) + .clip(TangemTheme.shapes.roundedCorners8) val data = tokenIconUrl.ifEmpty { iconPlaceholder }