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 ^