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 }