feat(wallet): add recipient address to payment card UI
Enhanced the payment timeline card to display the recipient/sender address: - Added truncatedToAddress and truncatedFromAddress to TimelineItemPaymentContent - New truncateAddress() helper (first 8 + last 6 chars) - Payment card now shows "To: addr_tes...ytjqp" for sent payments - And "From: addr_tes...pd0hq" for received payments - Updated wrapper to expose new properties The card now displays: - Amount in ADA (large, bold) - Sent/Received indicator with Cardano icon - Truncated recipient/sender address - Status chip (Pending/Confirmed/Failed with icons) - Truncated tx hash (tappable to CardanoScan) - Testnet badge when applicable - "View on CardanoScan →" link for confirmed transactions
This commit is contained in:
parent
faa6f768f6
commit
699807e1bd
3 changed files with 50 additions and 3 deletions
|
|
@ -35,5 +35,7 @@ data class TimelineItemPaymentContentWrapper(
|
||||||
val amountAda: String get() = paymentContent.amountAda
|
val amountAda: String get() = paymentContent.amountAda
|
||||||
val isTestnet: Boolean get() = paymentContent.isTestnet
|
val isTestnet: Boolean get() = paymentContent.isTestnet
|
||||||
val truncatedTxHash: String? get() = paymentContent.truncatedTxHash
|
val truncatedTxHash: String? get() = paymentContent.truncatedTxHash
|
||||||
|
val truncatedToAddress: String get() = paymentContent.truncatedToAddress
|
||||||
|
val truncatedFromAddress: String get() = paymentContent.truncatedFromAddress
|
||||||
val explorerUrl: String? get() = paymentContent.explorerUrl
|
val explorerUrl: String? get() = paymentContent.explorerUrl
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,18 @@ data class TimelineItemPaymentContent(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncated recipient address for display (first 8 + last 6 chars).
|
||||||
|
*/
|
||||||
|
val truncatedToAddress: String
|
||||||
|
get() = truncateAddress(toAddress)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncated sender address for display (first 8 + last 6 chars).
|
||||||
|
*/
|
||||||
|
val truncatedFromAddress: String
|
||||||
|
get() = truncateAddress(fromAddress)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CardanoScan URL for viewing the transaction.
|
* CardanoScan URL for viewing the transaction.
|
||||||
*/
|
*/
|
||||||
|
|
@ -93,5 +105,16 @@ data class TimelineItemPaymentContent(
|
||||||
"$formatted ADA"
|
"$formatted ADA"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate a Cardano address for display (first 8 + last 6 chars).
|
||||||
|
*/
|
||||||
|
fun truncateAddress(address: String): String {
|
||||||
|
return if (address.length > 18) {
|
||||||
|
"${address.take(8)}...${address.takeLast(6)}"
|
||||||
|
} else {
|
||||||
|
address
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
*
|
*
|
||||||
* The card displays:
|
* The card displays:
|
||||||
* - ADA icon and amount
|
* - ADA icon and amount
|
||||||
|
* - Recipient/sender address (truncated)
|
||||||
* - Status indicator (spinner for pending, checkmark for confirmed, X for failed)
|
* - Status indicator (spinner for pending, checkmark for confirmed, X for failed)
|
||||||
* - Truncated transaction hash (tappable to open CardanoScan)
|
* - Truncated transaction hash (tappable to open CardanoScan)
|
||||||
* - Testnet badge when applicable
|
* - Testnet badge when applicable
|
||||||
|
|
@ -113,7 +114,7 @@ fun TimelineItemPaymentView(
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(12.dp))
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
|
||||||
// Amount
|
// Amount - large and prominent
|
||||||
Text(
|
Text(
|
||||||
text = content.amountAda,
|
text = content.amountAda,
|
||||||
style = MaterialTheme.typography.headlineMedium,
|
style = MaterialTheme.typography.headlineMedium,
|
||||||
|
|
@ -121,9 +122,30 @@ fun TimelineItemPaymentView(
|
||||||
color = contentColor,
|
color = contentColor,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
|
|
||||||
|
// Recipient/sender address
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = if (content.isSentByMe) "To: " else "From: ",
|
||||||
|
style = MaterialTheme.typography.bodySmall,
|
||||||
|
color = contentColor.copy(alpha = 0.6f),
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = if (content.isSentByMe) content.truncatedToAddress else content.truncatedFromAddress,
|
||||||
|
style = MaterialTheme.typography.bodySmall,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
color = contentColor.copy(alpha = 0.8f),
|
||||||
|
maxLines = 1,
|
||||||
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(12.dp))
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
|
||||||
// Status row
|
// Status row with tx hash
|
||||||
Row(
|
Row(
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
|
@ -151,7 +173,7 @@ fun TimelineItemPaymentView(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// View on explorer link (only for confirmed)
|
// View on explorer link (only for confirmed with tx hash)
|
||||||
if (content.status == PaymentCardStatus.CONFIRMED && content.explorerUrl != null) {
|
if (content.status == PaymentCardStatus.CONFIRMED && content.explorerUrl != null) {
|
||||||
Spacer(modifier = Modifier.height(8.dp))
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
Text(
|
Text(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue