Transaction detail hotfix for pending transaction

This commit is contained in:
Milan Cerovsky 2025-04-23 09:28:08 +02:00
parent 739953de19
commit 0ea9c7ef51
13 changed files with 65 additions and 24 deletions

View File

@ -48,7 +48,8 @@ class SynchronizerProviderImpl(
emit(synchronizer) emit(synchronizer)
} }
} }
}.flowOn(Dispatchers.IO) }
.flowOn(Dispatchers.IO)
.stateIn( .stateIn(
scope = scope, scope = scope,
started = SharingStarted.Lazily, started = SharingStarted.Lazily,

View File

@ -52,6 +52,7 @@ class BalanceWidgetViewModel(
account == null -> null account == null -> null
account.totalBalance == account.spendableShieldedBalance -> null account.totalBalance == account.spendableShieldedBalance -> null
account.totalBalance > account.spendableShieldedBalance && account.totalBalance > account.spendableShieldedBalance &&
account.spendableShieldedBalance == account.totalShieldedBalance &&
account.totalTransparentBalance > Zatoshi(0) && account.totalTransparentBalance > Zatoshi(0) &&
!account.isShieldingAvailable -> !account.isShieldingAvailable ->
null null

View File

@ -44,9 +44,9 @@ fun WalletRestoringMessage(
Text( Text(
text = text =
if (state.isSpendable) { if (state.isSpendable) {
stringResource(R.string.home_message_restoring_subtitle)
} else {
stringResource(R.string.home_message_restoring_subtitle_spendable) stringResource(R.string.home_message_restoring_subtitle_spendable)
} else {
stringResource(R.string.home_message_restoring_subtitle)
}, },
) )
}, },

View File

@ -33,7 +33,8 @@ object SendShieldStateFixture {
TransactionDetailMemoState(content = stringRes("Short message"), onClick = {}), TransactionDetailMemoState(content = stringRes("Short message"), onClick = {}),
) )
), ),
note = stringRes("None") note = stringRes("None"),
isPending = false
) )
} }
@ -49,7 +50,8 @@ object SendTransparentStateFixture {
onTransactionAddressClick = {}, onTransactionAddressClick = {},
fee = stringRes(Zatoshi(1011)), fee = stringRes(Zatoshi(1011)),
completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true), completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true),
note = stringRes("None") note = stringRes("None"),
isPending = false
) )
} }
@ -64,11 +66,12 @@ object ReceiveShieldedStateFixture {
) )
) )
) = ReceiveShieldedState( ) = ReceiveShieldedState(
memo = memo,
transactionId = stringRes("Transaction ID"), transactionId = stringRes("Transaction ID"),
onTransactionIdClick = {}, onTransactionIdClick = {},
completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true), completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true),
memo = memo, note = stringRes("None"),
note = stringRes("None") isPending = false
) )
} }
@ -79,7 +82,8 @@ object ReceiveTransparentStateFixture {
transactionId = stringRes("Transaction ID"), transactionId = stringRes("Transaction ID"),
onTransactionIdClick = {}, onTransactionIdClick = {},
completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true), completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true),
note = stringRes("None") note = stringRes("None"),
isPending = false
) )
} }
@ -91,6 +95,7 @@ object ShieldingStateFixture {
onTransactionIdClick = {}, onTransactionIdClick = {},
completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true), completedTimestamp = stringResByDateTime(ZonedDateTime.now(), true),
fee = stringRes(Zatoshi(1011)), fee = stringRes(Zatoshi(1011)),
note = stringRes("None") note = stringRes("None"),
isPending = false
) )
} }

View File

@ -136,7 +136,8 @@ class TransactionDetailViewModel(
onTransactionAddressClick = { onCopyToClipboard(transaction.recipientAddress.address) }, onTransactionAddressClick = { onCopyToClipboard(transaction.recipientAddress.address) },
fee = createFeeStringRes(transaction), fee = createFeeStringRes(transaction),
completedTimestamp = createTimestampStringRes(transaction), completedTimestamp = createTimestampStringRes(transaction),
note = transaction.metadata.note?.let { stringRes(it) } note = transaction.metadata.note?.let { stringRes(it) },
isPending = isPending(transaction)
) )
} else { } else {
SendShieldedState( SendShieldedState(
@ -167,7 +168,8 @@ class TransactionDetailViewModel(
} }
) )
}, },
note = transaction.metadata.note?.let { stringRes(it) } note = transaction.metadata.note?.let { stringRes(it) },
isPending = isPending(transaction)
) )
} }
} }
@ -184,7 +186,8 @@ class TransactionDetailViewModel(
onCopyToClipboard(transaction.transaction.id.txIdString()) onCopyToClipboard(transaction.transaction.id.txIdString())
}, },
completedTimestamp = createTimestampStringRes(transaction), completedTimestamp = createTimestampStringRes(transaction),
note = transaction.metadata.note?.let { stringRes(it) } note = transaction.metadata.note?.let { stringRes(it) },
isPending = isPending(transaction)
) )
} else { } else {
ReceiveShieldedState( ReceiveShieldedState(
@ -208,7 +211,8 @@ class TransactionDetailViewModel(
} }
) )
}, },
note = transaction.metadata.note?.let { stringRes(it) } note = transaction.metadata.note?.let { stringRes(it) },
isPending = isPending(transaction)
) )
} }
} }
@ -225,7 +229,8 @@ class TransactionDetailViewModel(
}, },
completedTimestamp = createTimestampStringRes(transaction), completedTimestamp = createTimestampStringRes(transaction),
fee = createFeeStringRes(transaction), fee = createFeeStringRes(transaction),
note = transaction.metadata.note?.let { stringRes(it) } note = transaction.metadata.note?.let { stringRes(it) },
isPending = isPending(transaction)
) )
} }
} }
@ -264,6 +269,8 @@ class TransactionDetailViewModel(
) )
} ?: stringRes(R.string.transaction_detail_pending) } ?: stringRes(R.string.transaction_detail_pending)
private fun isPending(data: DetailedTransactionData) = data.transaction.timestamp == null
private fun onCopyToClipboard(text: String) { private fun onCopyToClipboard(text: String) {
copyToClipboard( copyToClipboard(
tag = "Clipboard", tag = "Clipboard",

View File

@ -68,7 +68,11 @@ fun ReceiveShielded(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
state = state =
TransactionDetailInfoRowState( TransactionDetailInfoRowState(
title = stringRes(R.string.transaction_detail_info_transaction_completed), title = if (state.isPending) {
stringRes(R.string.transaction_detail_info_transaction_status)
} else {
stringRes(R.string.transaction_detail_info_transaction_completed)
},
message = state.completedTimestamp, message = state.completedTimestamp,
shape = shape =
if (state.note != null) { if (state.note != null) {

View File

@ -54,7 +54,11 @@ fun ReceiveTransparent(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
state = state =
TransactionDetailInfoRowState( TransactionDetailInfoRowState(
title = stringRes(R.string.transaction_detail_info_transaction_completed), title = if (state.isPending) {
stringRes(R.string.transaction_detail_info_transaction_status)
} else {
stringRes(R.string.transaction_detail_info_transaction_completed)
},
message = state.completedTimestamp, message = state.completedTimestamp,
shape = shape =
if (state.note != null) { if (state.note != null) {

View File

@ -118,7 +118,11 @@ fun SendShielded(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
state = state =
TransactionDetailInfoRowState( TransactionDetailInfoRowState(
title = stringRes(R.string.transaction_detail_info_transaction_completed), title = if (state.isPending) {
stringRes(R.string.transaction_detail_info_transaction_status)
} else {
stringRes(R.string.transaction_detail_info_transaction_completed)
},
message = state.completedTimestamp, message = state.completedTimestamp,
shape = shape =
if (state.note == null) { if (state.note == null) {

View File

@ -115,7 +115,11 @@ fun SendTransparent(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
state = state =
TransactionDetailInfoRowState( TransactionDetailInfoRowState(
title = stringRes(R.string.transaction_detail_info_transaction_completed), title = if (state.isPending) {
stringRes(R.string.transaction_detail_info_transaction_status)
} else {
stringRes(R.string.transaction_detail_info_transaction_completed)
},
message = state.completedTimestamp, message = state.completedTimestamp,
shape = shape =
if (state.note != null) { if (state.note != null) {

View File

@ -54,7 +54,11 @@ fun Shielding(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
state = state =
TransactionDetailInfoRowState( TransactionDetailInfoRowState(
title = stringRes(R.string.transaction_detail_info_transaction_completed), title = if (state.isPending) {
stringRes(R.string.transaction_detail_info_transaction_status)
} else {
stringRes(R.string.transaction_detail_info_transaction_completed)
},
message = state.completedTimestamp, message = state.completedTimestamp,
shape = TransactionDetailInfoShape.MIDDLE, shape = TransactionDetailInfoShape.MIDDLE,
) )

View File

@ -16,7 +16,8 @@ data class SendShieldedState(
val fee: StringResource, val fee: StringResource,
val completedTimestamp: StringResource, val completedTimestamp: StringResource,
val memo: TransactionDetailMemosState?, val memo: TransactionDetailMemosState?,
val note: StringResource? val note: StringResource?,
val isPending: Boolean
) : TransactionDetailInfoState ) : TransactionDetailInfoState
@Immutable @Immutable
@ -29,7 +30,8 @@ data class SendTransparentState(
val onTransactionAddressClick: () -> Unit, val onTransactionAddressClick: () -> Unit,
val fee: StringResource, val fee: StringResource,
val completedTimestamp: StringResource, val completedTimestamp: StringResource,
val note: StringResource? val note: StringResource?,
val isPending: Boolean
) : TransactionDetailInfoState ) : TransactionDetailInfoState
@Immutable @Immutable
@ -38,7 +40,8 @@ data class ReceiveShieldedState(
val transactionId: StringResource, val transactionId: StringResource,
val onTransactionIdClick: () -> Unit, val onTransactionIdClick: () -> Unit,
val completedTimestamp: StringResource, val completedTimestamp: StringResource,
val note: StringResource? val note: StringResource?,
val isPending: Boolean
) : TransactionDetailInfoState ) : TransactionDetailInfoState
@Immutable @Immutable
@ -46,7 +49,8 @@ data class ReceiveTransparentState(
val transactionId: StringResource, val transactionId: StringResource,
val onTransactionIdClick: () -> Unit, val onTransactionIdClick: () -> Unit,
val completedTimestamp: StringResource, val completedTimestamp: StringResource,
val note: StringResource? val note: StringResource?,
val isPending: Boolean
) : TransactionDetailInfoState ) : TransactionDetailInfoState
@Immutable @Immutable
@ -55,7 +59,8 @@ data class ShieldingState(
val onTransactionIdClick: () -> Unit, val onTransactionIdClick: () -> Unit,
val completedTimestamp: StringResource, val completedTimestamp: StringResource,
val fee: StringResource, val fee: StringResource,
val note: StringResource? val note: StringResource?,
val isPending: Boolean
) : TransactionDetailInfoState ) : TransactionDetailInfoState
@Immutable @Immutable

View File

@ -8,6 +8,7 @@
<string name="transaction_detail_info_transaction_details">Detalles de la Transacción</string> <string name="transaction_detail_info_transaction_details">Detalles de la Transacción</string>
<string name="transaction_detail_info_transaction_id">ID de la Transacción</string> <string name="transaction_detail_info_transaction_id">ID de la Transacción</string>
<string name="transaction_detail_info_transaction_completed">Completada</string> <string name="transaction_detail_info_transaction_completed">Completada</string>
<string name="transaction_detail_info_transaction_status">Status</string>
<string name="transaction_detail_info_transaction_fee">Tarifa</string> <string name="transaction_detail_info_transaction_fee">Tarifa</string>
<string name="transaction_detail_info_address">Dirección</string> <string name="transaction_detail_info_address">Dirección</string>
<string name="transaction_detail_info_sent_to">Enviado a</string> <string name="transaction_detail_info_sent_to">Enviado a</string>

View File

@ -8,6 +8,7 @@
<string name="transaction_detail_info_transaction_details">Transaction Details</string> <string name="transaction_detail_info_transaction_details">Transaction Details</string>
<string name="transaction_detail_info_transaction_id">Transaction ID</string> <string name="transaction_detail_info_transaction_id">Transaction ID</string>
<string name="transaction_detail_info_transaction_completed">Completed</string> <string name="transaction_detail_info_transaction_completed">Completed</string>
<string name="transaction_detail_info_transaction_status">Status</string>
<string name="transaction_detail_info_transaction_fee">Fee</string> <string name="transaction_detail_info_transaction_fee">Fee</string>
<string name="transaction_detail_info_address">Address</string> <string name="transaction_detail_info_address">Address</string>
<string name="transaction_detail_info_sent_to">Sent to</string> <string name="transaction_detail_info_sent_to">Sent to</string>