taler-ios

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

commit d8d3a330160552c5e30b8612df53cfd7bd533480
parent d0118d3b16b8d5a3d2bda2c031f68aaf8cae0e20
Author: Marc Stibane <marc@taler.net>
Date:   Fri,  8 Nov 2024 21:02:21 +0100

P2P

Diffstat:
MTalerWallet1/Model/Model+P2P.swift | 80+++++++++++++++++++++++++++++++++++++++----------------------------------------
MTalerWallet1/Views/Actions/Peer2peer/P2PReadyV.swift | 60++++++++++++++++++++++++++++++++----------------------------
MTalerWallet1/Views/Actions/Peer2peer/P2PSubjectV.swift | 29++++++++++++++++-------------
MTalerWallet1/Views/Actions/Peer2peer/RequestPayment.swift | 50+++++++++++++++++++++++---------------------------
MTalerWallet1/Views/Actions/Peer2peer/SendAmountV.swift | 34+++++++++++++++++++---------------
MTalerWallet1/Views/Actions/Peer2peer/SendAmountView.swift | 28++++++++++++++++------------
MTalerWallet1/Views/Sheets/P2P_Sheets/P2pAcceptDone.swift | 5+++--
MTalerWallet1/Views/Sheets/P2P_Sheets/P2pPayURIView.swift | 13+++++++++----
MTalerWallet1/Views/Sheets/P2P_Sheets/P2pReceiveURIView.swift | 16+++++++++++-----
9 files changed, 168 insertions(+), 147 deletions(-)

diff --git a/TalerWallet1/Model/Model+P2P.swift b/TalerWallet1/Model/Model+P2P.swift @@ -26,8 +26,8 @@ fileprivate struct AmountResponse: Codable { fileprivate struct GetMaxPeerPushDebitAmount: WalletBackendFormattedRequest { typealias Response = AmountResponse func operation() -> String { "getMaxPeerPushDebitAmount" } - func args() -> Args { Args(currency: scope.currency, restrictScope: scope) } - + func args() -> Args { Args(currency: scope.currency, + restrictScope: scope) } var scope: ScopeInfo struct Args: Encodable { var currency: String @@ -35,14 +35,14 @@ fileprivate struct GetMaxPeerPushDebitAmount: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor // M for MainActor - func getMaxPeerPushDebitAmountM(_ scope: ScopeInfo, viewHandles: Bool = false) + nonisolated func getMaxPeerPushDebitAmount(_ scope: ScopeInfo, + viewHandles: Bool = false) async throws -> Amount { let request = GetMaxPeerPushDebitAmount(scope: scope) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response.rawAmount } -} // getMaxPeerPushAmountM +} // getMaxPeerPushAmount // MARK: - check PeerPushDebit struct CheckPeerPushDebitResponse: Codable { let exchangeBaseUrl: String? // API "2:0:1" @@ -53,8 +53,9 @@ struct CheckPeerPushDebitResponse: Codable { fileprivate struct CheckPeerPushDebit: WalletBackendFormattedRequest { typealias Response = CheckPeerPushDebitResponse func operation() -> String { "checkPeerPushDebit" } - func args() -> Args { Args(amount: amount, restrictScope: scope, clientCancellationId: "cancel") } - + func args() -> Args { Args(amount: amount, + restrictScope: scope, + clientCancellationId: "cancel") } var amount: Amount var scope: ScopeInfo struct Args: Encodable { @@ -64,16 +65,15 @@ fileprivate struct CheckPeerPushDebit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor // M for MainActor - func checkPeerPushDebitM(_ amount: Amount, - scope: ScopeInfo, - viewHandles: Bool = false) + nonisolated func checkPeerPushDebit(_ amount: Amount, + scope: ScopeInfo, + viewHandles: Bool = false) async throws -> CheckPeerPushDebitResponse { let request = CheckPeerPushDebit(amount: amount, scope: scope) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // checkPeerPushDebitM +} // checkPeerPushDebit // MARK: - Initiate PeerPushDebit /// Initiate an outgoing peer push payment, send coins struct InitiatePeerPushDebitResponse: Codable { @@ -90,7 +90,6 @@ fileprivate struct InitiatePeerPushDebit: WalletBackendFormattedRequest { func args() -> Args { Args(//exchangeBaseUrl: baseURL, restrictScope: scope, partialContractTerms: terms) } - var scope: ScopeInfo // var baseURL: String? var terms: PeerContractTerms @@ -101,16 +100,15 @@ fileprivate struct InitiatePeerPushDebit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor // M for MainActor - func initiatePeerPushDebitM(/*_ baseURL: String?,*/ scope: ScopeInfo, terms: PeerContractTerms, viewHandles: Bool = false) - async throws -> InitiatePeerPushDebitResponse { - let request = InitiatePeerPushDebit(//exchangeBaseUrl: baseURL, - scope: scope, - terms: terms) + nonisolated func initiatePeerPushDebit(scope: ScopeInfo, + terms: PeerContractTerms, + viewHandles: Bool = false) + async throws -> InitiatePeerPushDebitResponse { + let request = InitiatePeerPushDebit(scope: scope, terms: terms) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // initiatePeerPushDebitM +} // initiatePeerPushDebit // MARK: - PeerPullCredit /// Check fees before sending a request(invoice) to another wallet struct CheckPeerPullCreditResponse: Codable { @@ -137,16 +135,15 @@ fileprivate struct CheckPeerPullCredit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor // M for MainActor - func checkPeerPullCreditM(_ amount: Amount, - scope: ScopeInfo, - viewHandles: Bool = false) + nonisolated func checkPeerPullCredit(_ amount: Amount, + scope: ScopeInfo, + viewHandles: Bool = false) async throws -> CheckPeerPullCreditResponse { let request = CheckPeerPullCredit(amount: amount, scope: scope) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // checkPeerPullCreditM +} // checkPeerPullCredit // - - - - - - /// Initiate an outgoing peer pull payment, send a request(invoice) struct InitiatePeerPullCreditResponse: Codable { @@ -157,7 +154,7 @@ fileprivate struct InitiatePeerPullCredit: WalletBackendFormattedRequest { typealias Response = InitiatePeerPullCreditResponse func operation() -> String { "initiatePeerPullCredit" } func args() -> Args { Args(exchangeBaseUrl: exchangeBaseUrl, - partialContractTerms: partialContractTerms) } + partialContractTerms: partialContractTerms) } var exchangeBaseUrl: String? var partialContractTerms: PeerContractTerms @@ -167,15 +164,16 @@ fileprivate struct InitiatePeerPullCredit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor - func initiatePeerPullCreditM(_ baseURL: String?, terms: PeerContractTerms, viewHandles: Bool = false) // M for MainActor + nonisolated func initiatePeerPullCredit(_ baseURL: String?, + terms: PeerContractTerms, + viewHandles: Bool = false) async throws -> InitiatePeerPullCreditResponse { let request = InitiatePeerPullCredit(exchangeBaseUrl: baseURL, partialContractTerms: terms) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // initiatePeerPullCreditM +} // initiatePeerPullCredit // MARK: - PeerPushCredit /// Prepare an incoming peer push payment, receive coins struct PreparePeerPushCreditResponse: Codable { @@ -198,14 +196,14 @@ fileprivate struct PreparePeerPushCredit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor - func preparePeerPushCreditM(_ talerUri: String, viewHandles: Bool = false) // M for MainActor + nonisolated func preparePeerPushCredit(_ talerUri: String, + viewHandles: Bool = false) async throws -> PreparePeerPushCreditResponse { let request = PreparePeerPushCredit(talerUri: talerUri) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // preparePeerPushCreditM +} // preparePeerPushCredit // - - - - - - /// Accept an incoming peer push payment fileprivate struct AcceptPeerPushCredit: WalletBackendFormattedRequest { @@ -219,14 +217,14 @@ fileprivate struct AcceptPeerPushCredit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor - func acceptPeerPushCreditM(_ transactionId: String, viewHandles: Bool = false) // M for MainActor + nonisolated func acceptPeerPushCredit(_ transactionId: String, + viewHandles: Bool = false) async throws -> Decodable { let request = AcceptPeerPushCredit(transactionId: transactionId) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // acceptPeerPushCreditM +} // acceptPeerPushCredit // MARK: - PeerPullDebit /// Prepare an incoming peer push request(invoice), pay coins struct PreparePeerPullDebitResponse: Codable { @@ -249,14 +247,14 @@ fileprivate struct PreparePeerPullDebit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor - func preparePeerPullDebitM(_ talerUri: String, viewHandles: Bool = false) // M for MainActor + nonisolated func preparePeerPullDebit(_ talerUri: String, + viewHandles: Bool = false) async throws -> PreparePeerPullDebitResponse { let request = PreparePeerPullDebit(talerUri: talerUri) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // preparePeerPullDebitM +} // preparePeerPullDebit // - - - - - - /// Confirm incoming peer push request(invoice) and pay fileprivate struct ConfirmPeerPullDebit: WalletBackendFormattedRequest { @@ -270,11 +268,11 @@ fileprivate struct ConfirmPeerPullDebit: WalletBackendFormattedRequest { } } extension WalletModel { - @MainActor - func confirmPeerPullDebitM(_ transactionId: String, viewHandles: Bool = false) // M for MainActor + nonisolated func confirmPeerPullDebit(_ transactionId: String, + viewHandles: Bool = false) async throws -> Decodable { let request = ConfirmPeerPullDebit(transactionId: transactionId) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } -} // confirmPeerPullDebitM +} // confirmPeerPullDebit diff --git a/TalerWallet1/Views/Actions/Peer2peer/P2PReadyV.swift b/TalerWallet1/Views/Actions/Peer2peer/P2PReadyV.swift @@ -35,6 +35,37 @@ struct P2PReadyV: View { return try await model.getTransactionByIdT(transactionId, viewHandles: viewHandles) } + @MainActor + private func initiateP2P() async { + symLog.log(".task") + guard transactionStarted == false else { +// TODO: logger.warning("Trying to start P2P a second time") + symLog.log("Yikes❗️ Trying to start P2P a second time") + return + } + transactionStarted = true + let timestamp = developerMode ? Timestamp.inSomeMinutes(expireDays > 20 ? (24*60) // 24h + : expireDays > 5 ? 60 // 1h + : 3) // 3m + : Timestamp.inSomeDays(expireDays) + let terms = PeerContractTerms(amount: amountToTransfer, + summary: summary, + purse_expiration: timestamp) + if outgoing { + // TODO: let user choose baseURL + if let response = try? await model.initiatePeerPushDebit(scope: scope, terms: terms) { + // will switch from WithdrawProgressView to TransactionSummaryV + transactionId = response.transactionId + } + } else { + // TODO: let user choose baseURL + if let response = try? await model.initiatePeerPullCredit(nil, terms: terms) { + // will switch from WithdrawProgressView to TransactionSummaryV + transactionId = response.transactionId + } + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -70,6 +101,7 @@ struct P2PReadyV: View { } } .navigationTitle(navTitle) + .task { await initiateP2P() } .onAppear { DebugViewC.shared.setViewID(VIEW_P2P_READY, stack: stack.push()) // print("❗️ P2PReadyV onAppear") @@ -77,34 +109,6 @@ struct P2PReadyV: View { .onDisappear { // print("❗️ P2PReadyV onDisappear") } - .task(id: amountToTransfer.value) { - symLog.log(".task") - guard transactionStarted == false else { -// TODO: logger.warning("Try to start P2P a second time") - symLog.log("Yikes❗️ Try to start P2P a second time") - return - } - transactionStarted = true - let timestamp = developerMode ? Timestamp.inSomeMinutes(expireDays > 20 ? (24*60) - : expireDays > 5 ? 60 : 3) - : Timestamp.inSomeDays(expireDays) - let terms = PeerContractTerms(amount: amountToTransfer, - summary: summary, - purse_expiration: timestamp) - if outgoing { - // TODO: let user choose baseURL - if let response = try? await model.initiatePeerPushDebitM(scope: scope, terms: terms) { - // will switch from WithdrawProgressView to TransactionSummaryV - transactionId = response.transactionId - } - } else { - // TODO: let user choose baseURL - if let response = try? await model.initiatePeerPullCreditM(nil, terms: terms) { - // will switch from WithdrawProgressView to TransactionSummaryV - transactionId = response.transactionId - } - } - } // task } } // MARK: - diff --git a/TalerWallet1/Views/Actions/Peer2peer/P2PSubjectV.swift b/TalerWallet1/Views/Actions/Peer2peer/P2PSubjectV.swift @@ -56,6 +56,21 @@ struct P2PSubjectV: View { comment: "NavTitle: Request 'amountStr'") } + @MainActor + private func checkPeerPushDebit() async { + if outgoing && feeLabel == nil { + if let ppCheck = try? await model.checkPeerPushDebit(amountToTransfer, scope: scope) { + if let feeAmount = p2pFee(ppCheck: ppCheck) { + let feeStr = feeAmount.formatted(scope, isNegative: false) + myFeeLabel = String(localized: "+ \(feeStr) fee") + } else { myFeeLabel = EMPTYSTRING } + } else { + print("❗️ checkPeerPushDebitM failed") + + } + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -140,6 +155,7 @@ struct P2PSubjectV: View { // .scrollBounceBehavior(.basedOnSize) needs iOS 16.4 .navigationTitle(subjectTitle(amountToTransfer)) .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all)) + .task(id: amountToTransfer.value) { await checkPeerPushDebit() } .onAppear { DebugViewC.shared.setViewID(VIEW_P2P_SUBJECT, stack: stack.push()) // print("❗️ P2PSubjectV onAppear") @@ -147,19 +163,6 @@ struct P2PSubjectV: View { .onDisappear { // print("❗️ P2PSubjectV onDisappear") } - .task(id: amountToTransfer.value) { - if outgoing && feeLabel == nil { - if let ppCheck = try? await model.checkPeerPushDebitM(amountToTransfer, scope: scope) { - if let feeAmount = p2pFee(ppCheck: ppCheck) { - let feeStr = feeAmount.formatted(scope, isNegative: false) - myFeeLabel = String(localized: "+ \(feeStr) fee") - } else { myFeeLabel = EMPTYSTRING } - } else { - print("❗️ checkPeerPushDebitM failed") - - } - } - } } } // MARK: - diff --git a/TalerWallet1/Views/Actions/Peer2peer/RequestPayment.swift b/TalerWallet1/Views/Actions/Peer2peer/RequestPayment.swift @@ -22,6 +22,7 @@ struct RequestPayment: View { @State private var balanceIndex = 0 @State private var balance: Balance? = nil // nil only when balances == [] @State private var currencyInfo: CurrencyInfo = CurrencyInfo.zero(UNKNOWN) + @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used private func viewDidLoad() async { if let selectedBalance { @@ -41,19 +42,30 @@ struct RequestPayment: View { comment: "NavTitle: Request") } + @MainActor + private func newBalance() async { + // runs whenever the user changes the exchange via ScopePicker, or on new currencyInfo + symLog.log("❗️ task \(balanceIndex)") + if let balance { + let scopeInfo = balance.scopeInfo + amountToTransfer.setCurrency(scopeInfo.currency) + currencyInfo = controller.info(for: scopeInfo, controller.currencyTicker) + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() #endif let currencySymbol = currencyInfo.symbol - let navA11y = navTitle(currencyInfo.name) + let navA11y = navTitle(currencyInfo.name) // always include currency for a11y let navTitle = navTitle(currencySymbol, currencyInfo.hasSymbol) let count = controller.balances.count let _ = symLog.log("count = \(count)") let scrollView = ScrollView { if count > 0 { - ScopePicker(value: $balanceIndex, - onlyNonZero: false) { index in + ScopePicker(value: $balanceIndex, onlyNonZero: false) + { index in balanceIndex = index balance = controller.balances[index] } @@ -64,6 +76,7 @@ struct RequestPayment: View { balance: $balance, balanceIndex: $balanceIndex, amountLastUsed: $amountLastUsed, + amountToTransfer: $amountToTransfer, summary: $summary) } // ScrollView .navigationTitle(navTitle) @@ -77,6 +90,7 @@ struct RequestPayment: View { symLog.log("❗️ \(navTitle) onDisappear") } .task { await viewDidLoad() } + .task(id: balanceIndex + (1000 * controller.currencyTicker)) { await newBalance() } if #available(iOS 16.0, *) { if #available(iOS 16.4, *) { @@ -92,11 +106,12 @@ struct RequestPayment: View { } // MARK: - struct RequestPaymentContent: View { - private let symLog = SymLogV() + private let symLog = SymLogV(0) let stack: CallStack @Binding var balance: Balance? @Binding var balanceIndex: Int @Binding var amountLastUsed: Amount + @Binding var amountToTransfer: Amount @Binding var summary: String @EnvironmentObject private var controller: Controller @@ -109,7 +124,6 @@ struct RequestPaymentContent: View { @State private var feeStr: String = EMPTYSTRING @State private var buttonSelected = false @State private var shortcutSelected = false - @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var amountShortcut = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var amountZero = Amount.zero(currency: EMPTYSTRING) // needed for isZero @State private var exchange: Exchange? = nil // wg. noFees @@ -156,7 +170,7 @@ struct RequestPaymentContent: View { } do { let baseURL = exchange?.exchangeBaseUrl - let ppCheck = try await model.checkPeerPullCreditM(amount, scope: scopeInfo, viewHandles: true) + let ppCheck = try await model.checkPeerPullCredit(amount, scope: scopeInfo, viewHandles: true) let raw = ppCheck.amountRaw let effective = ppCheck.amountEffective if let fee = fee(raw: raw, effective: effective) { @@ -236,32 +250,14 @@ struct RequestPaymentContent: View { feeIsNegative: true, computeFee: computeFee) .background(actions) - } - } // Group - .task(id: balanceIndex + (1000 * controller.currencyTicker)) { - // runs whenever the user changes the exchange via ScopePicker, or on new currencyInfo - symLog.log("❗️ task \(balanceIndex)") + } } // if, Group + .task { scopeInfo = balance.scopeInfo - amountToTransfer.setCurrency(scopeInfo.currency) } } else { // no balance - Yikes Text("No balance. There seems to be a problem with the database...") } -// .task(id: amountToTransfer.value) { -// if exchange == nil { -// if let url = scopeInfo.url { -// exchange = try? await model.getExchangeByUrl(url: url) -// } -// } -// if amountToTransfer.isZero { -// // fee = EMPTYSTRING -// } else { -// let baseURL = exchange?.exchangeBaseUrl -// // peerPullCheck = try? await model.checkPeerPullCreditM(amountToTransfer, exchangeBaseUrl: nil) -// peerPullCheck = try? await model.checkPeerPullCreditM(baseURL, amount: amountToTransfer) -// } -// } - } + } // body } // MARK: - #if DEBUG diff --git a/TalerWallet1/Views/Actions/Peer2peer/SendAmountV.swift b/TalerWallet1/Views/Actions/Peer2peer/SendAmountV.swift @@ -26,6 +26,7 @@ struct SendAmountV: View { @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) // Update currency when used @State private var amountAvailable = Amount.zero(currency: EMPTYSTRING) // GetMaxPeerPushAmount + @MainActor private func viewDidLoad() async { if let selectedBalance { if selectedBalance.available.isZero { @@ -45,6 +46,23 @@ struct SendAmountV: View { } } + @MainActor + private func newBalance() async { + // runs whenever the user changes the exchange via ScopePicker, or on new currencyInfo + symLog.log("❗️ task \(balanceIndex)") + if let balance { + let scope = balance.scopeInfo + amountToTransfer.setCurrency(scope.currency) + currencyInfo = controller.info(for: scope, controller.currencyTicker) + do { + amountAvailable = try await model.getMaxPeerPushDebitAmount(scope) + } catch { + // TODO: Error + amountAvailable = balance.available + } + } + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -87,21 +105,7 @@ struct SendAmountV: View { // symLog.log("❗️ \(navTitle) onDisappear") // } .task { await viewDidLoad() } - .task(id: balanceIndex + (1000 * controller.currencyTicker)) { - // runs whenever the user changes the exchange via ScopePicker, or on new currencyInfo - symLog.log("❗️ task \(balanceIndex)") - if let balance { - let scope = balance.scopeInfo - amountToTransfer.setCurrency(scope.currency) - currencyInfo = controller.info(for: scope, controller.currencyTicker) - do { - amountAvailable = try await model.getMaxPeerPushDebitAmountM(scope) - } catch { - // TODO: Error - amountAvailable = balance.available - } - } - } + .task(id: balanceIndex + (1000 * controller.currencyTicker)) { await newBalance() } if #available(iOS 16.0, *) { if #available(iOS 16.4, *) { diff --git a/TalerWallet1/Views/Actions/Peer2peer/SendAmountView.swift b/TalerWallet1/Views/Actions/Peer2peer/SendAmountView.swift @@ -73,6 +73,7 @@ struct SendAmountView: View { : true // TODO: !(feeAmount?.isZero ?? false) } + @MainActor private func computeFee(_ amount: Amount) async -> ComputeFeeResult? { if amount.isZero { return ComputeFeeResult.zero() @@ -83,7 +84,7 @@ struct SendAmountView: View { } if let scopeInfo { do { - let ppCheck = try await model.checkPeerPushDebitM(amount, scope: scopeInfo, viewHandles: true) + let ppCheck = try await model.checkPeerPushDebit(amount, scope: scopeInfo, viewHandles: true) let raw = ppCheck.amountRaw let effective = ppCheck.amountEffective if let fee = fee(raw: raw, effective: effective) { @@ -120,6 +121,19 @@ struct SendAmountView: View { return nil } + @MainActor + private func newBalance() async { + let scope = balance.scopeInfo + symLog.log("❗️ task \(scope.currency)") + + if let available = try? await model.getMaxPeerPushDebitAmount(scope, viewHandles: true) { + amountAvailable = available + } else { + amountAvailable = Amount.zero(currency: scope.currency) + } + scopeInfo = scope + } + var body: some View { #if PRINT_CHANGES let _ = Self._printChanges() @@ -169,6 +183,7 @@ struct SendAmountView: View { Text(" ") } } // Group + .task(id: balance) { await newBalance() } .onAppear { DebugViewC.shared.setViewID(VIEW_P2P_SEND, stack: stack.push()) symLog.log("❗️ onAppear") @@ -176,17 +191,6 @@ struct SendAmountView: View { .onDisappear { symLog.log("❗️ onDisappear") } - .task(id: balance) { // getMaxPeerPushDebit on first appearance - let scope = balance.scopeInfo - symLog.log("❗️ task \(scope.currency)") - - if let available = try? await model.getMaxPeerPushDebitAmountM(scope, viewHandles: true) { - amountAvailable = available - } else { - amountAvailable = Amount.zero(currency: scope.currency) - } - scopeInfo = scope - } // .task(id: amountToTransfer.value) { // if exchange == nil { // if let url = scopeInfo.url { diff --git a/TalerWallet1/Views/Sheets/P2P_Sheets/P2pAcceptDone.swift b/TalerWallet1/Views/Sheets/P2P_Sheets/P2pAcceptDone.swift @@ -17,13 +17,14 @@ struct P2pAcceptDone: View { @EnvironmentObject private var controller: Controller @EnvironmentObject private var model: WalletModel + @MainActor private func viewDidLoad() async { if incoming { - if let _ = try? await model.acceptPeerPushCreditM(transactionId) { + if let _ = try? await model.acceptPeerPushCredit(transactionId) { dismissTop(stack.push()) } } else { - if let _ = try? await model.confirmPeerPullDebitM(transactionId) { + if let _ = try? await model.confirmPeerPullDebit(transactionId) { dismissTop(stack.push()) } } diff --git a/TalerWallet1/Views/Sheets/P2P_Sheets/P2pPayURIView.swift b/TalerWallet1/Views/Sheets/P2P_Sheets/P2pPayURIView.swift @@ -26,6 +26,14 @@ struct P2pPayURIView: View { let navTitle = String(localized: "Pay P2P", comment: "Nav Title") + @MainActor + private func viewDidLoad() async { + do { + symLog.log(".task") + peerPullDebitResponse = try? await model.preparePeerPullDebit(url.absoluteString) + } + } + var body: some View { VStack { if let peerPullDebitResponse { @@ -82,10 +90,7 @@ struct P2pPayURIView: View { let message: String? = nil #endif LoadingView(scopeInfo: nil, message: message) - .task { do { - symLog.log(".task") - peerPullDebitResponse = try? await model.preparePeerPullDebitM(url.absoluteString) - } } + .task { await viewDidLoad() } } } .onAppear() { diff --git a/TalerWallet1/Views/Sheets/P2P_Sheets/P2pReceiveURIView.swift b/TalerWallet1/Views/Sheets/P2P_Sheets/P2pReceiveURIView.swift @@ -1,7 +1,10 @@ /* - * This file is part of GNU Taler, ©2022-23 Taler Systems S.A. + * This file is part of GNU Taler, ©2022-24 Taler Systems S.A. * See LICENSE.md */ +/** + * @author Marc Stibane + */ import SwiftUI import taler_swift import SymLog @@ -31,7 +34,7 @@ struct P2pReceiveURIView: View { @MainActor private func viewDidLoad() async { symLog.log(".task") - if let ppResponse = try? await model.preparePeerPushCreditM(url.absoluteString) { + if let ppResponse = try? await model.preparePeerPushCredit(url.absoluteString) { let baseUrl = ppResponse.exchangeBaseUrl exchange = try? await model.getExchangeByUrl(url: baseUrl) await controller.checkCurrencyInfo(for: baseUrl, model: model) @@ -42,6 +45,10 @@ struct P2pReceiveURIView: View { } var body: some View { +#if PRINT_CHANGES + let _ = Self._printChanges() + let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear +#endif VStack { if let peerPushCreditResponse { let tosAccepted = exchange?.tosStatus == .accepted @@ -106,12 +113,11 @@ struct P2pReceiveURIView: View { LoadingView(scopeInfo: nil, message: message) } } + // must be here and not at LoadingView(), because this needs to run a 2nd time after ToS was accepted + .task { await viewDidLoad() } .onAppear() { symLog.log("onAppear") DebugViewC.shared.setSheetID(SHEET_RCV_P2P) } - .task { // must be here and not at LoadingView(), because this needs to run a 2nd time after ToS was accepted - await viewDidLoad() - } } }