taler-ios

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

commit 9a431e9b0103d968e6019f3521b26ae1896c1fb4
parent 8fe9a668b0402e5ec4895a2933d608abdc3f33e3
Author: Marc Stibane <marc@taler.net>
Date:   Fri,  7 Aug 2026 07:57:44 +0200

WithdrawExchangeScan

Diffstat:
MTalerWallet1/Controllers/DebugViewC.swift | 2+-
MTalerWallet1/Views/Actions/Banking/ManualWithdraw.swift | 6+++---
MTalerWallet1/Views/Sheets/URLSheet.swift | 6+++---
ATalerWallet1/Views/Sheets/WithdrawExchangeScan.swift | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DTalerWallet1/Views/Sheets/WithdrawExchangeV.swift | 80-------------------------------------------------------------------------------
5 files changed, 87 insertions(+), 87 deletions(-)

diff --git a/TalerWallet1/Controllers/DebugViewC.swift b/TalerWallet1/Controllers/DebugViewC.swift @@ -84,7 +84,7 @@ public let SHEET_WITHDRAW_TOS = SHEET_WITHDRAWAL + 1 // 131 Withd public let SHEET_WITHDRAW_ACCEPT = SHEET_WITHDRAW_TOS + 1 // 132 WithdrawAcceptView public let SHEET_WITHDRAW_AUTHORIZE = SHEET_WITHDRAW_ACCEPT + 1 // 133 waiting for bank confirmation -public let SHEET_WITHDRAW_EXCHANGE = SHEET_WITHDRAWAL + 5 // 135 WithdrawExchangeV +public let SHEET_WITHDRAW_EXCHANGE = SHEET_WITHDRAWAL + 5 // 135 WithdrawExchangeScan // MARK: Merchant Payment diff --git a/TalerWallet1/Views/Actions/Banking/ManualWithdraw.swift b/TalerWallet1/Views/Actions/Banking/ManualWithdraw.swift @@ -10,7 +10,7 @@ import taler_swift import SymLog // Called when tapping [􁾭Withdraw] -// or from WithdrawExchangeV after a withdraw-exchange QR was scanned +// or from WithdrawExchangeScan after a withdraw-exchange QR was scanned struct ManualWithdraw: View { private let symLog = SymLogV(0) let stack: CallStack @@ -21,7 +21,7 @@ struct ManualWithdraw: View { @Binding var amountToTransfer: Amount // Update currency when used let exchange: Exchange? // only for withdraw-exchange let maySwitchCurrencies: Bool // not for withdraw-exchange - let isSheet: Bool + let isSheet: Bool // true: WithdrawExchangeScan @EnvironmentObject private var controller: Controller @EnvironmentObject private var model: WalletModel @@ -104,7 +104,7 @@ struct ManualWithdraw: View { .background(FullBackground()) .onAppear { if isSheet { - DebugViewC.shared.setSheetID(SHEET_WITHDRAW_ACCEPT, // 132 WithdrawAcceptView + DebugViewC.shared.setSheetID(SHEET_WITHDRAW_EXCHANGE, // 135 WithdrawExchangeScan stack: stack.push()) } else { DebugViewC.shared.setViewID(VIEW_WITHDRAWAL, // 30 WithdrawAmount diff --git a/TalerWallet1/Views/Sheets/URLSheet.swift b/TalerWallet1/Views/Sheets/URLSheet.swift @@ -66,9 +66,9 @@ struct URLSheet: View { case .withdraw: WithdrawURIView(stack: stack.push(), url: passedURL) case .withdrawExchange: - WithdrawExchangeV(stack: stack.push(), - selectedBalance: selectedBalance, - url: passedURL) + WithdrawExchangeScan(stack: stack.push(), + selectedBalance: selectedBalance, + url: passedURL) case .pay: PaymentView(stack: stack.push(), url: passedURL, template: false, amountToTransfer: $amountToTransfer, summary: $summary, diff --git a/TalerWallet1/Views/Sheets/WithdrawExchangeScan.swift b/TalerWallet1/Views/Sheets/WithdrawExchangeScan.swift @@ -0,0 +1,80 @@ +/* + * This file is part of GNU Taler, ©2022-26 Taler Systems S.A. + * See LICENSE.md + */ +/** + * @author Marc Stibane + */ +import SwiftUI +import taler_swift +import SymLog + +// Called either when scanning a QR code or tapping the provided link, both from the bank's website. +// We show the user the manual withdrawal details in a sheet - but first the ToS must be accepted. +struct WithdrawExchangeScan: View { + private let symLog = SymLogV(0) + let stack: CallStack + let selectedBalance: Balance? + var url: URL + + @EnvironmentObject private var controller: Controller + @EnvironmentObject private var model: WalletModel + @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) + @State private var exchange: Exchange? = nil + @State private var currencyInfo: CurrencyInfo = CurrencyInfo.zero(UNKNOWN) + @State private var amountLastUsed = Amount.zero(currency: EMPTYSTRING) + + @MainActor + private func viewDidLoad() async { + if exchange == nil { + symLog.log(".task") + if let withdrawExchange = try? await model.prepareWithdrawExchange(url.trimmedString) { + let baseUrl = withdrawExchange.exchangeBaseUrl + controller.updateBase(baseUrl, forSaved: url) + symLog.log("getExchangeByUrl(\(baseUrl))") + if let exc = try? await model.getExchangeByUrl(url: baseUrl) { + // let the controller collect CurrencyInfo from this formerly unknown exchange + let _ = try? await controller.getInfo(from: baseUrl, model: model) + if let amount = withdrawExchange.amount { + amountToTransfer = amount + } else { + let currency = exc.scopeInfo.currency + amountToTransfer.setCurrency(currency) + // is already Amount.zero() + } + amountLastUsed.setCurrency(amountToTransfer.currencyStr) + exchange = exc + } else { + exchange = nil + } + } + } + } + + var body: some View { +#if PRINT_CHANGES + let _ = Self._printChanges() + let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear +#endif + if let exchange { + let scopeInfo = exchange.scopeInfo + Group { + ManualWithdraw(stack: stack.push(), + url: url, + selectedBalance: selectedBalance, + amountLastUsed: $amountLastUsed, + amountToTransfer: $amountToTransfer, + exchange: exchange, // only for withdraw-exchange + maySwitchCurrencies: false, + isSheet: true) + } + .task(id: controller.currencyTicker) { + currencyInfo = controller.info(for: scopeInfo, controller.currencyTicker) + } + } else { + let message = String(localized: "Contacting payment service...", comment: "loading") + LoadingView(stack: stack.push(), scopeInfo: nil, message: message) + .task { await viewDidLoad() } + } + } +} diff --git a/TalerWallet1/Views/Sheets/WithdrawExchangeV.swift b/TalerWallet1/Views/Sheets/WithdrawExchangeV.swift @@ -1,80 +0,0 @@ -/* - * This file is part of GNU Taler, ©2022-26 Taler Systems S.A. - * See LICENSE.md - */ -/** - * @author Marc Stibane - */ -import SwiftUI -import taler_swift -import SymLog - -// Called either when scanning a QR code or tapping the provided link, both from the bank's website. -// We show the user the manual withdrawal details in a sheet - but first the ToS must be accepted. -struct WithdrawExchangeV: View { - private let symLog = SymLogV(0) - let stack: CallStack - let selectedBalance: Balance? - var url: URL - - @EnvironmentObject private var controller: Controller - @EnvironmentObject private var model: WalletModel - @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) - @State private var exchange: Exchange? = nil - @State private var currencyInfo: CurrencyInfo = CurrencyInfo.zero(UNKNOWN) - @State private var amountLastUsed = Amount.zero(currency: EMPTYSTRING) - - @MainActor - private func viewDidLoad() async { - if exchange == nil { - symLog.log(".task") - if let withdrawExchange = try? await model.prepareWithdrawExchange(url.trimmedString) { - let baseUrl = withdrawExchange.exchangeBaseUrl - controller.updateBase(baseUrl, forSaved: url) - symLog.log("getExchangeByUrl(\(baseUrl))") - if let exc = try? await model.getExchangeByUrl(url: baseUrl) { - // let the controller collect CurrencyInfo from this formerly unknown exchange - let _ = try? await controller.getInfo(from: baseUrl, model: model) - if let amount = withdrawExchange.amount { - amountToTransfer = amount - } else { - let currency = exc.scopeInfo.currency - amountToTransfer.setCurrency(currency) - // is already Amount.zero() - } - amountLastUsed.setCurrency(amountToTransfer.currencyStr) - exchange = exc - } else { - exchange = nil - } - } - } - } - - var body: some View { -#if PRINT_CHANGES - let _ = Self._printChanges() - let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear -#endif - if let exchange { - let scopeInfo = exchange.scopeInfo - Group { - ManualWithdraw(stack: stack.push(), - url: url, - selectedBalance: selectedBalance, - amountLastUsed: $amountLastUsed, - amountToTransfer: $amountToTransfer, - exchange: exchange, // only for withdraw-exchange - maySwitchCurrencies: false, - isSheet: true) - } - .task(id: controller.currencyTicker) { - currencyInfo = controller.info(for: scopeInfo, controller.currencyTicker) - } - } else { - let message = String(localized: "Contacting payment service...", comment: "loading") - LoadingView(stack: stack.push(), scopeInfo: nil, message: message) - .task { await viewDidLoad() } - } - } -}