taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

commit 17b074d7453da4e13cda5c4da38533d7a81d7d48
parent 284928aa003546e99f1eb8fe5736b63fbc339add
Author: Iván Ávalos <avalos@disroot.org>
Date:   Sat, 23 Nov 2024 21:40:42 +0100

[wallet] QC: also show back button in empty transactions list

Diffstat:
Mwallet/src/main/java/net/taler/wallet/transactions/TransactionsComposable.kt | 170+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
1 file changed, 96 insertions(+), 74 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/transactions/TransactionsComposable.kt b/wallet/src/main/java/net/taler/wallet/transactions/TransactionsComposable.kt @@ -27,7 +27,6 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -110,16 +109,27 @@ fun TransactionsComposable( onTransactionClick: (tx: Transaction) -> Unit, onTransactionsDelete: (txIds: List<String>) -> Unit, onShowBalancesClicked: () -> Unit, -) = when (txResult) { - is None -> LoadingScreen() - is Error -> ErrorTransactionsComposable(txResult.error) - is Success -> if (txResult.transactions.isEmpty()) { - EmptyTransactionsComposable() - } else { +) { + Column(Modifier.fillMaxSize()) { var showDeleteDialog by remember { mutableStateOf(false) } var selectionMode by remember { mutableStateOf(false) } val selectedItems = remember { mutableStateListOf<String>() } + if (selectionMode && txResult is Success) SelectionModeTopAppBar( + selectedItems = selectedItems, + resetSelectionMode = { + selectionMode = false + selectedItems.clear() + }, + onSelectAllClicked = { + selectedItems.clear() + selectedItems += txResult.transactions.map { it.transactionId } + }, + onDeleteClicked = { + showDeleteDialog = true + }, + ) + if (showDeleteDialog) AlertDialog( title = { Text(stringResource(R.string.transactions_delete_selected_dialog_title)) }, text = { Text(stringResource(R.string.transactions_delete_selected_dialog_message)) }, @@ -154,67 +164,70 @@ fun TransactionsComposable( } } - Column(Modifier.fillMaxSize()) { - if (selectionMode) SelectionModeTopAppBar( - selectedItems = selectedItems, - resetSelectionMode = { - selectionMode = false - selectedItems.clear() - }, - onSelectAllClicked = { - selectedItems.clear() - selectedItems += txResult.transactions.map { it.transactionId } - }, - onDeleteClicked = { - showDeleteDialog = true - }, - ) - - LazyColumn( - Modifier - .consumeWindowInsets(innerPadding) - .fillMaxHeight(), - contentPadding = innerPadding, - ) { - item { - TransactionsHeader( - balance = balance, - spec = currencySpec, - onShowBalancesClicked = onShowBalancesClicked, - ) - } + LazyColumn( + Modifier + .weight(1f) + .consumeWindowInsets(innerPadding), + contentPadding = innerPadding, + ) { + item { + TransactionsHeader( + balance = balance, + spec = currencySpec, + onShowBalancesClicked = onShowBalancesClicked, + ) + } - items(txResult.transactions, key = { it.transactionId }) { tx -> - val isSelected = selectedItems.contains(tx.transactionId) - - TransactionRow( - tx, currencySpec, - isSelected = isSelected, - selectionMode = selectionMode, - onTransactionClick = { - if (selectionMode) { - if (isSelected) { - selectedItems.remove(tx.transactionId) + val placeholderPadding = PaddingValues(vertical = 50.dp) + when (txResult) { + is Success -> if (txResult.transactions.isEmpty()) item { + Box(Modifier.padding(placeholderPadding)) { + EmptyTransactionsComposable() + } + } else { + items(txResult.transactions, key = { it.transactionId }) { tx -> + val isSelected = selectedItems.contains(tx.transactionId) + + TransactionRow( + tx, currencySpec, + isSelected = isSelected, + selectionMode = selectionMode, + onTransactionClick = { + if (selectionMode) { + if (isSelected) { + selectedItems.remove(tx.transactionId) + } else { + selectedItems.add(tx.transactionId) + } } else { - selectedItems.add(tx.transactionId) + onTransactionClick(tx) } - } else { - onTransactionClick(tx) - } - }, - onTransactionSelect = { - if (selectionMode) { - if (isSelected) { - selectedItems.remove(tx.transactionId) + }, + onTransactionSelect = { + if (selectionMode) { + if (isSelected) { + selectedItems.remove(tx.transactionId) + } else { + selectedItems.add(tx.transactionId) + } } else { + selectionMode = true selectedItems.add(tx.transactionId) } - } else { - selectionMode = true - selectedItems.add(tx.transactionId) - } - }, - ) + }, + ) + } + } + + is None -> item { + Box(Modifier.padding(placeholderPadding)) { + LoadingScreen() + } + } + is Error -> item { + Box(Modifier.padding(placeholderPadding)) { + ErrorTransactionsComposable(txResult.error) + } } } } @@ -237,18 +250,11 @@ fun EmptyTransactionsComposable() { @Composable fun ErrorTransactionsComposable(error: TalerErrorInfo) { - Box( - modifier = Modifier - .padding(16.dp) - .fillMaxSize(), - contentAlignment = Center, - ) { - Text( - text = stringResource(R.string.transactions_error, error.userFacingMsg), - style = MaterialTheme.typography.titleLarge, - color = MaterialTheme.colorScheme.error, - ) - } + Text( + text = stringResource(R.string.transactions_error, error.userFacingMsg), + style = MaterialTheme.typography.titleLarge, + color = MaterialTheme.colorScheme.error, + ) } @Composable @@ -549,3 +555,18 @@ fun TransactionsComposableEmptyPreview() { } } +@Preview +@Composable +fun TransactionsComposableLoadingPreview() { + TalerSurface { + TransactionsComposable( + innerPadding = PaddingValues(0.dp), + balance = previewBalance, + currencySpec = null, + txResult = None, + onTransactionClick = {}, + onTransactionsDelete = {}, + onShowBalancesClicked = {}, + ) + } +} +\ No newline at end of file