taler-ios

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

commit cf4e4fc16e614126c1a77ce2ffd9f8200dbcd485
parent 8a6ec56ac0fca133b4a1b4cd1397799e0ec6ee08
Author: Marc Stibane <marc@taler.net>
Date:   Sun, 25 Jun 2023 09:56:23 +0200

viewID + comments

Diffstat:
MTalerWallet1/Views/Balances/BalancesSectionView.swift | 20+++++++++++++++-----
MTalerWallet1/Views/Peer2peer/PaymentPurpose.swift | 4++--
MTalerWallet1/Views/Sheets/P2P_Sheets/P2pReceiveURIView.swift | 4++--
MTalerWallet1/Views/Transactions/TransactionDetailView.swift | 59++++++++++++++++++++++++++++++++---------------------------
MTalerWallet1/Views/Transactions/TransactionsListView.swift | 4++--
MTalerWallet1/Views/WithdrawBankIntegrated/WithdrawTOSView.swift | 2+-
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() } }