taler-ios

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

commit 36e1f7903b6cc8409208b1e5f1c6df52e55ba03e
parent 1c8d0f21d781e1c414bf54a9b8acbad6a932b363
Author: Marc Stibane <marc@taler.net>
Date:   Fri,  8 Nov 2024 21:52:20 +0100

Pay

Diffstat:
MTalerWallet1/Model/Model+Payment.swift | 34+++++++++++++++++++---------------
MTalerWallet1/Views/Sheets/Payment/PayTemplateV.swift | 8+++++---
MTalerWallet1/Views/Sheets/Payment/PaymentDone.swift | 2+-
MTalerWallet1/Views/Sheets/Payment/PaymentView.swift | 8++++----
4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/TalerWallet1/Model/Model+Payment.swift b/TalerWallet1/Model/Model+Payment.swift @@ -137,13 +137,18 @@ struct ExchangeFeeGapEstimate: Codable { let maxEffectiveSpendAmount: Amount } +struct PerScopeDetails: Codable { + let scopeInfo: ScopeInfo +} /// The result from PreparePayForUri struct PreparePayResult: Codable { let status: PreparePayResultType let transactionId: String let contractTerms: MerchantContractTerms let scopes: [ScopeInfo] +// let detailsPerScope: [ScopeInfo : PreparePayDetails] let amountRaw: Amount + let amountEffective: Amount? // only if status != insufficientBalance let paid: Bool? // only if status == alreadyConfirmed let talerUri: String? @@ -234,7 +239,7 @@ struct ConfirmPayResult: Decodable { var transactionId: String } /// A request to get an exchange's payment details. -fileprivate struct confirmPayForUri: WalletBackendFormattedRequest { +fileprivate struct ConfirmPayForUri: WalletBackendFormattedRequest { typealias Response = ConfirmPayResult func operation() -> String { "confirmPay" } func args() -> Args { Args(transactionId: transactionId) } @@ -247,32 +252,31 @@ fileprivate struct confirmPayForUri: WalletBackendFormattedRequest { // MARK: - extension WalletModel { /// load payment details. Networking involved - @MainActor - func preparePayForUriM(_ talerPayUri: String, viewHandles: Bool = false) // M for MainActor - async throws -> PreparePayResult { - let request = PreparePayForUri(talerPayUri: talerPayUri) - let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) - return response - } - @MainActor - func checkPayForTemplateM(_ talerPayTemplateUri: String, viewHandles: Bool = false) // M for MainActor + nonisolated func checkPayForTemplate(_ talerPayTemplateUri: String, viewHandles: Bool = false) async throws -> WalletTemplateDetails { let request = CheckPayForTemplate(talerPayTemplateUri: talerPayTemplateUri) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } - @MainActor - func preparePayForTemplateM(_ talerPayTemplateUri: String, amount: Amount?, summary: String?, viewHandles: Bool = false) // M for MainActor + + nonisolated func preparePayForTemplate(_ talerPayTemplateUri: String, amount: Amount?, summary: String?, viewHandles: Bool = false) async throws -> PreparePayResult { let templateParams = TemplateParams(amount: amount, summary: summary) let request = PreparePayForTemplateRequest(talerPayTemplateUri: talerPayTemplateUri, templateParams: templateParams) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } - @MainActor - func confirmPayM(_ transactionId: String, viewHandles: Bool = false) // M for MainActor + + nonisolated func preparePayForUri(_ talerPayUri: String, viewHandles: Bool = false) + async throws -> PreparePayResult { + let request = PreparePayForUri(talerPayUri: talerPayUri) + let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) + return response + } + + nonisolated func confirmPay(_ transactionId: String, viewHandles: Bool = false) async throws -> ConfirmPayResult { - let request = confirmPayForUri(transactionId: transactionId) + let request = ConfirmPayForUri(transactionId: transactionId) let response = try await sendRequest(request, ASYNCDELAY, viewHandles: viewHandles) return response } diff --git a/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift b/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift @@ -54,10 +54,12 @@ struct PayTemplateV: View { private func buttonAction2() { buttonSelected2 = true } + + @MainActor func acceptAction(preparePayResult: PreparePayResult) { Task { // runs on MainActor - if let confirmPayResult = try? await model.confirmPayM(preparePayResult.transactionId) { - // symLog.log(confirmPayResult as Any) + if let confirmPayResult = try? await model.confirmPay(preparePayResult.transactionId) { +// symLog.log(confirmPayResult as Any) if confirmPayResult.type != "done" { controller.playSound(0) // TODO: show error @@ -82,7 +84,7 @@ struct PayTemplateV: View { @MainActor private func viewDidLoad() async { - if let response = try? await model.checkPayForTemplateM(url.absoluteString) { + if let response = try? await model.checkPayForTemplate(url.absoluteString) { let details = response.templateDetails let defaults = details.editableDefaults // might be nil, or its fields might be nil // TODO: let the user choose a currency from supportedCurrencies[] diff --git a/TalerWallet1/Views/Sheets/Payment/PaymentDone.swift b/TalerWallet1/Views/Sheets/Payment/PaymentDone.swift @@ -25,7 +25,7 @@ struct PaymentDone: View { @MainActor private func viewDidLoad() async { - if let confirmPayResult = try? await model.confirmPayM(transactionId) { + if let confirmPayResult = try? await model.confirmPay(transactionId) { // symLog.log(confirmPayResult as Any) if confirmPayResult.type == "done" { paymentDone = true diff --git a/TalerWallet1/Views/Sheets/Payment/PaymentView.swift b/TalerWallet1/Views/Sheets/Payment/PaymentView.swift @@ -115,14 +115,14 @@ struct PaymentView: View, Sendable { private func viewDidLoad() async { // symLog.log(".task") if template { - if let templateResponse = try? await model.preparePayForTemplateM(url.absoluteString, - amount: amountIsEditable ? amountToTransfer : nil, - summary: summaryIsEditable ? summary : nil) { + if let templateResponse = try? await model.preparePayForTemplate(url.absoluteString, + amount: amountIsEditable ? amountToTransfer : nil, + summary: summaryIsEditable ? summary : nil) { await checkCurrencyInfo(for: templateResponse) preparePayResult = templateResponse } } else { - if let payResponse = try? await model.preparePayForUriM(url.absoluteString) { + if let payResponse = try? await model.preparePayForUri(url.absoluteString) { amountToTransfer = payResponse.amountRaw await checkCurrencyInfo(for: payResponse) preparePayResult = payResponse