taler-ios

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

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