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 }