DepositSelectV.swift (4377B)
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 .talerFont(.body) 66 } 67 if bankAccounts.isEmpty { 68 Section { 69 let bankAccountsTitle = String(localized: "TitleBankAccounts", defaultValue: "Bank Accounts") 70 let bankAccountsDest = BankListView(stack: stack.push(bankAccountsTitle), 71 navTitle: bankAccountsTitle) 72 NavigationLink { // whole row like in a tableView 73 bankAccountsDest 74 } label: { 75 SettingsItem(name: bankAccountsTitle, id1: "bankAccounts", 76 description: String(localized: "Your accounts for deposit")) {} 77 } 78 } 79 } else { 80 ForEach(bankAccounts, id: \.self) { account in 81 // let disabled = accountHolder.isEmpty || paytoUri == nil // TODO: check amountAvailable 82 BankSectionView(stack: stack.push(), 83 account: account, 84 selectedBalance: selectedBalance, 85 amountLastUsed: $amountLastUsed, 86 goToEdit: false) 87 } 88 } 89 } 90 .listStyle(myListStyle.style).anyView 91 .refreshable { 92 controller.hapticNotification(.success) 93 symLog.log("refreshing") 94 await viewDidLoad() 95 } 96 .task { 97 setVoice(to: nil) 98 await viewDidLoad() 99 } 100 .navigationTitle(subjectTitle) 101 .onAppear { 102 DebugViewC.shared.setViewID(VIEW_DEPOSIT_ACCEPT, stack: stack.push()) 103 // symLog.log("❗️ DepositSelectV onAppear") 104 } 105 .onDisappear { 106 // symLog.log("❗️ DepositSelectV onDisappear") 107 } 108 // .task(id: depositIBAN) { await validateIban() } 109 } 110 } 111 // MARK: - 112 #if DEBUG 113 #endif