taler-ios

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

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 //}