diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt
index 7df1982a29..57a1fd52ff 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TransactionState.kt
@@ -36,9 +36,9 @@ sealed interface TransactionState {
) : TransactionState {
sealed class Status {
- object Failed : Status()
- object Confirmed : Status()
- object Unconfirmed : Status()
+ data object Failed : Status()
+ data object Confirmed : Status()
+ data object Unconfirmed : Status()
}
enum class Direction {
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.xml
new file mode 100644
index 0000000000..008a7841c7
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_transaction_history_staking.xml
@@ -0,0 +1,9 @@
+
+
+
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.xml
new file mode 100644
index 0000000000..3b3961cf9a
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_transaction_history_unstaking.xml
@@ -0,0 +1,10 @@
+
+
+
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 34200f0d8c..0df50f5899 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
@@ -54,17 +54,13 @@ internal class SdkTransactionHistoryItemConverter(
} else {
mapToInteractionAddressType(sourceType = sourceType)
}
+ is SdkTransactionHistoryItem.TransactionType.TronStakingTransactionType -> {
+ TxHistoryItem.InteractionAddressType.Staking
+ }
+
is SdkTransactionHistoryItem.TransactionType.ContractMethod,
is SdkTransactionHistoryItem.TransactionType.ContractMethodName,
-> mapToInteractionAddressType(destinationType)
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.FreezeBalanceV2Contract ->
- mapToInteractionAddressType(destinationType) // todo map correct [REDACTED_JIRA]
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.UnfreezeBalanceV2Contract ->
- mapToInteractionAddressType(destinationType) // todo map correct [REDACTED_JIRA]
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.VoteWitnessContract ->
- mapToInteractionAddressType(destinationType) // todo map correct [REDACTED_JIRA]
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.WithdrawBalanceContract ->
- mapToInteractionAddressType(destinationType) // todo map correct [REDACTED_JIRA]
}
}
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 e061f80d14..e62cd5b7eb 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
@@ -1,29 +1,37 @@
package com.tangem.domain.walletmanager.utils
-import com.tangem.blockchain.transactionhistory.models.TransactionHistoryItem
+import com.tangem.blockchain.transactionhistory.models.TransactionHistoryItem.TransactionType
import com.tangem.domain.txhistory.models.TxHistoryItem
import com.tangem.domain.walletmanager.model.SmartContractMethod
import com.tangem.utils.converter.Converter
internal class SdkTransactionTypeConverter(
private val smartContractMethods: Map,
-) : Converter {
+) : Converter {
- override fun convert(value: TransactionHistoryItem.TransactionType): TxHistoryItem.TransactionType {
+ override fun convert(value: TransactionType): TxHistoryItem.TransactionType {
return when (value) {
- is TransactionHistoryItem.TransactionType.ContractMethod ->
+ is TransactionType.ContractMethod -> {
getTransactionType(methodName = smartContractMethods[value.id]?.name)
- is TransactionHistoryItem.TransactionType.ContractMethodName -> getTransactionType(methodName = value.name)
- is TransactionHistoryItem.TransactionType.Transfer -> TxHistoryItem.TransactionType.Transfer
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.FreezeBalanceV2Contract ->
- TxHistoryItem.TransactionType.Transfer // TODO map correct [REDACTED_JIRA]
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.UnfreezeBalanceV2Contract ->
- TxHistoryItem.TransactionType.Transfer // TODO map correct [REDACTED_JIRA]
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.VoteWitnessContract ->
- TxHistoryItem
- .TransactionType.Transfer // TODO map correct [REDACTED_JIRA]
- TransactionHistoryItem.TransactionType.TronStakingTransactionType.WithdrawBalanceContract ->
- TxHistoryItem.TransactionType.Transfer // TODO map correct [REDACTED_JIRA]
+ }
+ is TransactionType.ContractMethodName -> {
+ getTransactionType(methodName = value.name)
+ }
+ is TransactionType.Transfer -> {
+ TxHistoryItem.TransactionType.Transfer
+ }
+ is TransactionType.TronStakingTransactionType.FreezeBalanceV2Contract -> {
+ TxHistoryItem.TransactionType.TronStakingTransactionType.Stake
+ }
+ is TransactionType.TronStakingTransactionType.UnfreezeBalanceV2Contract -> {
+ TxHistoryItem.TransactionType.TronStakingTransactionType.Unstake
+ }
+ is TransactionType.TronStakingTransactionType.VoteWitnessContract -> {
+ TxHistoryItem.TransactionType.TronStakingTransactionType.Vote
+ }
+ is TransactionType.TronStakingTransactionType.WithdrawBalanceContract -> {
+ 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 beaa4a031b..68677bdd63 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
@@ -33,20 +33,28 @@ data class TxHistoryItem(
}
sealed interface TransactionType {
- object Transfer : TransactionType
- object Approve : TransactionType
- object Swap : TransactionType
- object UnknownOperation : TransactionType
+ data object Transfer : TransactionType
+ data object Approve : TransactionType
+ data object Swap : TransactionType
+ data object UnknownOperation : TransactionType
data class Operation(val name: String) : TransactionType
+
+ sealed interface TronStakingTransactionType : TransactionType {
+ data object Vote : TronStakingTransactionType
+ data object Withdraw : TronStakingTransactionType
+ data object Stake : TronStakingTransactionType
+ data object Unstake : TronStakingTransactionType
+ }
}
sealed class TransactionStatus {
- object Failed : TransactionStatus()
- object Unconfirmed : TransactionStatus()
- object Confirmed : TransactionStatus()
+ data object Failed : TransactionStatus()
+ data object Unconfirmed : TransactionStatus()
+ data object Confirmed : TransactionStatus()
}
sealed class InteractionAddressType {
+ data object Staking : 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 3aacd1221a..5eea986141 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
@@ -1,5 +1,6 @@
package com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.txhistory
+import com.tangem.common.extensions.isZero
import com.tangem.core.ui.components.transactions.state.TransactionState
import com.tangem.core.ui.components.transactions.state.TransactionState.Content.Direction
import com.tangem.core.ui.extensions.TextReference
@@ -8,6 +9,7 @@ import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.utils.toTimeFormat
import com.tangem.domain.txhistory.models.TxHistoryItem
+import com.tangem.domain.txhistory.models.TxHistoryItem.*
import com.tangem.feature.tokendetails.presentation.tokendetails.viewmodels.TokenDetailsClickIntents
import com.tangem.features.tokendetails.impl.R
import com.tangem.utils.StringsSigns.MINUS
@@ -42,34 +44,44 @@ internal class TokenDetailsTxHistoryTransactionStateConverter(
)
}
- private fun TxHistoryItem.extractIcon(): Int = if (status == TxHistoryItem.TransactionStatus.Failed) {
+ private fun TxHistoryItem.extractIcon(): Int = if (status == TransactionStatus.Failed) {
R.drawable.ic_close_24
} else {
when (type) {
- is TxHistoryItem.TransactionType.Approve -> R.drawable.ic_doc_24
- is TxHistoryItem.TransactionType.Operation,
- is TxHistoryItem.TransactionType.Swap,
- is TxHistoryItem.TransactionType.Transfer,
- is TxHistoryItem.TransactionType.UnknownOperation,
+ 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,
+ is TransactionType.TronStakingTransactionType.Unstake,
+ -> R.drawable.ic_transaction_history_unstaking
+ is TransactionType.Operation,
+ is TransactionType.Swap,
+ is TransactionType.Transfer,
+ is TransactionType.UnknownOperation,
-> if (isOutgoing) R.drawable.ic_arrow_up_24 else R.drawable.ic_arrow_down_24
}
}
private fun TxHistoryItem.extractTitle(): TextReference = when (val type = type) {
- is TxHistoryItem.TransactionType.Approve -> resourceReference(R.string.common_approval)
- is TxHistoryItem.TransactionType.Operation -> stringReference(type.name)
- is TxHistoryItem.TransactionType.Swap -> resourceReference(R.string.common_swap)
- is TxHistoryItem.TransactionType.Transfer -> resourceReference(R.string.common_transfer)
- is TxHistoryItem.TransactionType.UnknownOperation -> resourceReference(R.string.transaction_history_operation)
+ is TransactionType.Approve -> resourceReference(R.string.common_approval)
+ is TransactionType.Operation -> stringReference(type.name)
+ is TransactionType.Swap -> resourceReference(R.string.common_swap)
+ is TransactionType.Transfer -> resourceReference(R.string.common_transfer)
+ is TransactionType.UnknownOperation -> resourceReference(R.string.transaction_history_operation)
+ 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)
}
private fun TxHistoryItem.extractSubtitle(): TextReference =
when (val interactionAddress = interactionAddressType) {
- is TxHistoryItem.InteractionAddressType.Contract -> resourceReference(
+ is InteractionAddressType.Contract -> resourceReference(
id = R.string.transaction_history_contract_address,
formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()),
)
- is TxHistoryItem.InteractionAddressType.Multiple -> resourceReference(
+ is InteractionAddressType.Multiple -> resourceReference(
id = if (isOutgoing) {
R.string.transaction_history_transaction_to_address
} else {
@@ -77,7 +89,7 @@ internal class TokenDetailsTxHistoryTransactionStateConverter(
},
formatArgs = wrappedList(resourceReference(R.string.transaction_history_multiple_addresses)),
)
- is TxHistoryItem.InteractionAddressType.User -> resourceReference(
+ is InteractionAddressType.User -> resourceReference(
id = if (isOutgoing) {
R.string.transaction_history_transaction_to_address
} else {
@@ -85,19 +97,28 @@ internal class TokenDetailsTxHistoryTransactionStateConverter(
},
formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()),
)
+ is InteractionAddressType.Staking -> resourceReference(
+ id = R.string.common_staking,
+ )
}
private fun TxHistoryItem.extractDirection() = if (isOutgoing) Direction.OUTGOING else Direction.INCOMING
- private fun TxHistoryItem.TransactionStatus.tiUiStatus() = when (this) {
- TxHistoryItem.TransactionStatus.Confirmed -> TransactionState.Content.Status.Confirmed
- TxHistoryItem.TransactionStatus.Failed -> TransactionState.Content.Status.Failed
- TxHistoryItem.TransactionStatus.Unconfirmed -> TransactionState.Content.Status.Unconfirmed
+ private fun TransactionStatus.tiUiStatus() = when (this) {
+ TransactionStatus.Confirmed -> TransactionState.Content.Status.Confirmed
+ TransactionStatus.Failed -> TransactionState.Content.Status.Failed
+ TransactionStatus.Unconfirmed -> TransactionState.Content.Status.Unconfirmed
}
private fun TxHistoryItem.getAmount(): String {
- val prefix = when (status) {
- TxHistoryItem.TransactionStatus.Failed -> ""
+ if (type == TransactionType.TronStakingTransactionType.Vote ||
+ type == TransactionType.TronStakingTransactionType.Withdraw
+ ) {
+ return ""
+ }
+ val prefix = when {
+ status == TransactionStatus.Failed -> ""
+ this.amount.isZero() -> ""
else -> if (isOutgoing) MINUS else PLUS
}
return prefix + amount.toFormattedCurrencyString(currency = symbol, decimals = decimals)
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 45a7931776..f37407d469 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
@@ -1,5 +1,6 @@
package com.tangem.feature.wallet.presentation.wallet.state.transformers.converter
+import com.tangem.common.extensions.isZero
import com.tangem.core.ui.components.transactions.state.TransactionState
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
@@ -7,6 +8,7 @@ import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.core.ui.utils.toTimeFormat
import com.tangem.domain.txhistory.models.TxHistoryItem
+import com.tangem.domain.txhistory.models.TxHistoryItem.*
import com.tangem.feature.wallet.impl.R
import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntents
import com.tangem.utils.StringsSigns.MINUS
@@ -41,34 +43,44 @@ internal class TxHistoryItemStateConverter(
)
}
- private fun TxHistoryItem.extractIcon(): Int = if (status == TxHistoryItem.TransactionStatus.Failed) {
+ private fun TxHistoryItem.extractIcon(): Int = if (status == TransactionStatus.Failed) {
R.drawable.ic_close_24
} else {
when (type) {
- is TxHistoryItem.TransactionType.Approve -> R.drawable.ic_doc_24
- is TxHistoryItem.TransactionType.Operation,
- is TxHistoryItem.TransactionType.Swap,
- is TxHistoryItem.TransactionType.Transfer,
- is TxHistoryItem.TransactionType.UnknownOperation,
+ 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,
+ is TransactionType.TronStakingTransactionType.Unstake,
+ -> R.drawable.ic_transaction_history_unstaking
+ is TransactionType.Operation,
+ is TransactionType.Swap,
+ is TransactionType.Transfer,
+ is TransactionType.UnknownOperation,
-> if (isOutgoing) R.drawable.ic_arrow_up_24 else R.drawable.ic_arrow_down_24
}
}
private fun TxHistoryItem.extractTitle(): TextReference = when (val type = type) {
- is TxHistoryItem.TransactionType.Approve -> resourceReference(R.string.common_approval)
- is TxHistoryItem.TransactionType.Operation -> stringReference(type.name)
- is TxHistoryItem.TransactionType.Swap -> resourceReference(R.string.common_swap)
- is TxHistoryItem.TransactionType.Transfer -> resourceReference(R.string.common_transfer)
- is TxHistoryItem.TransactionType.UnknownOperation -> resourceReference(R.string.transaction_history_operation)
+ is TransactionType.Approve -> resourceReference(R.string.common_approval)
+ is TransactionType.Operation -> stringReference(type.name)
+ is TransactionType.Swap -> resourceReference(R.string.common_swap)
+ is TransactionType.Transfer -> resourceReference(R.string.common_transfer)
+ 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.UnknownOperation -> resourceReference(R.string.transaction_history_operation)
}
private fun TxHistoryItem.extractSubtitle(): TextReference =
when (val interactionAddress = interactionAddressType) {
- is TxHistoryItem.InteractionAddressType.Contract -> resourceReference(
+ is InteractionAddressType.Contract -> resourceReference(
id = R.string.transaction_history_contract_address,
formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()),
)
- is TxHistoryItem.InteractionAddressType.Multiple -> resourceReference(
+ is InteractionAddressType.Multiple -> resourceReference(
id = if (isOutgoing) {
R.string.transaction_history_transaction_to_address
} else {
@@ -76,7 +88,7 @@ internal class TxHistoryItemStateConverter(
},
formatArgs = wrappedList(resourceReference(R.string.transaction_history_multiple_addresses)),
)
- is TxHistoryItem.InteractionAddressType.User -> resourceReference(
+ is InteractionAddressType.User -> resourceReference(
id = if (isOutgoing) {
R.string.transaction_history_transaction_to_address
} else {
@@ -84,20 +96,29 @@ internal class TxHistoryItemStateConverter(
},
formatArgs = wrappedList(interactionAddress.address.toBriefAddressFormat()),
)
+ is InteractionAddressType.Staking -> resourceReference(
+ id = R.string.common_staking,
+ )
}
private fun TxHistoryItem.extractDirection() =
if (isOutgoing) TransactionState.Content.Direction.OUTGOING else TransactionState.Content.Direction.INCOMING
- private fun TxHistoryItem.TransactionStatus.tiUiStatus() = when (this) {
- TxHistoryItem.TransactionStatus.Confirmed -> TransactionState.Content.Status.Confirmed
- TxHistoryItem.TransactionStatus.Failed -> TransactionState.Content.Status.Failed
- TxHistoryItem.TransactionStatus.Unconfirmed -> TransactionState.Content.Status.Unconfirmed
+ private fun TransactionStatus.tiUiStatus() = when (this) {
+ TransactionStatus.Confirmed -> TransactionState.Content.Status.Confirmed
+ TransactionStatus.Failed -> TransactionState.Content.Status.Failed
+ TransactionStatus.Unconfirmed -> TransactionState.Content.Status.Unconfirmed
}
private fun TxHistoryItem.getAmount(): String {
- val prefix = when (status) {
- TxHistoryItem.TransactionStatus.Failed -> ""
+ if (type == TransactionType.TronStakingTransactionType.Vote ||
+ type == TransactionType.TronStakingTransactionType.Withdraw
+ ) {
+ return ""
+ }
+ val prefix = when {
+ status == TransactionStatus.Failed -> ""
+ this.amount.isZero() -> ""
else -> if (isOutgoing) MINUS else PLUS
}
return prefix + amount.toFormattedCurrencyString(currency = symbol, decimals = decimals)