taler-ios

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

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:
MTalerWallet1/Views/Main/MainView.swift | 19++++++++++++-------
MTalerWallet1/Views/Sheets/QRSheet.swift | 6++++--
MTalerWallet1/Views/Sheets/Sheet.swift | 1+
MTalerWallet1/Views/Sheets/URLSheet.swift | 37+++++++++++++++++++++++--------------
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() } } }