taler-ios

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

Sheet.swift (3586B)


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