commit 703bc06bb7ff959defe612b2d2a6b37fe3fae0f5
parent 4015fe85e2d60793a5f6f4c86128e5f478541c68
Author: Marc Stibane <marc@taler.net>
Date: Sat, 20 Jul 2024 05:06:25 +0200
BalancesPendingRowV
Diffstat:
2 files changed, 114 insertions(+), 0 deletions(-)
diff --git a/TalerWallet.xcodeproj/project.pbxproj b/TalerWallet.xcodeproj/project.pbxproj
@@ -139,6 +139,8 @@
4E3EAEA82AA70157009F1BE8 /* Binding+onChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3EAEA72AA70157009F1BE8 /* Binding+onChange.swift */; };
4E3EAEA92AA70157009F1BE8 /* Binding+onChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E3EAEA72AA70157009F1BE8 /* Binding+onChange.swift */; };
4E40E0BE29F25ABB00B85369 /* SendAmount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E40E0BD29F25ABB00B85369 /* SendAmount.swift */; };
+ 4E448AB72C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */; };
+ 4E448AB82C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */; };
4E4F60A82C3BBF9F003BB669 /* View+Condition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4F60A72C3BBF9F003BB669 /* View+Condition.swift */; };
4E4F60A92C3BBF9F003BB669 /* View+Condition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E4F60A72C3BBF9F003BB669 /* View+Condition.swift */; };
4E50B3502A1BEE8000F9F01C /* ManualWithdraw.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E50B34F2A1BEE8000F9F01C /* ManualWithdraw.swift */; };
@@ -365,6 +367,7 @@
4E3EAEA12AA12582009F1BE8 /* Nunito-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Nunito-BoldItalic.ttf"; sourceTree = "<group>"; };
4E3EAEA72AA70157009F1BE8 /* Binding+onChange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Binding+onChange.swift"; sourceTree = "<group>"; };
4E40E0BD29F25ABB00B85369 /* SendAmount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendAmount.swift; sourceTree = "<group>"; };
+ 4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BalancesPendingRowV.swift; sourceTree = "<group>"; };
4E4F60A72C3BBF9F003BB669 /* View+Condition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "View+Condition.swift"; sourceTree = "<group>"; };
4E50B34F2A1BEE8000F9F01C /* ManualWithdraw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManualWithdraw.swift; sourceTree = "<group>"; };
4E53A33629F50B7B00830EC2 /* CurrencyField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencyField.swift; sourceTree = "<group>"; };
@@ -792,6 +795,7 @@
children = (
4EB095372989CBFE0043A8A1 /* BalancesListView.swift */,
4EB0953A2989CBFE0043A8A1 /* BalancesSectionView.swift */,
+ 4E448AB62C4A4109007D5C92 /* BalancesPendingRowV.swift */,
4EB095362989CBFE0043A8A1 /* BalanceRowView.swift */,
4EB065432A4CD1A80039B91D /* TwoRowButtons.swift */,
4EB095382989CBFE0043A8A1 /* PendingRowView.swift */,
@@ -1182,6 +1186,7 @@
4E3327BA2AD1635100BF5AD6 /* AsyncSemaphore.swift in Sources */,
4ED80E8E2B8F6212008BD576 /* QuickDataTask.swift in Sources */,
4E3EAE2C2A990778009F1BE8 /* ManualWithdraw.swift in Sources */,
+ 4E448AB72C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */,
4E3EAE2D2A990778009F1BE8 /* Model+Exchange.swift in Sources */,
4EBC0F012B7B3CD600C0CB19 /* DepositIbanV.swift in Sources */,
4E3EAE2E2A990778009F1BE8 /* QRCodeDetailView.swift in Sources */,
@@ -1308,6 +1313,7 @@
4E3327BB2AD1635100BF5AD6 /* AsyncSemaphore.swift in Sources */,
4ED80E8F2B8F6212008BD576 /* QuickDataTask.swift in Sources */,
4E50B3502A1BEE8000F9F01C /* ManualWithdraw.swift in Sources */,
+ 4E448AB82C4A4109007D5C92 /* BalancesPendingRowV.swift in Sources */,
4E3B4BC92A42BC4800CC88B8 /* Model+Exchange.swift in Sources */,
4EBC0F022B7B3CD600C0CB19 /* DepositIbanV.swift in Sources */,
4E5A88F52A38A4FD00072618 /* QRCodeDetailView.swift in Sources */,
diff --git a/TalerWallet1/Views/Balances/BalancesPendingRowV.swift b/TalerWallet1/Views/Balances/BalancesPendingRowV.swift
@@ -0,0 +1,108 @@
+/*
+ * This file is part of GNU Taler, ©2022-24 Taler Systems S.A.
+ * See LICENSE.md
+ */
+import SwiftUI
+import taler_swift
+//import SymLog
+
+struct BalancesPendingRowV: View {
+// let symLog: SymLogV? // inherited from BalancesSectionView
+ let stack: CallStack
+ let currencyInfo: CurrencyInfo
+ let balance: Balance
+ @Binding var pendingTransactions: [Transaction]
+ let reloadPending: (_ stack: CallStack) async -> ()
+ let reloadOneAction: ((_ transactionId: String, _ viewHandles: Bool) async throws -> Transaction)?
+
+ @ViewBuilder func pendingRowLabel() -> some View {
+ let pendingIncoming = balance.pendingIncoming
+ let hasIncoming = !pendingIncoming.isZero
+ let pendingOutgoing = balance.pendingOutgoing
+ let hasOutgoing = !pendingOutgoing.isZero
+
+ let needsKYCin = balance.flags.contains(.incomingKyc)
+ let needsKYCout = balance.flags.contains(.outgoingKyc)
+ let shouldConfirm = balance.flags.contains(.incomingConfirmation)
+ let needsKYC = needsKYCin || needsKYCout
+ let needsKYCStr = String(localized: ". Needs K Y C", comment: "VoiceOver")
+ let needsConfStr = String(localized: ". Needs bank confirmation", comment: "VoiceOver")
+
+ VStack(spacing: 6) {
+ if hasIncoming {
+ PendingRowView(amount: pendingIncoming,
+ incoming: true,
+ shouldConfirm: shouldConfirm,
+ needsKYC: needsKYCin)
+ }
+ if hasOutgoing {
+ PendingRowView(amount: pendingOutgoing,
+ incoming: false,
+ shouldConfirm: false,
+ needsKYC: needsKYCout)
+ }
+ if !hasIncoming && !hasOutgoing {
+ // should never happen - but DOES when wallet-core doesn't report P2P as pendingIncoming/pendingOutgoing
+ Text("Some pending transactions")
+ .talerFont(.body)
+ }
+ }
+ .accessibilityElement(children: .combine)
+ .accessibilityValue(needsKYC && shouldConfirm ? needsKYCStr + needsConfStr :
+ needsKYC ? needsKYCStr :
+ shouldConfirm ? needsConfStr
+ : EMPTYSTRING)
+ .accessibilityHint(String(localized: "Will go to Pending transactions."))
+ }
+
+ var body: some View {
+ if let reloadOneAction {
+ let destination = LazyView {
+ TransactionsListView(stack: stack.push(),
+ navTitle: String(localized: "Pending", comment: "ViewTitle of TransactionList"),
+ scopeInfo: balance.scopeInfo,
+ transactions: pendingTransactions,
+ reloadAllAction: reloadPending,
+ reloadOneAction: reloadOneAction)
+ }
+ NavigationLink(destination: destination, label: { pendingRowLabel() })
+ //let _ = print("button: Pending Transactions: \(currency)")
+ } else { // just for Preview
+ NavigationLink(destination: EmptyView(), label: { pendingRowLabel() })
+ }
+ } // body
+} // BalancesPendingRowV
+
+// MARK: -
+struct BalancesPendingRowV_Previews: PreviewProvider {
+ @MainActor
+ fileprivate struct BindingViewContainer: View {
+ @State private var pendingTransactions: [Transaction] = []
+ var body: some View {
+ let flags: [BalanceFlag] = [.incomingConfirmation]
+
+ let scopeInfo = ScopeInfo(type: ScopeInfo.ScopeInfoType.exchange, url: DEMOEXCHANGE, currency: DEMOCURRENCY)
+ let balance = Balance(scopeInfo: scopeInfo,
+ available: Amount(currency: DEMOCURRENCY, cent:1000),
+ pendingIncoming: Amount(currency: DEMOCURRENCY, cent: 555),
+ pendingOutgoing: Amount(currency: DEMOCURRENCY, cent: 333),
+ flags: flags)
+ BalancesPendingRowV(//symLog: nil,
+ stack: CallStack("Preview"),
+ currencyInfo: CurrencyInfo.zero(DEMOCURRENCY),
+ balance: balance,
+ pendingTransactions: $pendingTransactions,
+ reloadPending: {stack in },
+ reloadOneAction: nil)
+ }
+ }
+
+ @MainActor
+ static var previews: some View {
+ List {
+ Section {
+ BindingViewContainer()
+ }
+ }
+ }
+}