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