taler-android

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

DepositScreen.kt (5362B)


      1 /*
      2  * This file is part of GNU Taler
      3  * (C) 2026 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.deposit
     18 
     19 import androidx.activity.compose.BackHandler
     20 import androidx.compose.foundation.layout.fillMaxSize
     21 import androidx.compose.foundation.layout.padding
     22 import androidx.compose.foundation.rememberScrollState
     23 import androidx.compose.foundation.verticalScroll
     24 import androidx.compose.material3.Text
     25 import androidx.compose.runtime.Composable
     26 import androidx.compose.runtime.LaunchedEffect
     27 import androidx.compose.runtime.getValue
     28 import androidx.compose.runtime.livedata.observeAsState
     29 import androidx.compose.ui.Modifier
     30 import androidx.compose.ui.res.stringResource
     31 import androidx.lifecycle.map
     32 import net.taler.common.Amount
     33 import net.taler.wallet.NavigateCallback
     34 import net.taler.wallet.R
     35 import net.taler.wallet.WalletDestination
     36 import net.taler.wallet.accounts.ListBankAccountsResult
     37 import net.taler.wallet.compose.ErrorComposable
     38 import net.taler.wallet.compose.GlobalScaffold
     39 import net.taler.wallet.compose.LoadingScreen
     40 import net.taler.wallet.compose.collectAsStateLifecycleAware
     41 import net.taler.wallet.main.MainViewModel
     42 
     43 @Composable
     44 fun DepositScreen(
     45     model: MainViewModel,
     46     dest: WalletDestination.Deposit,
     47     onNavigate: NavigateCallback,
     48     onNavigateBack: () -> Unit,
     49 ) {
     50     val depositManager = model.depositManager
     51     val accountManager = model.accountManager
     52     val exchangeManager = model.exchangeManager
     53 
     54     val presetAmount = dest.amount?.let { Amount.fromJSONString(it) }
     55     val receiverName = dest.receiverName
     56     val receiverPostalCode = dest.receiverPostalCode
     57     val receiverTown = dest.receiverTown
     58     val iban = dest.IBAN
     59 
     60     LaunchedEffect(Unit) {
     61         if (presetAmount != null && receiverName != null && iban != null) {
     62             val paytoUri = getIbanPayto(receiverName, receiverPostalCode, receiverTown, iban)
     63             depositManager.makeDeposit(presetAmount, paytoUri)
     64         }
     65         accountManager.listBankAccounts()
     66     }
     67 
     68     val state by depositManager.depositState.collectAsStateLifecycleAware()
     69 
     70     LaunchedEffect(state) {
     71         if (state is DepositState.Success) {
     72             onNavigateBack()
     73         }
     74     }
     75 
     76     GlobalScaffold(
     77         model = model,
     78         onNavigateBack = onNavigateBack,
     79         title = { Text(stringResource(R.string.send_deposit_title)) },
     80     ) { paddingValues ->
     81         val knownBankAccounts by accountManager.bankAccounts.collectAsStateLifecycleAware()
     82         val knownCurrencies by model.balanceManager.balances.map {
     83             it.map { bl -> bl.currency }
     84         }.observeAsState(emptyList())
     85         val devMode by model.devMode.observeAsState(false)
     86 
     87         BackHandler(state is DepositState.AccountSelected) {
     88             depositManager.resetDepositState()
     89         }
     90 
     91         when (val s = state) {
     92             is DepositState.MakingDeposit, is DepositState.Success -> {
     93                 LoadingScreen(Modifier.padding(paddingValues))
     94             }
     95 
     96             is DepositState.Error -> ErrorComposable(
     97                 error = s.error,
     98                 devMode = devMode,
     99                 modifier = Modifier
    100                     .fillMaxSize()
    101                     .padding(paddingValues)
    102                     .verticalScroll(rememberScrollState()),
    103                 onClose = onNavigateBack,
    104             )
    105 
    106             is DepositState.Start -> {
    107                 MakeDepositComposable(
    108                     modifier = Modifier.padding(paddingValues),
    109                     knownBankAccounts = (knownBankAccounts as? ListBankAccountsResult.Success)
    110                         ?.accounts
    111                         ?: emptyList(),
    112                     onAccountSelected = { account ->
    113                         depositManager.selectAccount(account)
    114                     },
    115                     onManageBankAccounts = {
    116                         onNavigate(WalletDestination.BankAccounts(), false)
    117                     }
    118                 )
    119             }
    120 
    121             is DepositState.AccountSelected -> {
    122                 DepositAmountComposable(
    123                     modifier = Modifier.padding(paddingValues),
    124                     state = s,
    125                     knownCurrencies = knownCurrencies,
    126                     getCurrencySpec = exchangeManager::getSpecForCurrency,
    127                     checkDeposit = { a ->
    128                         depositManager.checkDepositFees(s.account.paytoUri, a)
    129                     },
    130                     onMakeDeposit = { amount ->
    131                         depositManager.makeDeposit(amount, s.account.paytoUri)
    132                     },
    133                     onClose = {
    134                         depositManager.resetDepositState()
    135                     }
    136                 )
    137             }
    138         }
    139     }
    140 }