taler-ios

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

commit 703bc06bb7ff959defe612b2d2a6b37fe3fae0f5
parent 4015fe85e2d60793a5f6f4c86128e5f478541c68
Author: Marc Stibane <marc@taler.net>
Date:   Sat, 20 Jul 2024 05:06:25 +0200

BalancesPendingRowV

Diffstat:
MTalerWallet.xcodeproj/project.pbxproj | 6++++++
ATalerWallet1/Views/Balances/BalancesPendingRowV.swift | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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() + } + } + } +}