DepositSelectV.swift (4367B)
1 /* 2 * This file is part of GNU Taler, ©2022-25 Taler Systems S.A. 3 * See LICENSE.md 4 */ 5 /** 6 * @author Marc Stibane 7 */ 8 import SwiftUI 9 import taler_swift 10 import SymLog 11 12 // Called when tapping [Deposit] 13 // user chooses a bank account 14 struct DepositSelectV: View { 15 private let symLog = SymLogV(0) 16 let stack: CallStack 17 // when Action is tapped while in currency TransactionList… 18 let selectedBalance: Balance? // …then use THIS balance, otherwise show picker 19 @Binding var amountLastUsed: Amount 20 21 // let amountAvailable: Amount? 22 // @Binding var depositIBAN: String 23 24 @EnvironmentObject private var controller: Controller 25 @EnvironmentObject private var model: WalletModel 26 @Environment(\.colorScheme) private var colorScheme 27 @Environment(\.colorSchemeContrast) private var colorSchemeContrast 28 @AppStorage("minimalistic") var minimalistic: Bool = false 29 @AppStorage("depositIBAN") var depositIBAN: String = EMPTYSTRING 30 @AppStorage("myListStyle") var myListStyle: MyListStyle = .automatic 31 32 @State private var myFeeLabel: String = EMPTYSTRING 33 @State private var transactionStarted: Bool = false 34 @FocusState private var isFocused: Bool 35 @State private var currencyName: String = UNKNOWN 36 @State private var currencySymbol: String = UNKNOWN 37 @State private var amountAvailable = Amount.zero(currency: EMPTYSTRING) // Update currency when used 38 @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used 39 @State private var bankAccounts: [BankAccountsInfo] = [] 40 41 42 private var subjectTitle: String { 43 return String(localized: "NavTitle_Deposit_Select", 44 defaultValue: "Select account", 45 comment: "NavTitle: Deposit") 46 } 47 48 @MainActor 49 private func viewDidLoad() async { 50 if let accounts = try? await model.listBankAccounts() { 51 withAnimation { bankAccounts = accounts } 52 } 53 } 54 55 var body: some View { 56 #if PRINT_CHANGES 57 let _ = Self._printChanges() 58 let _ = symLog.vlog(amountToTransfer.readableDescription) // just to get the # 59 #endif 60 let depositHint = Text("You can only deposit to a bank account that you control, otherwise you will not be able to fulfill the regulatory requirements.") 61 62 List { 63 Section { 64 depositHint 65 } 66 if bankAccounts.isEmpty { 67 Section { 68 let bankAccountsTitle = String(localized: "TitleBankAccounts", defaultValue: "Bank Accounts") 69 let bankAccountsDest = BankListView(stack: stack.push(bankAccountsTitle), 70 navTitle: bankAccountsTitle) 71 NavigationLink { // whole row like in a tableView 72 bankAccountsDest 73 } label: { 74 SettingsItem(name: bankAccountsTitle, id1: "bankAccounts", 75 description: minimalistic ? nil : String(localized: "Your accounts for deposit...")) {} 76 } 77 } 78 } else { 79 ForEach(bankAccounts, id: \.self) { account in 80 // let disabled = (accountHolder.count < 1) || paytoUri == nil // TODO: check amountAvailable 81 BankSectionView(stack: stack.push(), 82 account: account, 83 selectedBalance: selectedBalance, 84 amountLastUsed: $amountLastUsed, 85 goToEdit: false) 86 } 87 } 88 } 89 .listStyle(myListStyle.style).anyView 90 .refreshable { 91 controller.hapticNotification(.success) 92 symLog.log("refreshing") 93 await viewDidLoad() 94 } 95 .task { 96 setVoice(to: nil) 97 await viewDidLoad() 98 } 99 .navigationTitle(subjectTitle) 100 .onAppear { 101 DebugViewC.shared.setViewID(VIEW_DEPOSIT_ACCEPT, stack: stack.push()) 102 // symLog.log("❗️ DepositSelectV onAppear") 103 } 104 .onDisappear { 105 // symLog.log("❗️ DepositSelectV onDisappear") 106 } 107 // .task(id: depositIBAN) { await validateIban() } 108 } 109 } 110 // MARK: - 111 #if DEBUG 112 #endif