taler-ios

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

Sheet.swift (3539B)


      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     @EnvironmentObject private var controller: Controller
     51     @AppStorage("talerFontIndex") var talerFontIndex: Int = 0
     52 #if DEBUG
     53     @AppStorage("developerMode") var developerMode: Bool = true
     54 #else
     55     @AppStorage("developerMode") var developerMode: Bool = false
     56 #endif
     57 
     58     let logger = Logger(subsystem: "net.taler.gnu", category: "Sheet")
     59 
     60     var cancelButton: some View {
     61         Button("Cancel") {
     62             logger.log("Cancel")
     63             dismissTop(stack.push())
     64         }
     65     }
     66 
     67     var body: some View {
     68         let idString = debugViewC.sheetID > 0 ? String(debugViewC.sheetID)
     69                                               : EMPTYSTRING      // show nothing if 0
     70         VStack {
     71             if controller.networkUnavailable {
     72                 ErrorBanner(.networkUnavailable)    // red bar on top
     73             } else if controller.slowConnection {
     74                 ErrorBanner(.warning5sec)           // yellow bar on top
     75             }
     76             ZStack {
     77                 NavigationView {
     78                     sheetView
     79                 }
     80                 .navigationBarTitleDisplayMode(.automatic)
     81                 .background(FullBackground())
     82                 .navigationViewStyle(.stack)
     83                 .talerNavBar(talerFontIndex: talerFontIndex)
     84                 .overlay(alignment: .top) {
     85                     // Show the viewID on top of the sheet's NavigationView
     86                     Text(idString)
     87                         .foregroundColor(.purple)
     88                         .font(.system(size: 11))        // no talerFont
     89                         .monospacedDigit()
     90                         .ignoresSafeArea(edges: .top)
     91                         .id("sheetID")
     92                         .accessibilityLabel(Text("Sheet.ID.", comment: "a11y"))
     93                         .accessibilityValue(idString)
     94                 }
     95                 if let error2 = model.error2 {
     96                     ErrorView(stack.push(), data: error2, devMode: developerMode) {
     97                         model.setError(nil)
     98                         logger.log("ErrorSheet dismissTop")
     99                         dismissTop(stack.push())
    100                     }
    101                     .background(FullBackground())
    102                 }
    103             }
    104         }
    105         .onDisappear {
    106             symLog.log("❗️❗️Sheet onDisappear")
    107         }
    108     }
    109 }