URLSheet.swift (3671B)
1 /* 2 * This file is part of GNU Taler, ©2022-25 Taler Systems S.A. 3 * See LICENSE.md 4 */ 5 /** 6 * @author Marc Stibane 7 */ 8 import SwiftUI 9 import taler_swift 10 import SymLog 11 12 struct URLSheet: View { 13 private let symLog = SymLogV(0) 14 let stack: CallStack 15 let selectedBalance: Balance? 16 @Binding var urlToOpen: URL? 17 18 @EnvironmentObject private var controller: Controller 19 @EnvironmentObject private var model: WalletModel 20 @AppStorage("shouldShowWarning") var shouldShowWarning: Bool = true 21 @AppStorage("oimEuro") var oimEuro: Bool = false 22 23 @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) 24 @State private var summary = EMPTYSTRING 25 @State private var urlCommand: UrlCommand? 26 @State private var passedURL: URL? 27 28 // don't need @MainActor here 29 private func passUrlOnce() { 30 if urlToOpen != nil { 31 passedURL = urlToOpen 32 symLog.log("❗️ passed urlToOpen: \(urlToOpen?.absoluteString)") 33 urlCommand = controller.openURL(urlToOpen!, stack: stack.push()) 34 urlToOpen = nil 35 symLog.log("❗️ erase urlToOpen: \(urlToOpen?.absoluteString)") 36 } 37 } 38 39 var body: some View { 40 #if PRINT_CHANGES 41 let _ = Self._printChanges() 42 let _ = symLog.vlog(urlToOpen?.absoluteString) // just to get the # to compare it with .onAppear & onDisappear 43 #endif 44 if let urlCommand, let passedURL { 45 switch urlCommand { 46 case .addExchange, // TODO: just check the ToS 47 .withdraw: 48 WithdrawURIView(stack: stack.push(), url: passedURL) 49 case .withdrawExchange: 50 WithdrawExchangeV(stack: stack.push(), 51 selectedBalance: selectedBalance, 52 url: passedURL) 53 case .pay: 54 PaymentView(stack: stack.push(), url: passedURL, 55 template: false, amountToTransfer: $amountToTransfer, summary: $summary, 56 amountIsEditable: false, summaryIsEditable: false) 57 case .payPull: 58 P2pPayURIView(stack: stack.push(), url: passedURL) 59 case .payPush: 60 P2pReceiveURIView(stack: stack.push(), url: passedURL, oimEuro: oimEuro) 61 case .payTemplate: 62 PayTemplateV(stack: stack.push(), url: passedURL) 63 case .refund: 64 RefundURIView(stack: stack.push(), url: passedURL) 65 #if GNU_TALER 66 case .devExperiment: 67 DevExperimentView(stack: stack.push(), url: passedURL) 68 #endif 69 default: // TODO: Error view 70 let unknown = String(localized: "Unknown command: \(passedURL.absoluteString)") 71 VStack { 72 let _ = symLog.log("Unknown command❗️ \(passedURL.absoluteString)") 73 Text(controller.messageForSheet ?? unknown) 74 .talerFont(.title) 75 } 76 .navigationTitle(unknown) 77 } 78 } else { 79 let message = String(localized: "Scanning...", comment: "loading") 80 LoadingView(stack: stack.push(), scopeInfo: nil, message: message) 81 .task(id: urlToOpen) { 82 passUrlOnce() 83 } 84 } 85 } 86 } 87 // MARK: - 88 //struct PaySheet_Previews: PreviewProvider { 89 // static var previews: some View { 90 // needs BackendManager 91 // URLSheet(urlToOpen: URL(string: "ftp://this.URL.is.invalid")!) 92 // } 93 //}