taler-android

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

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 }