ActionButtonComposable.kt (5166B)
1 /* 2 * This file is part of GNU Taler 3 * (C) 2023 Taler Systems S.A. 4 * 5 * GNU Taler is free software; you can redistribute it and/or modify it under the 6 * terms of the GNU General Public License as published by the Free Software 7 * Foundation; either version 3, or (at your option) any later version. 8 * 9 * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY 10 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 * A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 17 package net.taler.wallet.transactions 18 19 import androidx.compose.foundation.layout.Column 20 import androidx.compose.foundation.layout.Spacer 21 import androidx.compose.foundation.layout.size 22 import androidx.compose.material.icons.Icons 23 import androidx.compose.material.icons.filled.AccountBalance 24 import androidx.compose.material.icons.filled.Link 25 import androidx.compose.material.icons.filled.QrCode 26 import androidx.compose.material3.Button 27 import androidx.compose.material3.ButtonDefaults 28 import androidx.compose.material3.Icon 29 import androidx.compose.material3.Text 30 import androidx.compose.runtime.Composable 31 import androidx.compose.ui.Alignment 32 import androidx.compose.ui.Modifier 33 import androidx.compose.ui.res.stringResource 34 import net.taler.wallet.R 35 import net.taler.wallet.transactions.TransactionMajorState.Pending 36 import net.taler.wallet.transactions.TransactionMinorState.BalanceKycRequired 37 import net.taler.wallet.transactions.TransactionMinorState.BankConfirmTransfer 38 import net.taler.wallet.transactions.TransactionMinorState.ExchangeWaitReserve 39 import net.taler.wallet.transactions.TransactionMinorState.KycAuthRequired 40 import net.taler.wallet.transactions.TransactionMinorState.KycRequired 41 42 interface ActionListener { 43 enum class Type { 44 COMPLETE_KYC, 45 CONFIRM_WITH_BANK, 46 CONFIRM_MANUAL, 47 SHOW_WIRE_QR, 48 } 49 50 fun onActionButtonClicked(tx: Transaction, type: Type) 51 } 52 53 @Composable 54 fun ActionButton( 55 modifier: Modifier = Modifier, 56 tx: Transaction, 57 listener: ActionListener, 58 ) { 59 if (tx.txState.major == Pending) { 60 when (tx.txState.minor) { 61 KycRequired, BalanceKycRequired -> KycButton(modifier, tx, listener) 62 BankConfirmTransfer -> ConfirmBankButton(modifier, tx, listener) 63 ExchangeWaitReserve, KycAuthRequired -> ConfirmManualButton(modifier, tx, listener) 64 else -> {} 65 } 66 } 67 } 68 69 @Composable 70 private fun KycButton( 71 modifier: Modifier = Modifier, 72 tx: Transaction, 73 listener: ActionListener, 74 ) { 75 Button( 76 onClick = { listener.onActionButtonClicked(tx, ActionListener.Type.COMPLETE_KYC) }, 77 modifier = modifier, 78 ) { 79 Icon( 80 Icons.Default.Link, 81 contentDescription = null, 82 modifier = Modifier.size(ButtonDefaults.IconSize) 83 ) 84 Spacer(Modifier.size(ButtonDefaults.IconSpacing)) 85 Text(stringResource(R.string.transaction_action_kyc)) 86 } 87 } 88 89 @Composable 90 private fun ConfirmBankButton( 91 modifier: Modifier = Modifier, 92 tx: Transaction, 93 listener: ActionListener, 94 ) { 95 // TODO: should check go here? 96 if (tx is TransactionWithdrawal 97 && tx.withdrawalDetails is WithdrawalDetails.TalerBankIntegrationApi 98 && tx.withdrawalDetails.bankConfirmationUrl == null) return 99 100 Button( 101 onClick = { listener.onActionButtonClicked(tx, ActionListener.Type.CONFIRM_WITH_BANK) }, 102 modifier = modifier, 103 ) { 104 val label = stringResource(R.string.withdraw_button_confirm_bank) 105 Icon( 106 Icons.Default.Link, 107 label, 108 modifier = Modifier.size(ButtonDefaults.IconSize) 109 ) 110 Spacer(Modifier.size(ButtonDefaults.IconSpacing)) 111 Text(label) 112 } 113 } 114 115 @Composable 116 private fun ConfirmManualButton( 117 modifier: Modifier = Modifier, 118 tx: Transaction, 119 listener: ActionListener, 120 ) { 121 Column( 122 horizontalAlignment = Alignment.CenterHorizontally, 123 ) { 124 Button( 125 onClick = { listener.onActionButtonClicked(tx, ActionListener.Type.CONFIRM_MANUAL) }, 126 modifier = modifier, 127 ) { 128 Icon( 129 Icons.Default.AccountBalance, 130 contentDescription = null, 131 modifier = Modifier.size(ButtonDefaults.IconSize) 132 ) 133 Spacer(Modifier.size(ButtonDefaults.IconSpacing)) 134 Text(stringResource(R.string.withdraw_manual_ready_details_intro)) 135 } 136 137 Button( 138 onClick = { listener.onActionButtonClicked(tx, ActionListener.Type.SHOW_WIRE_QR) }, 139 modifier = modifier, 140 ) { 141 Icon( 142 Icons.Default.QrCode, 143 contentDescription = null, 144 modifier = Modifier.size(ButtonDefaults.IconSize) 145 ) 146 Spacer(Modifier.size(ButtonDefaults.IconSpacing)) 147 Text(stringResource(R.string.withdraw_manual_ready_details_qr)) 148 } 149 } 150 }