commit 9a431e9b0103d968e6019f3521b26ae1896c1fb4
parent 8fe9a668b0402e5ec4895a2933d608abdc3f33e3
Author: Marc Stibane <marc@taler.net>
Date: Fri, 7 Aug 2026 07:57:44 +0200
WithdrawExchangeScan
Diffstat:
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() }
- }
- }
-}