Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
Expand All @@ -14,12 +12,9 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
Expand All @@ -31,17 +26,15 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay
import org.bitcoinppl.cove.R
import org.bitcoinppl.cove.ui.theme.CoveColor
import org.bitcoinppl.cove_core.TransactionDetails
import java.text.NumberFormat

@Composable
internal fun ReceivedTransactionDetails(
Expand All @@ -54,7 +47,48 @@ internal fun ReceivedTransactionDetails(
val fg = MaterialTheme.colorScheme.onBackground

Column(modifier = Modifier.fillMaxWidth()) {
// received at address with copy button
// for confirmed transactions, show Confirmations and Block Number first (matching iOS)
if (transactionDetails.isConfirmed()) {
// Confirmations row
Text(
stringResource(R.string.label_confirmations),
color = sub,
fontSize = 12.sp,
)
Spacer(Modifier.height(8.dp))
if (numberOfConfirmations != null) {
Text(
NumberFormat.getNumberInstance().format(numberOfConfirmations),
color = fg,
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
)
} else {
CircularProgressIndicator(
modifier = Modifier.size(16.dp),
strokeWidth = 2.dp,
color = fg,
)
}
Spacer(Modifier.height(14.dp))

// Block Number row
Text(
stringResource(R.string.label_block_number),
color = sub,
fontSize = 12.sp,
)
Spacer(Modifier.height(8.dp))
Text(
transactionDetails.blockNumberFmt() ?: "",
color = fg,
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
)
Spacer(Modifier.height(14.dp))
}

// "Received At" section with address and copy button
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.Top,
Expand Down Expand Up @@ -107,42 +141,5 @@ internal fun ReceivedTransactionDetails(
isCopied = false
}
}

// show block number and confirmations for confirmed received transactions
if (transactionDetails.isConfirmed() && numberOfConfirmations != null) {
Spacer(Modifier.height(8.dp))
Row(verticalAlignment = Alignment.CenterVertically) {
val blockNumber = transactionDetails.blockNumberFmt()
if (blockNumber != null) {
Text(
blockNumber,
color = sub,
fontSize = 14.sp,
)
Text(" | ", color = sub, fontSize = 14.sp)
}
Text(
numberOfConfirmations.toString(),
color = sub,
fontSize = 14.sp,
)
Spacer(Modifier.size(4.dp))
Box(
modifier =
Modifier
.size(14.dp)
.clip(CircleShape)
.background(CoveColor.SuccessGreen),
contentAlignment = Alignment.Center,
) {
Icon(
imageVector = Icons.Default.Check,
contentDescription = null,
tint = Color.White,
modifier = Modifier.size(10.dp),
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,74 +58,68 @@ internal fun TransactionDetailsWidget(
)
Spacer(Modifier.height(24.dp))

// address (sent to / received from)
val addressLabel =
stringResource(
if (isSent) R.string.label_sent_to else R.string.label_received_from,
)
Column(modifier = Modifier.fillMaxWidth()) {
Text(
addressLabel,
color = sub,
fontSize = 12.sp,
)
Spacer(Modifier.height(8.dp))
Text(
transactionDetails.addressSpacedOut(),
color = fg,
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
lineHeight = 18.sp,
)

// show block number and confirmations for confirmed sent transactions
if (isSent && isConfirmed) {
if (isSent) {
// "Sent to" section - only for sent transactions
Column(modifier = Modifier.fillMaxWidth()) {
Text(
stringResource(R.string.label_sent_to),
color = sub,
fontSize = 12.sp,
)
Spacer(Modifier.height(8.dp))
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
transactionDetails.blockNumberFmt() ?: "",
color = sub,
fontSize = 14.sp,
)
Text(" | ", color = sub, fontSize = 14.sp)
if (numberOfConfirmations != null) {
Text(
transactionDetails.addressSpacedOut(),
color = fg,
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold,
lineHeight = 18.sp,
)

// show block number and confirmations for confirmed sent transactions
if (isConfirmed) {
Spacer(Modifier.height(8.dp))
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
numberOfConfirmations.toString(),
transactionDetails.blockNumberFmt() ?: "",
color = sub,
fontSize = 14.sp,
)
Spacer(Modifier.size(4.dp))
Box(
modifier =
Modifier
.size(14.dp)
.clip(CircleShape)
.background(CoveColor.SuccessGreen),
contentAlignment = Alignment.Center,
) {
Icon(
imageVector = Icons.Default.Check,
contentDescription = null,
tint = Color.White,
modifier = Modifier.size(10.dp),
Text(" | ", color = sub, fontSize = 14.sp)
if (numberOfConfirmations != null) {
Text(
numberOfConfirmations.toString(),
color = sub,
fontSize = 14.sp,
)
Spacer(Modifier.size(4.dp))
Box(
modifier =
Modifier
.size(14.dp)
.clip(CircleShape)
.background(CoveColor.SuccessGreen),
contentAlignment = Alignment.Center,
) {
Icon(
imageVector = Icons.Default.Check,
contentDescription = null,
tint = Color.White,
modifier = Modifier.size(10.dp),
)
}
}
}
}
}
}
Spacer(Modifier.height(24.dp))
Box(
modifier =
Modifier
.fillMaxWidth()
.height(1.dp)
.background(dividerColor),
)
Spacer(Modifier.height(24.dp))

// network fee (for sent transactions)
if (isSent) {
Spacer(Modifier.height(24.dp))
Box(
modifier =
Modifier
.fillMaxWidth()
.height(1.dp)
.background(dividerColor),
)
Spacer(Modifier.height(24.dp))
DetailsWidget(
label = stringResource(R.string.label_network_fee),
primary = transactionDetails.feeFmt(unit = metadata.selectedUnit),
Expand Down