taler-ios

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

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 }