BankSectionView.swift (5253B)
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 /// This view shows the currency name in an exchange section 13 /// currency 14 struct BankSectionView: View { 15 private let symLog = SymLogV(0) 16 let stack: CallStack 17 let account: BankAccountsInfo 18 let selectedBalance: Balance? 19 @Binding var amountLastUsed: Amount 20 let goToEdit: Bool 21 22 @EnvironmentObject private var model: WalletModel 23 @EnvironmentObject private var controller: Controller 24 @AppStorage("minimalistic") var minimalistic: Bool = false 25 @AppStorage("ownerName") var ownerName: String = EMPTYSTRING 26 27 // @State private var purge: Bool = false 28 29 @State private var label: String = EMPTYSTRING 30 @State private var accountHolder: String = EMPTYSTRING 31 @State private var iban: String = EMPTYSTRING 32 @State private var xTaler: String = EMPTYSTRING 33 @State private var paytoType: PaytoType = .iban 34 @State private var selected = 0 35 36 // @MainActor 37 // private func validateIban() async { 38 // if (try? await model.validateIban(iban)) == true { 39 // let payto = "payto://iban/\(iban)?receiver-name=\(accountHolder)" 40 // paytoUri = payto.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! 41 // } else { 42 // paytoUri = nil 43 // } 44 // } 45 46 @MainActor 47 private func viewDidLoad() async { 48 let payTo = PayTo(account.paytoUri) 49 iban = payTo.iban ?? EMPTYSTRING 50 xTaler = payTo.xTaler ?? EMPTYSTRING 51 if iban.count < 1 && xTaler.count > 1 { 52 paytoType = .xTalerBank 53 } 54 label = account.label ?? EMPTYSTRING 55 accountHolder = payTo.receiver ?? ownerName 56 } 57 58 var body: some View { 59 #if PRINT_CHANGES 60 let _ = Self._printChanges() 61 // let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear 62 #endif 63 let kyc = account.kycCompleted ? String(localized: "verified") 64 : String(localized: "not yet verified") 65 let methods = [PaytoType.iban, PaytoType.xTalerBank] 66 let methodType = methods[selected].rawValue.uppercased() 67 let methodStr = (paytoType == .iban) ? iban 68 : (paytoType == .xTalerBank) ? xTaler 69 : "unknown payment method" 70 let editHint = String(localized: "Double tap to edit the account", comment: "a11y") 71 let selectHint = String(localized: "Double tap to select", comment: "a11y") 72 Section { 73 NavigationLink { 74 if goToEdit { 75 BankEditView(stack: stack.push(), 76 accountID: account.bankAccountId) 77 } else { 78 let navTitle = String(localized: "NavTitle_Deposit", // _Currency", 79 defaultValue: "Deposit") // \(currencySymbol)" 80 DepositAmountV(stack: stack.push(), 81 selectedBalance: selectedBalance, 82 amountLastUsed: $amountLastUsed, 83 paytoUri: account.paytoUri, 84 label: account.label) 85 .navigationTitle(navTitle) 86 } 87 } label: { 88 VStack(alignment: .leading) { 89 BankSectionRow(title: String(localized: "Account holder:"), 90 value: accountHolder) 91 BankSectionRow(title: String(localized: "\(methodType):", comment: "methodType:"), 92 value: methodStr) 93 BankSectionRow(title: String(localized: "Status:"), 94 value: kyc) 95 } .talerFont(.body) 96 .listRowSeparator(.hidden) 97 // .accessibilityElement(children: .combine) 98 } 99 .accessibilityHint(goToEdit ? editHint : selectHint) 100 } header: { 101 Text(label) 102 .talerFont(.title3) 103 // .foregroundColor(WalletColors().secondary(colorScheme, colorSchemeContrast)) 104 // .accessibilityHint(EMPTYSTRING) 105 } 106 .task { await viewDidLoad() } 107 .onDisappear() { 108 // purge = false 109 } 110 } 111 } 112 113 struct BankSectionRow: View { 114 let title: String 115 let value: String 116 117 @AppStorage("minimalistic") var minimalistic: Bool = false 118 119 var body: some View { 120 let hLayout = HStack { 121 Text(title) 122 Spacer() 123 Text(value) 124 } 125 let vLayout = VStack(alignment: .leading) { 126 Text(title) 127 HStack { 128 Spacer() 129 Text(value) 130 } 131 } 132 133 if minimalistic { 134 Text(value) 135 } else if #available(iOS 16.4, *) { 136 ViewThatFits(in: .horizontal) { 137 hLayout 138 vLayout 139 }.accessibilityElement(children: .combine) 140 } else { 141 vLayout 142 .accessibilityElement(children: .combine) 143 } 144 145 } 146 }