taler-ios

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

BalancesPendingRowV.swift (5009B)


      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 struct BalancesPendingRowV: View {
     13 //    let symLog: SymLogV?            // inherited from BalancesSectionView
     14     let stack: CallStack
     15     let balance: Balance
     16     @Binding var selectedBalance: Balance?          // <- return here the balance when we go to Transactions
     17     @Binding var pendingTransactions: [TalerTransaction]
     18     let reloadPending: (_ stack: CallStack) async -> ()
     19 
     20     @AppStorage("oimEuro") var oimEuro: Bool = false
     21 
     22     @ViewBuilder func pendingRowLabel() -> some View {
     23         let pendingIncoming = balance.pendingIncoming
     24         let hasIncoming = !pendingIncoming.isZero
     25         let pendingOutgoing = balance.pendingOutgoing
     26         let hasOutgoing = !pendingOutgoing.isZero
     27 
     28         let needsKYCin = balance.flags.contains(.incomingKyc)
     29         let needsKYCout = balance.flags.contains(.outgoingKyc)
     30         let shouldConfirm = balance.flags.contains(.incomingConfirmation)
     31         let needsKYC =  needsKYCin || needsKYCout
     32         let needsKYCStr = String(localized: ". Legitimization required", comment: "a11y")
     33         let needsConfStr = String(localized: ". Needs bank confirmation", comment: "a11y")
     34 
     35         VStack(spacing: 6) {
     36             if hasIncoming {
     37                 PendingRowView(scope: balance.scopeInfo,
     38                               amount: pendingIncoming,
     39                             incoming: true,
     40                        shouldConfirm: shouldConfirm,
     41                             needsKYC: needsKYCin)
     42             }
     43             if hasOutgoing {
     44                 PendingRowView(scope: balance.scopeInfo,
     45                               amount: pendingOutgoing,
     46                             incoming: false,
     47                        shouldConfirm: false,
     48                             needsKYC: needsKYCout)
     49             }
     50             if !hasIncoming && !hasOutgoing {
     51                 // should never happen - but DOES when wallet-core doesn't report P2P as pendingIncoming/pendingOutgoing
     52                 Text("Some pending transactions")
     53                     .talerFont(.body)
     54             }
     55         }
     56         .accessibilityElement(children: .combine)
     57         .accessibilityValue(needsKYC && shouldConfirm ? needsKYCStr + needsConfStr :
     58                                              needsKYC ? needsKYCStr :
     59                                         shouldConfirm ? needsConfStr
     60                                                       : EMPTYSTRING)
     61         .accessibilityHint(String(localized: "Will go to Pending transactions.", comment: "a11y"))
     62     }
     63 
     64     var body: some View {
     65             let destination = TransactionsListView(stack: stack.push(),
     66                                                    scope: balance.scopeInfo,
     67                                                  balance: balance,
     68                                          selectedBalance: $selectedBalance,     // set in there
     69                                                 navTitle: String(localized: "Pending", comment: "ViewTitle of TransactionList"),
     70                                                  oimEuro: oimEuro,
     71                                             transactions: $pendingTransactions,
     72                                          reloadAllAction: reloadPending)
     73             NavigationLink(destination: destination) { pendingRowLabel() }
     74             //let _ = print("button: Pending Transactions: \(currency)")
     75     } // body
     76 } // BalancesPendingRowV
     77 
     78 // MARK: -
     79 #if DEBUG
     80 fileprivate struct BalancesPendingRowV_Previews: PreviewProvider {
     81     @MainActor
     82     struct BindingViewContainer: View {
     83         @State private var previewTransactions: [TalerTransaction] = []
     84         @State private var previewD: CurrencyInfo = CurrencyInfo.zero(DEMOCURRENCY)
     85         @State private var selectedPreviewBalance: Balance? = nil
     86         var body: some View {
     87             let flags: [BalanceFlag] = [.incomingConfirmation]
     88 
     89             let scopeInfo = ScopeInfo(type: ScopeInfo.ScopeInfoType.exchange, currency: DEMOCURRENCY, url: DEMOEXCHANGE)
     90             let balance = Balance(scopeInfo: scopeInfo,
     91                                   available: Amount(currency: DEMOCURRENCY, cent:1000),
     92                             pendingIncoming: Amount(currency: DEMOCURRENCY, cent: 555),
     93                             pendingOutgoing: Amount(currency: DEMOCURRENCY, cent: 333),
     94                                       flags: flags)
     95             BalancesPendingRowV(//symLog: nil,
     96                                  stack: CallStack("Preview"),
     97                                balance: balance,
     98                        selectedBalance: $selectedPreviewBalance,
     99                    pendingTransactions: $previewTransactions,
    100                          reloadPending: {stack in })
    101         }
    102     }
    103 
    104     @MainActor
    105     static var previews: some View {
    106         List {
    107             Section {
    108                 BindingViewContainer()
    109             }
    110         }
    111     }
    112 }
    113 #endif