taler-ios

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

Sheet.swift (3104B)


      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 SymLog
     10 import os.log
     11 
     12 enum SheetType: Equatable, Identifiable, Hashable {
     13     case action
     14     case scanner
     15     case url(URL)
     16 
     17     var id: String {
     18         switch self {
     19             case .action:
     20                 return "action"
     21             case .scanner:
     22                 return "scanner"
     23             case .url(let url):
     24                 return url.absoluteString
     25         }
     26     }
     27 
     28     static func == (lhs: SheetType, rhs: SheetType) -> Bool {
     29         switch (lhs, rhs) {
     30             case (.action, .action):
     31                 return true
     32             case (.scanner, .scanner):
     33                 return true
     34             case (.url(let lhsUrl), .url(let rhsUrl)):
     35                 return lhsUrl == rhsUrl
     36             default:
     37                 return false
     38         }
     39     }
     40 }
     41 
     42 struct Sheet: View {
     43     private let symLog = SymLogV(0)
     44     let stack: CallStack
     45     var sheetView: AnyView
     46 
     47     @Environment(\.dismiss) var dismiss     // call dismiss() to get rid of the sheet
     48     @EnvironmentObject private var debugViewC: DebugViewC
     49     @EnvironmentObject private var model: WalletModel
     50     @AppStorage("talerFontIndex") var talerFontIndex: Int = 0
     51 #if DEBUG
     52     @AppStorage("developerMode") var developerMode: Bool = true
     53 #else
     54     @AppStorage("developerMode") var developerMode: Bool = false
     55 #endif
     56 
     57     let logger = Logger(subsystem: "net.taler.gnu", category: "Sheet")
     58 
     59     var cancelButton: some View {
     60         Button("Cancel") {
     61             logger.log("Cancel")
     62             dismissTop(stack.push())
     63         }
     64     }
     65 
     66     var body: some View {
     67         let idString = debugViewC.sheetID > 0 ? String(debugViewC.sheetID)
     68                                               : EMPTYSTRING      // show nothing if 0
     69         ZStack {
     70             NavigationView {
     71                 sheetView
     72                     .navigationBarTitleDisplayMode(.automatic)
     73                     .background(FullBackground())
     74             }
     75             .navigationViewStyle(.stack)
     76             .talerNavBar(talerFontIndex: talerFontIndex)
     77             .overlay(alignment: .top) {
     78                 // Show the viewID on top of the sheet's NavigationView
     79                 Text(idString)
     80                     .foregroundColor(.purple)
     81                     .font(.system(size: 11))        // no talerFont
     82                     .monospacedDigit()
     83                     .ignoresSafeArea(edges: .top)
     84                     .id("sheetID")
     85                     .accessibilityLabel(Text("Sheet.ID.", comment: "a11y"))
     86                     .accessibilityValue(idString)
     87             }
     88             if let error2 = model.error2 {
     89                 ErrorView(stack.push(), data: error2, devMode: developerMode) {
     90                     model.setError(nil)
     91                     logger.log("ErrorSheet dismissTop")
     92                     dismissTop(stack.push())
     93                 }
     94                 .background(FullBackground())
     95             }
     96         }
     97         .onDisappear {
     98             symLog.log("❗️❗️Sheet onDisappear")
     99         }
    100     }
    101 }