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)