diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt index 91efa949e6..af0ff0f89b 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/Transaction.kt @@ -20,8 +20,10 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider +import androidx.constraintlayout.compose.ChainStyle import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension +import androidx.constraintlayout.compose.Visibility import com.tangem.core.ui.R import com.tangem.core.ui.components.CircleShimmer import com.tangem.core.ui.components.RectangleShimmer @@ -68,6 +70,9 @@ fun Transaction(state: TransactionState, isBalanceHidden: Boolean, modifier: Mod ConstraintLayout(modifier = Modifier.fillMaxWidth()) { val (iconItem, titleItem, subtitleItem, amountItem, timestampItem) = createRefs() + createVerticalChain(titleItem, subtitleItem, chainStyle = ChainStyle.Spread) + createVerticalChain(amountItem, timestampItem, chainStyle = ChainStyle.Spread) + Icon( state = state, modifier = Modifier @@ -102,6 +107,7 @@ fun Transaction(state: TransactionState, isBalanceHidden: Boolean, modifier: Mod end = TangemTheme.dimens.spacing4, ) .constrainAs(subtitleItem) { + visibility = state.isGoneIf { subtitle.isNullOrEmpty() } top.linkTo(titleItem.bottom) bottom.linkTo(parent.bottom) start.linkTo(iconItem.end) @@ -114,6 +120,7 @@ fun Transaction(state: TransactionState, isBalanceHidden: Boolean, modifier: Mod state = state, isBalanceHidden = isBalanceHidden, modifier = Modifier.constrainAs(amountItem) { + visibility = state.isGoneIf { amount.isEmpty() } top.linkTo(parent.top) bottom.linkTo(timestampItem.top) start.linkTo(titleItem.end) @@ -315,6 +322,10 @@ private fun LockedContent(modifier: Modifier = Modifier) { ) } +private fun TransactionState.isGoneIf(goneCondition: TransactionState.Content.() -> Boolean): Visibility { + return if ((this as? TransactionState.Content)?.goneCondition() == true) Visibility.Gone else Visibility.Visible +} + @Preview(showBackground = true, widthDp = 368) @Preview(showBackground = true, widthDp = 368, uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable diff --git a/core/ui/src/main/res/drawable/ic_transaction_history_claim_rewards_24.xml b/core/ui/src/main/res/drawable/ic_transaction_history_claim_rewards_24.xml new file mode 100644 index 0000000000..8fb3cae98f --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_transaction_history_claim_rewards_24.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/core/ui/src/main/res/drawable/ic_transaction_history_staking.xml b/core/ui/src/main/res/drawable/ic_transaction_history_staking_24.xml similarity index 100% rename from core/ui/src/main/res/drawable/ic_transaction_history_staking.xml rename to core/ui/src/main/res/drawable/ic_transaction_history_staking_24.xml diff --git a/core/ui/src/main/res/drawable/ic_transaction_history_unstaking.xml b/core/ui/src/main/res/drawable/ic_transaction_history_unstaking_24.xml similarity index 100% rename from core/ui/src/main/res/drawable/ic_transaction_history_unstaking.xml rename to core/ui/src/main/res/drawable/ic_transaction_history_unstaking_24.xml diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionHistoryItemConverter.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionHistoryItemConverter.kt index 0df50f5899..220172ebc0 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionHistoryItemConverter.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionHistoryItemConverter.kt @@ -45,22 +45,25 @@ internal class SdkTransactionHistoryItemConverter( private fun SdkTransactionHistoryItem.AddressType.toDomain(): TxHistoryItem.AddressType = when (this) { is SdkTransactionHistoryItem.AddressType.Contract -> TxHistoryItem.AddressType.Contract(address) is SdkTransactionHistoryItem.AddressType.User -> TxHistoryItem.AddressType.User(address) + is SdkTransactionHistoryItem.AddressType.Validator -> TxHistoryItem.AddressType.Validator(address) } - private fun SdkTransactionHistoryItem.extractInteractionAddressType(): TxHistoryItem.InteractionAddressType { - return when (type) { + private fun SdkTransactionHistoryItem.extractInteractionAddressType(): TxHistoryItem.InteractionAddressType? { + return when (val transactionType = type) { SdkTransactionHistoryItem.TransactionType.Transfer -> if (isOutgoing) { mapToInteractionAddressType(destinationType = destinationType) } else { mapToInteractionAddressType(sourceType = sourceType) } - is SdkTransactionHistoryItem.TransactionType.TronStakingTransactionType -> { - TxHistoryItem.InteractionAddressType.Staking - } is SdkTransactionHistoryItem.TransactionType.ContractMethod, is SdkTransactionHistoryItem.TransactionType.ContractMethodName, - -> mapToInteractionAddressType(destinationType) + -> mapToInteractionAddressType(destinationType = destinationType) + + is SdkTransactionHistoryItem.TransactionType.TronStakingTransactionType.VoteWitnessContract -> { + TxHistoryItem.InteractionAddressType.Validator(address = transactionType.validatorAddress) + } + else -> null } } @@ -78,6 +81,9 @@ internal class SdkTransactionHistoryItemConverter( is TransactionHistoryItem.AddressType.User -> TxHistoryItem.InteractionAddressType.User( destinationType.addressType.address, ) + is TransactionHistoryItem.AddressType.Validator -> TxHistoryItem.InteractionAddressType.Validator( + destinationType.addressType.address, + ) } } } @@ -89,7 +95,9 @@ internal class SdkTransactionHistoryItemConverter( is TransactionHistoryItem.SourceType.Multiple -> TxHistoryItem.InteractionAddressType.Multiple( sourceType.addresses, ) - is TransactionHistoryItem.SourceType.Single -> TxHistoryItem.InteractionAddressType.User(sourceType.address) + is TransactionHistoryItem.SourceType.Single -> { + TxHistoryItem.InteractionAddressType.User(sourceType.address) + } } } } \ No newline at end of file diff --git a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionTypeConverter.kt b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionTypeConverter.kt index e62cd5b7eb..306c18cf6a 100644 --- a/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionTypeConverter.kt +++ b/domain/legacy/src/main/java/com/tangem/domain/walletmanager/utils/SdkTransactionTypeConverter.kt @@ -27,9 +27,12 @@ internal class SdkTransactionTypeConverter( TxHistoryItem.TransactionType.TronStakingTransactionType.Unstake } is TransactionType.TronStakingTransactionType.VoteWitnessContract -> { - TxHistoryItem.TransactionType.TronStakingTransactionType.Vote + TxHistoryItem.TransactionType.TronStakingTransactionType.Vote(value.validatorAddress) } is TransactionType.TronStakingTransactionType.WithdrawBalanceContract -> { + TxHistoryItem.TransactionType.TronStakingTransactionType.ClaimRewards + } + is TransactionType.TronStakingTransactionType.WithdrawExpireUnfreezeContract -> { TxHistoryItem.TransactionType.TronStakingTransactionType.Withdraw } } diff --git a/domain/txhistory/models/src/main/kotlin/com/tangem/domain/txhistory/models/TxHistoryItem.kt b/domain/txhistory/models/src/main/kotlin/com/tangem/domain/txhistory/models/TxHistoryItem.kt index 68677bdd63..f96905a1ed 100644 --- a/domain/txhistory/models/src/main/kotlin/com/tangem/domain/txhistory/models/TxHistoryItem.kt +++ b/domain/txhistory/models/src/main/kotlin/com/tangem/domain/txhistory/models/TxHistoryItem.kt @@ -8,7 +8,7 @@ data class TxHistoryItem( val isOutgoing: Boolean, val destinationType: DestinationType, val sourceType: SourceType, - val interactionAddressType: InteractionAddressType, + val interactionAddressType: InteractionAddressType?, val status: TransactionStatus, val type: TransactionType, val amount: BigDecimal, @@ -30,6 +30,7 @@ data class TxHistoryItem( data class User(override val address: String) : AddressType() data class Contract(override val address: String) : AddressType() + data class Validator(override val address: String) : AddressType() } sealed interface TransactionType { @@ -40,10 +41,11 @@ data class TxHistoryItem( data class Operation(val name: String) : TransactionType sealed interface TronStakingTransactionType : TransactionType { - data object Vote : TronStakingTransactionType - data object Withdraw : TronStakingTransactionType + data class Vote(val validatorAddress: String) : TronStakingTransactionType + data object ClaimRewards : TronStakingTransactionType data object Stake : TronStakingTransactionType data object Unstake : TronStakingTransactionType + data object Withdraw : TronStakingTransactionType } } @@ -54,7 +56,7 @@ data class TxHistoryItem( } sealed class InteractionAddressType { - data object Staking : InteractionAddressType() + data class Validator(val address: String) : InteractionAddressType() data class User(val address: String) : InteractionAddressType() data class Contract(val address: String) : InteractionAddressType() data class Multiple(val addresses: List) : InteractionAddressType() diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt index 5eea986141..0d0b59e987 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryTransactionStateConverter.kt @@ -51,10 +51,12 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( is TransactionType.Approve -> R.drawable.ic_doc_24 is TransactionType.TronStakingTransactionType.Stake, is TransactionType.TronStakingTransactionType.Vote, - -> R.drawable.ic_transaction_history_staking - is TransactionType.TronStakingTransactionType.Withdraw, + -> R.drawable.ic_transaction_history_staking_24 + is TransactionType.TronStakingTransactionType.ClaimRewards, + -> R.drawable.ic_transaction_history_claim_rewards_24 is TransactionType.TronStakingTransactionType.Unstake, - -> R.drawable.ic_transaction_history_unstaking + is TransactionType.TronStakingTransactionType.Withdraw, + -> R.drawable.ic_transaction_history_unstaking_24 is TransactionType.Operation, is TransactionType.Swap, is TransactionType.Transfer, @@ -72,6 +74,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( is TransactionType.TronStakingTransactionType.Stake -> resourceReference(R.string.common_stake) is TransactionType.TronStakingTransactionType.Unstake -> resourceReference(R.string.common_unstake) is TransactionType.TronStakingTransactionType.Vote -> resourceReference(R.string.staking_vote) + is TransactionType.TronStakingTransactionType.ClaimRewards -> resourceReference(R.string.common_claim_rewards) is TransactionType.TronStakingTransactionType.Withdraw -> resourceReference(R.string.staking_withdraw) } @@ -97,9 +100,13 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( }, formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()), ) - is InteractionAddressType.Staking -> resourceReference( - id = R.string.common_staking, + is InteractionAddressType.Validator -> resourceReference( + id = R.string.transaction_history_transaction_validator, + formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()), ) + null -> { + TextReference.EMPTY + } } private fun TxHistoryItem.extractDirection() = if (isOutgoing) Direction.OUTGOING else Direction.INCOMING @@ -111,7 +118,8 @@ internal class TokenDetailsTxHistoryTransactionStateConverter( } private fun TxHistoryItem.getAmount(): String { - if (type == TransactionType.TronStakingTransactionType.Vote || + if (type is TransactionType.TronStakingTransactionType.Vote || + type == TransactionType.TronStakingTransactionType.ClaimRewards || type == TransactionType.TronStakingTransactionType.Withdraw ) { return "" diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TxHistoryItemStateConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TxHistoryItemStateConverter.kt index f37407d469..2d162a17c0 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TxHistoryItemStateConverter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/converter/TxHistoryItemStateConverter.kt @@ -50,10 +50,12 @@ internal class TxHistoryItemStateConverter( is TransactionType.Approve -> R.drawable.ic_doc_24 is TransactionType.TronStakingTransactionType.Stake, is TransactionType.TronStakingTransactionType.Vote, - -> R.drawable.ic_transaction_history_staking - is TransactionType.TronStakingTransactionType.Withdraw, + -> R.drawable.ic_transaction_history_staking_24 + is TransactionType.TronStakingTransactionType.ClaimRewards, + -> R.drawable.ic_transaction_history_claim_rewards_24 is TransactionType.TronStakingTransactionType.Unstake, - -> R.drawable.ic_transaction_history_unstaking + is TransactionType.TronStakingTransactionType.Withdraw, + -> R.drawable.ic_transaction_history_unstaking_24 is TransactionType.Operation, is TransactionType.Swap, is TransactionType.Transfer, @@ -70,7 +72,8 @@ internal class TxHistoryItemStateConverter( is TransactionType.TronStakingTransactionType.Stake -> resourceReference(R.string.common_stake) is TransactionType.TronStakingTransactionType.Unstake -> resourceReference(R.string.common_unstake) is TransactionType.TronStakingTransactionType.Vote -> resourceReference(R.string.staking_vote) - is TransactionType.TronStakingTransactionType.Withdraw -> resourceReference(R.string.staking_withdraw) + is TransactionType.TronStakingTransactionType.ClaimRewards -> resourceReference(R.string.common_claim_rewards) + is TransactionType.TronStakingTransactionType.Withdraw -> { resourceReference(R.string.staking_withdraw) } is TransactionType.UnknownOperation -> resourceReference(R.string.transaction_history_operation) } @@ -96,9 +99,13 @@ internal class TxHistoryItemStateConverter( }, formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()), ) - is InteractionAddressType.Staking -> resourceReference( - id = R.string.common_staking, + is InteractionAddressType.Validator -> resourceReference( + id = R.string.transaction_history_transaction_validator, + formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()), ) + null -> { + TextReference.EMPTY + } } private fun TxHistoryItem.extractDirection() = @@ -111,7 +118,8 @@ internal class TxHistoryItemStateConverter( } private fun TxHistoryItem.getAmount(): String { - if (type == TransactionType.TronStakingTransactionType.Vote || + if (type is TransactionType.TronStakingTransactionType.Vote || + type == TransactionType.TronStakingTransactionType.ClaimRewards || type == TransactionType.TronStakingTransactionType.Withdraw ) { return "" diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index a000c4d191..aaf2b34885 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -89,7 +89,7 @@ markdownComposeView = "0.5.4" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "release-app_5.15-781" +tangemBlockchainSdk = "release-app_5.15-796" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "release-app_5.15-384" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^