Updated on 2026-08-14
This commit is contained in:
parent
cf021480f9
commit
a14eaba613
10 changed files with 77 additions and 26 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="20"
|
||||
android:viewportHeight="20">
|
||||
|
||||
<path
|
||||
android:fillColor="#000000"
|
||||
android:pathData="M5.833,12.5H7.5C7.5,13.4 8.642,14.167 10,14.167C11.358,14.167 12.5,13.4 12.5,12.5C12.5,11.583 11.633,11.25 9.8,10.808C8.033,10.367 5.833,9.817 5.833,7.5C5.833,6.008 7.058,4.742 8.75,4.317V2.5H11.25V4.317C12.942,4.742 14.167,6.008 14.167,7.5H12.5C12.5,6.6 11.358,5.833 10,5.833C8.642,5.833 7.5,6.6 7.5,7.5C7.5,8.417 8.367,8.75 10.2,9.192C11.967,9.633 14.167,10.183 14.167,12.5C14.167,13.992 12.942,15.258 11.25,15.683V17.5H8.75V15.683C7.058,15.258 5.833,13.992 5.833,12.5Z" />
|
||||
|
||||
</vector>
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String>) : InteractionAddressType()
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
|
|
|||
|
|
@ -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 ^
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue