BankSectionView.swift (5762B)
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 cyclos: String = EMPTYSTRING 33 @State private var xTaler: String = EMPTYSTRING 34 @State private var paytoType: PaytoType = .iban 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 cyclos = payTo.cyclos ?? EMPTYSTRING 51 52 xTaler = payTo.xTaler ?? EMPTYSTRING 53 if iban.count < 1 { 54 if cyclos.count > 1 { 55 paytoType = .cyclos 56 } else if xTaler.count > 1 { 57 paytoType = .xTalerBank 58 } else { 59 paytoType = .unknown 60 } 61 } 62 label = account.label ?? EMPTYSTRING 63 accountHolder = payTo.receiver ?? ownerName 64 } 65 66 var body: some View { 67 #if PRINT_CHANGES 68 let _ = Self._printChanges() 69 // let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear 70 #endif 71 let kyc = account.kycCompleted ? String(localized: "verified") 72 : String(localized: "not yet verified") 73 let methodType = paytoType.rawValue.uppercased() 74 let methodStr = (paytoType == .iban) ? iban 75 : (paytoType == .cyclos) ? cyclos 76 : (paytoType == .xTalerBank) ? xTaler 77 : "unknown payment method" 78 let editHint = String(localized: "Double tap to edit the account", comment: "a11y") 79 let selectHint = String(localized: "Double tap to select", comment: "a11y") 80 Section { 81 NavigationLink { 82 if goToEdit { 83 BankEditView(stack: stack.push(), 84 accountID: account.bankAccountId) 85 } else { 86 let navTitle = String(localized: "NavTitle_Deposit", // _Currency", 87 defaultValue: "Deposit") // \(currencySymbol)" 88 DepositAmountV(stack: stack.push(), 89 selectedBalance: selectedBalance, 90 amountLastUsed: $amountLastUsed, 91 paytoUri: account.payToWorkAround, // TODO: paytoUri, 92 label: account.label) 93 .navigationTitle(navTitle) 94 } 95 } label: { 96 VStack(alignment: .leading) { 97 if paytoType == .cyclos { 98 BankSectionRow(title: String(localized: "Cyclos user:"), 99 value: accountHolder) 100 } else { 101 BankSectionRow(title: String(localized: "Account holder:"), 102 value: accountHolder) 103 BankSectionRow(title: String(localized: "\(methodType):", comment: "methodType:"), 104 value: methodStr) 105 } 106 BankSectionRow(title: String(localized: "Status:"), 107 value: kyc) 108 } .talerFont(.body) 109 .listRowSeparator(.hidden) 110 // .accessibilityElement(children: .combine) 111 } 112 .accessibilityHint(goToEdit ? editHint : selectHint) 113 } header: { 114 Text(label) 115 .talerFont(.title3) 116 // .foregroundColor(WalletColors().secondary(colorScheme, colorSchemeContrast)) 117 // .accessibilityHint(EMPTYSTRING) 118 } 119 .task { await viewDidLoad() } 120 .onDisappear() { 121 // purge = false 122 } 123 } 124 } 125 126 struct BankSectionRow: View { 127 let title: String 128 let value: String 129 130 @AppStorage("minimalistic") var minimalistic: Bool = false 131 132 var body: some View { 133 let hLayout = HStack { 134 Text(title) 135 Spacer() 136 Text(value) 137 } 138 let vLayout = VStack(alignment: .leading) { 139 Text(title) 140 HStack { 141 Spacer() 142 Text(value) 143 } 144 } 145 146 if minimalistic { 147 Text(value) 148 } else if #available(iOS 16.4, *) { 149 ViewThatFits(in: .horizontal) { 150 hLayout 151 vLayout 152 }.accessibilityElement(children: .combine) 153 } else { 154 vLayout 155 .accessibilityElement(children: .combine) 156 } 157 158 } 159 }