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 }