commit 5df99f26ad3c28228e410ea29c5df1f050193ac1
parent 4a156974426fc536de1b0aae75e0e27a4dfec6f7
Author: Marc Stibane <marc@taler.net>
Date: Sun, 16 Feb 2025 11:15:17 +0100
sheet evaluated after dismiss, task executed again
Diffstat:
4 files changed, 40 insertions(+), 23 deletions(-)
diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift
@@ -32,7 +32,7 @@ struct MainView: View {
@State private var selectedBalance: Balance? = nil
@State private var urlToOpen: URL? = nil
- @State private var sheetPresented = false
+ @State private var showUrlSheet = false
@State private var showActionSheet = false
@State private var showScanner = false
// @State private var showCameraAlert: Bool = false
@@ -42,6 +42,8 @@ struct MainView: View {
func sheetDismissed() -> Void {
logger.info("sheet dismiss")
+ symLog.log("sheet dismiss: \(urlToOpen)")
+ urlToOpen = nil
ViewState.shared.popToRootView(nil)
}
@@ -89,14 +91,17 @@ struct MainView: View {
// will be called on a taler:// scheme either
// by user tapping such link in a browser (bank website)
// or when launching the app from iOS Camera.app scanning a QR code
- urlToOpen = url // raise sheet
+ urlToOpen = url
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
+ showUrlSheet = true // raise sheet
+ }
}
- .sheet(item: $urlToOpen, onDismiss: sheetDismissed) { url in
- let sheet = AnyView(URLSheet(stack: stack.push(),
+ .sheet(isPresented: $showUrlSheet, onDismiss: sheetDismissed) {
+ let sheet = URLSheet(stack: stack.push(),
selectedBalance: $selectedBalance,
- urlToOpen: url))
- Sheet(stack: stack.push(), sheetView: sheet)
- }
+ urlToOpen: $urlToOpen)
+ Sheet(stack: stack.push(), sheetView: AnyView(sheet))
+ }
.sheet(isPresented: $model.showError) { // TODO: switch to alert/overlay
model.setError(nil)
} content: {
diff --git a/TalerWallet1/Views/Sheets/QRSheet.swift b/TalerWallet1/Views/Sheets/QRSheet.swift
@@ -13,6 +13,7 @@ struct QRSheet: View {
@Binding var selectedBalance: Balance?
@State private var scannedCode: String?
+ @State private var urlToOpen: URL?
func codeToURL(_ code: String) -> URL? {
if let scannedURL = URL(string: code) {
@@ -31,12 +32,12 @@ struct QRSheet: View {
if scannedCode != nil {
// let _ = print(scannedCode as Any) // TODO: logging
- if let scannedURL = codeToURL(scannedCode!) {
+ if let scannedURL = urlToOpen {
let scheme = scannedURL.scheme
if scheme?.lowercased() == "taler" {
URLSheet(stack: stack.push(),
selectedBalance: $selectedBalance,
- urlToOpen: scannedURL)
+ urlToOpen: $urlToOpen)
} else {
// let _ = print(scannedURL) // TODO: error logging
ErrorView(errortext: scannedURL.absoluteString)
@@ -51,6 +52,7 @@ struct QRSheet: View {
case .success(let result):
symLog.log("Found code: \(result.string)")
scannedCode = result.string
+ urlToOpen = codeToURL(result.string)
closingAnnouncement = String(localized: "QR code recognized", comment: "VoiceOver")
case .failure(let error):
// TODO: errorAlert
diff --git a/TalerWallet1/Views/Sheets/Sheet.swift b/TalerWallet1/Views/Sheets/Sheet.swift
@@ -40,6 +40,7 @@ struct Sheet: View {
Group {
if let error2 = model.error2 {
ErrorSheet(data: error2, devMode: developerMode) {
+ model.setError(nil)
logger.log("ErrorSheet dismissTop")
dismissTop(stack.push())
}
diff --git a/TalerWallet1/Views/Sheets/URLSheet.swift b/TalerWallet1/Views/Sheets/URLSheet.swift
@@ -13,53 +13,62 @@ struct URLSheet: View {
private let symLog = SymLogV(0)
let stack: CallStack
@Binding var selectedBalance: Balance?
- var urlToOpen: URL
+ @Binding var urlToOpen: URL?
@AppStorage("shouldShowWarning") var shouldShowWarning: Bool = true
@EnvironmentObject private var controller: Controller
@State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING)
@State private var summary = EMPTYSTRING
@State private var urlCommand: UrlCommand?
+ @State private var passedURL: URL?
+
+ private func passUrlOnce() {
+ if urlToOpen != nil {
+ passedURL = urlToOpen
+ urlCommand = controller.openURL(urlToOpen!, stack: stack.push())
+ urlToOpen = nil
+ symLog.log("❗️ erase urlToOpen: \(urlToOpen?.absoluteString)")
+ }
+ }
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 urlCommand {
+ if let urlCommand, let passedURL {
switch urlCommand {
case .termsExchange, // TODO: just check the ToS
.withdraw:
- WithdrawURIView(stack: stack.push(), url: urlToOpen)
+ WithdrawURIView(stack: stack.push(), url: passedURL)
case .withdrawExchange:
WithdrawExchangeV(stack: stack.push(),
selectedBalance: $selectedBalance,
- url: urlToOpen)
+ url: passedURL)
case .pay:
- PaymentView(stack: stack.push(), url: urlToOpen,
+ PaymentView(stack: stack.push(), url: passedURL,
template: false, amountToTransfer: $amountToTransfer, summary: $summary,
amountIsEditable: false, summaryIsEditable: false)
case .payPull:
- P2pPayURIView(stack: stack.push(), url: urlToOpen)
+ P2pPayURIView(stack: stack.push(), url: passedURL)
case .payPush:
- P2pReceiveURIView(stack: stack.push(), url: urlToOpen)
+ P2pReceiveURIView(stack: stack.push(), url: passedURL)
case .payTemplate:
- PayTemplateV(stack: stack.push(), url: urlToOpen)
+ PayTemplateV(stack: stack.push(), url: passedURL)
case .refund:
- RefundURIView(stack: stack.push(), url: urlToOpen)
+ RefundURIView(stack: stack.push(), url: passedURL)
default: // TODO: Error view
VStack {
- let _ = symLog.log("❗️Unknown command❗️ \(urlToOpen.absoluteString)")
- Text(controller.messageForSheet ?? urlToOpen.absoluteString)
+ let _ = symLog.log("Unknown command❗️ \(passedURL.absoluteString)")
+ Text(controller.messageForSheet ?? passedURL.absoluteString)
}
.navigationTitle("Unknown command")
}
} else {
let message = String(localized: "Scanning...", comment: "loading")
LoadingView(scopeInfo: nil, message: message)
- .task {
- let command = controller.openURL(urlToOpen, stack: stack.push())
- urlCommand = command
+ .task(id: urlToOpen) {
+ passUrlOnce()
}
}
}