diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPaymentContentWrapper.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPaymentContentWrapper.kt index 70c0c48d08..d0af0290e3 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPaymentContentWrapper.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemPaymentContentWrapper.kt @@ -35,5 +35,7 @@ data class TimelineItemPaymentContentWrapper( val amountAda: String get() = paymentContent.amountAda val isTestnet: Boolean get() = paymentContent.isTestnet val truncatedTxHash: String? get() = paymentContent.truncatedTxHash + val truncatedToAddress: String get() = paymentContent.truncatedToAddress + val truncatedFromAddress: String get() = paymentContent.truncatedFromAddress val explorerUrl: String? get() = paymentContent.explorerUrl } diff --git a/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt b/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt index 05282b982b..6a3eeebc29 100644 --- a/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt +++ b/features/wallet/api/src/main/kotlin/io/element/android/features/wallet/api/timeline/TimelineItemPaymentContent.kt @@ -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. */ @@ -93,5 +105,16 @@ data class TimelineItemPaymentContent( "$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 + } + } } } diff --git a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentView.kt b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentView.kt index 9d883e51ca..4d4b8f0f4f 100644 --- a/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentView.kt +++ b/features/wallet/impl/src/main/kotlin/io/element/android/features/wallet/impl/timeline/TimelineItemPaymentView.kt @@ -51,6 +51,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight * * The card displays: * - ADA icon and amount + * - Recipient/sender address (truncated) * - Status indicator (spinner for pending, checkmark for confirmed, X for failed) * - Truncated transaction hash (tappable to open CardanoScan) * - Testnet badge when applicable @@ -113,7 +114,7 @@ fun TimelineItemPaymentView( Spacer(modifier = Modifier.height(12.dp)) - // Amount + // Amount - large and prominent Text( text = content.amountAda, style = MaterialTheme.typography.headlineMedium, @@ -121,9 +122,30 @@ fun TimelineItemPaymentView( 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)) - // Status row + // Status row with tx hash Row( verticalAlignment = Alignment.CenterVertically, 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) { Spacer(modifier = Modifier.height(8.dp)) Text(