commit cf4e4fc16e614126c1a77ce2ffd9f8200dbcd485
parent 8a6ec56ac0fca133b4a1b4cd1397799e0ec6ee08
Author: Marc Stibane <marc@taler.net>
Date: Sun, 25 Jun 2023 09:56:23 +0200
viewID + comments
Diffstat:
6 files changed, 54 insertions(+), 39 deletions(-)
diff --git a/TalerWallet1/Views/Balances/BalancesSectionView.swift b/TalerWallet1/Views/Balances/BalancesSectionView.swift
@@ -56,6 +56,8 @@ struct BalancesSectionView: View {
return (incoming, outgoing)
}
+ @State private var sectionID = UUID()
+ @State private var shownSectionID = UUID() // guaranteed to be different the first time
var body: some View {
#if DEBUG
@@ -66,14 +68,17 @@ struct BalancesSectionView: View {
let reloadCompleted = {
transactions = await model.fetchTransactionsT(currency: currency)
completedTransactions = WalletModel.completedTransactions(transactions)
+// sectionID = UUID()
}
let reloadPending = {
transactions = await model.fetchTransactionsT(currency: currency)
pendingTransactions = WalletModel.pendingTransactions(transactions)
+// sectionID = UUID()
}
let reloadUncompleted = {
transactions = await model.fetchTransactionsT(currency: currency)
uncompletedTransactions = WalletModel.uncompletedTransactions(transactions)
+// sectionID = UUID()
}
let deleteAction = model.deleteTransactionT // dummyTransaction
let abortAction = model.abortTransactionT
@@ -178,11 +183,16 @@ struct BalancesSectionView: View {
} header: {
Text(currency)
.font(.title)
- } .task {
- let response = await model.fetchTransactionsT(currency: currency)
- transactions = response
- pendingTransactions = WalletModel.pendingTransactions(response)
- uncompletedTransactions = WalletModel.uncompletedTransactions(response)
+ }.id(sectionID)
+ .task {
+ if shownSectionID != sectionID {
+ symLog.log("task for BalancesSectionView \(sectionID)")
+ let response = await model.fetchTransactionsT(currency: currency)
+ transactions = response
+ pendingTransactions = WalletModel.pendingTransactions(response)
+ uncompletedTransactions = WalletModel.uncompletedTransactions(response)
+ shownSectionID = sectionID
+ }
}
} // body
}
diff --git a/TalerWallet1/Views/Peer2peer/PaymentPurpose.swift b/TalerWallet1/Views/Peer2peer/PaymentPurpose.swift
@@ -80,10 +80,10 @@ struct PaymentPurpose: View {
.frame(maxWidth: .infinity, alignment: .leading)
.padding(.horizontal)
}
- .navigationTitle("Invoice another Wallet")
+ .navigationTitle("Invoice")
.background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all))
.onAppear {
- DebugViewC.shared.setSheetID(VIEW_INVOICE_PURPOSE)
+ DebugViewC.shared.setViewID(VIEW_INVOICE_PURPOSE)
print("❗️ PaymentPurpose onAppear")
}
.onDisappear {
diff --git a/TalerWallet1/Views/Sheets/P2P_Sheets/P2pReceiveURIView.swift b/TalerWallet1/Views/Sheets/P2P_Sheets/P2pReceiveURIView.swift
@@ -6,8 +6,8 @@ import SwiftUI
import taler_swift
import SymLog
-// Will be called either by the user scanning a QR code or tapping the provided link, from another user's SendCoins
-// we show the user the P2P details - but first the ToS must be accepted
+// Will be called either by the user scanning a QR code or tapping the provided link,
+// from another user's SendCoins. We show the P2P details - but first the ToS must be accepted.
struct P2pReceiveURIView: View {
private let symLog = SymLogV()
let navTitle = String(localized: "Accept P2P Receive")
diff --git a/TalerWallet1/Views/Transactions/TransactionDetailView.swift b/TalerWallet1/Views/Transactions/TransactionDetailView.swift
@@ -7,8 +7,8 @@ import taler_swift
import SymLog
extension Transaction { // for Dummys
- init(dummy: Bool) {
- let amount = try! Amount(fromString: "KUDOS:0")
+ init(dummyCurrency: String) {
+ let amount = try! Amount(fromString: "\(dummyCurrency):0")
let now = Timestamp.now()
let common = TransactionCommon(type: .dummy,
txState: TransactionState(major: .pending),
@@ -27,8 +27,8 @@ struct TransactionDetailView: View {
@AppStorage("developerMode") var developerMode: Bool = false
var transactionId: String
- @State var transaction: Transaction = Transaction(dummy: true)
- @State var viewId: Int = 0
+ @State var transaction: Transaction = Transaction(dummyCurrency: DEMOCURRENCY)
+ @State var viewId = UUID()
var reloadAction: ((_ transactionId: String) async throws -> Transaction)
var deleteAction: ((_ transactionId: String) async throws -> Void)?
@@ -59,7 +59,7 @@ struct TransactionDetailView: View {
TransactionButton(transactionId: common.transactionId,
command: .resume, action: resumeAction)
} }
- }
+ } // Suspend + Resume buttons
Text("\(dateString)")
.font(.title2)
// .listRowSeparator(.hidden)
@@ -68,46 +68,52 @@ struct TransactionDetailView: View {
if transaction.isAbortable { if let abortAction {
TransactionButton(transactionId: common.transactionId,
command: .abort, action: abortAction)
- } }
+ } } // Abort button
if transaction.isDeleteable { if let deleteAction {
TransactionButton(transactionId: common.transactionId,
command: .delete, action: deleteAction)
- } }
+ } } // Delete button
if let doneAction {
DoneButton(doneAction: doneAction)
- }
- }.id(viewId)
+ } // Done button
+ }.id(viewId) // change viewId to enforce a draw update
.listStyle(myListStyle.style).anyView
}.onNotification(.TransactionStateTransition) { notification in
if let transition = notification.userInfo?[TRANSACTIONTRANSITION] as? TransactionTransition {
if transition.transactionId == common.transactionId {
let newState = transition.newTxState.major
if newState == .done { if let doneAction {
- symLog.log("newTxState.major == done")
- doneAction()
+ symLog.log("newTxState.major == done => dismiss sheet")
+ doneAction() // if this view is in a sheet this action will dissmiss it
}} else { Task { do {
- symLog.log("newState: \(newState), reloading transaction")
- withAnimation() { transaction = Transaction(dummy: true); viewId += 1 }
- let reloadedTransaction = try await reloadAction(common.transactionId)
- symLog.log("reloaded transaction: \(reloadedTransaction.common.txState.major)")
- withAnimation() { transaction = reloadedTransaction; viewId += 1 } // redraw
+ if doneAction != nil { // don't update while we are in a sheet - except done
+ symLog.log("ignoring newState: \(newState)")
+ } else {
+ symLog.log("newState: \(newState), reloading transaction")
+ withAnimation() { transaction = Transaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() }
+ let reloadedTransaction = try await reloadAction(common.transactionId)
+ symLog.log("reloaded transaction: \(reloadedTransaction.common.txState.major)")
+ withAnimation() { transaction = reloadedTransaction; viewId = UUID() } // redraw
+ }
} catch {
symLog.log(error.localizedDescription)
}}}
}
} else {
+ // Yikes - should never happen
symLog.log(notification.userInfo as Any)
}
}
.navigationTitle(navTitle)
.task {
do {
- symLog.log("task")
+ symLog.log("task - load transaction")
let reloadedTransaction = try await reloadAction(transactionId)
- withAnimation() { transaction = reloadedTransaction } // redraw
+ withAnimation() { transaction = reloadedTransaction; viewId = UUID() } // redraw
} catch {
- withAnimation() { transaction = Transaction(dummy: true) }
+ symLog.log(error)
+ withAnimation() { transaction = Transaction(dummyCurrency: DEMOCURRENCY); viewId = UUID() }
}
}
.onAppear {
@@ -129,7 +135,7 @@ struct TransactionDetailView: View {
let pending = transaction.isPending
switch transaction {
case .dummy(let dummyTransaction):
- Text("Dummy")
+ Text("")
case .withdrawal(let withdrawalTransaction):
let details = withdrawalTransaction.details
if pending {
@@ -153,7 +159,7 @@ struct TransactionDetailView: View {
}
}
}
- }
+ } // ManualDetails or Confirm with bank
ThreeAmounts(common: common, topTitle: String(localized: "Chosen amount to withdraw:"),
baseURL: withdrawalTransaction.details.exchangeBaseUrl, large: true)
case .payment(let paymentTransaction):
@@ -182,7 +188,8 @@ struct TransactionDetailView: View {
baseURL: nil, large: true) // TODO: baseURL
case .peer2peer(let p2pTransaction):
let details = p2pTransaction.details // TODO: details
- if pending {
+ // TODO: isSendCoins should show QR only while not expired
+ if pending || transaction.isSendCoins {
QRCodeDetails(transaction: transaction)
}
ThreeAmounts(common: common, topTitle: String(localized: "Peer to Peer:"),
@@ -199,15 +206,13 @@ struct TransactionDetailView: View {
if keys.contains(TALERURI) {
if let talerURI = details[TALERURI] {
if talerURI.count > 10 {
- VStack {
- QRGeneratorView(text: talerURI)
- Text(talerURI)
- }
+ QRCodeDetailView(talerURI: talerURI,
+ incoming: transaction.isP2pIncoming)
}
}
} else if keys.contains(EXCHANGEBASEURL) {
if let baseURL = details[EXCHANGEBASEURL] {
- Text("from \(baseURL.trimURL())")
+ Text("from \(baseURL.trimURL())")
.font(.title2)
.padding(.bottom)
}
diff --git a/TalerWallet1/Views/Transactions/TransactionsListView.swift b/TalerWallet1/Views/Transactions/TransactionsListView.swift
@@ -88,6 +88,7 @@ extension TransactionsListView {
// }
// }
+ @State var viewId = UUID()
var body: some View {
#if DEBUG
let _ = Self._printChanges()
@@ -97,7 +98,6 @@ extension TransactionsListView {
ScrollViewReader { scrollView in
List {
ForEach(Array(zip(transactions.indices, transactions)), id: \.1) { index, transaction in
-// let common = transaction.common
NavigationLink { LazyView { // whole row like in a tableView
// pending may not be deleted, but only aborted
TransactionDetailView(transactionId: transaction.id,
@@ -115,7 +115,7 @@ extension TransactionsListView {
.refreshable {
symLog?.log("refreshing")
await reloadAllAction()
- }
+ }.id(viewId)
.listStyle(myListStyle.style).anyView
.onAppear {
upAction = { withAnimation { scrollView.scrollTo(0) }}
diff --git a/TalerWallet1/Views/WithdrawBankIntegrated/WithdrawTOSView.swift b/TalerWallet1/Views/WithdrawBankIntegrated/WithdrawTOSView.swift
@@ -30,7 +30,7 @@ struct WithdrawTOSView: View {
_ = try await model.setExchangeTOSAcceptedM(exchangeBaseUrl, etag: exchangeTOS!.currentEtag)
if acceptAction != nil {
acceptAction!()
- } else {
+ } else { // just go back - caller will reload
self.presentationMode.wrappedValue.dismiss()
}
}