taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

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 }