URLSheet.swift (4195B)
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 let sheetURL: URL? 18 19 @EnvironmentObject private var controller: Controller 20 @EnvironmentObject private var model: WalletModel 21 @AppStorage("shouldShowWarning") var shouldShowWarning: Bool = true 22 @AppStorage("oimEuro") var oimEuro: Bool = false 23 24 @State private var amountToTransfer = Amount.zero(currency: EMPTYSTRING) 25 @State private var summary = EMPTYSTRING 26 @State private var urlCommand: UrlCommand? 27 @State private var passedURL: URL? 28 29 init(_ stack: CallStack, selectedBalance: Balance? = nil, 30 urlToOpen: Binding<URL?>? = nil, 31 sheetURL: URL? = nil) { 32 self.stack = stack 33 self.selectedBalance = selectedBalance 34 self._urlToOpen = urlToOpen ?? Binding.constant(nil) 35 self.sheetURL = sheetURL 36 } 37 38 // don't need @MainActor here 39 private func passUrlOnce() { 40 if urlToOpen != nil { 41 passedURL = urlToOpen 42 symLog.log("❗️ passed urlToOpen: \(String(describing: urlToOpen?.absoluteString))") 43 urlCommand = controller.urlCommand(urlToOpen!, stack: stack.push()) 44 urlToOpen = nil // make sure we don't get this a second time 45 } else if let sheetURL { 46 passedURL = sheetURL 47 urlCommand = controller.urlCommand(sheetURL, stack: stack.push()) 48 } 49 } 50 51 var body: some View { 52 #if PRINT_CHANGES 53 let _ = Self._printChanges() 54 let _ = symLog.vlog(urlToOpen?.absoluteString) // just to get the # to compare it with .onAppear & onDisappear 55 #endif 56 if let urlCommand, let passedURL { 57 switch urlCommand { 58 case .addExchange, // TODO: just check the ToS 59 .withdraw: 60 WithdrawURIView(stack: stack.push(), url: passedURL) 61 case .withdrawExchange: 62 WithdrawExchangeV(stack: stack.push(), 63 selectedBalance: selectedBalance, 64 url: passedURL) 65 case .pay: 66 PaymentView(stack: stack.push(), url: passedURL, 67 template: false, amountToTransfer: $amountToTransfer, summary: $summary, 68 amountIsEditable: false, summaryIsEditable: false) 69 case .payPull: 70 P2pPayURIView(stack: stack.push(), url: passedURL) 71 case .payPush: 72 P2pReceiveURIView(stack: stack.push(), url: passedURL, oimEuro: oimEuro) 73 case .payTemplate: 74 PayTemplateV(stack: stack.push(), url: passedURL) 75 case .refund: 76 RefundURIView(stack: stack.push(), url: passedURL) 77 #if GNU_TALER 78 case .devExperiment: 79 DevExperimentView(stack: stack.push(), url: passedURL) 80 #endif 81 default: // TODO: Error view 82 let unknown = String(localized: "Unknown command: \(passedURL.absoluteString)") 83 VStack { 84 let _ = symLog.log("Unknown command❗️ \(passedURL.absoluteString)") 85 Text(controller.messageForSheet ?? unknown) 86 .talerFont(.title) 87 } 88 .navigationTitle(unknown) 89 } 90 } else { 91 let message = String(localized: "Scanning...", comment: "loading") 92 LoadingView(stack: stack.push(), scopeInfo: nil, message: message) 93 .task(id: urlToOpen) { 94 passUrlOnce() 95 } 96 } 97 } 98 } 99 // MARK: - 100 //struct PaySheet_Previews: PreviewProvider { 101 // static var previews: some View { 102 // needs BackendManager 103 // URLSheet(urlToOpen: URL(string: "ftp://this.URL.is.invalid")!) 104 // } 105 //}