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 }