taler-ios

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

commit 1b48e4cddfffd2437b705e53945e1a5d1ed357ee
parent 5df99f26ad3c28228e410ea29c5df1f050193ac1
Author: Marc Stibane <marc@taler.net>
Date:   Sun, 16 Feb 2025 15:36:35 +0100

ZStack for Errors

Diffstat:
MTalerWallet1/Model/WalletModel.swift | 3---
MTalerWallet1/Views/Main/MainView.swift | 160+++++++++++++++++++++++++++++++++++++++++--------------------------------------
MTalerWallet1/Views/Sheets/Sheet.swift | 50++++++++++++++++++++++++--------------------------
3 files changed, 108 insertions(+), 105 deletions(-)

diff --git a/TalerWallet1/Model/WalletModel.swift b/TalerWallet1/Model/WalletModel.swift @@ -31,16 +31,13 @@ class WalletModel: ObservableObject { let logger = Logger(subsystem: "net.taler.gnu", category: "WalletModel") let semaphore = AsyncSemaphore(value: 1) - @Published var showError: Bool = false @Published var error2: ErrorData? = nil @MainActor func setError(_ theError: Error?) { if let theError { self.error2 = .error(theError) - self.showError = true } else { self.error2 = nil - self.showError = false } } diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift @@ -58,33 +58,94 @@ struct MainView: View { let _ = Self._printChanges() let _ = symLog.vlog() // just to get the # to compare it with .onAppear & onDisappear #endif - Group { - if controller.backendState == .ready { - MainContent(logger: logger, stack: stack.push("Content"), - selectedBalance: $selectedBalance, - talerFontIndex: $talerFontIndex, - showActionSheet: $showActionSheet, - showScanner: $showScanner, - userAction: $userAction) - .onAppear() { + let mainContent = ZStack { + MainContent(logger: logger, stack: stack.push("Content"), + selectedBalance: $selectedBalance, + talerFontIndex: $talerFontIndex, + showActionSheet: $showActionSheet, + showScanner: $showScanner, + userAction: $userAction) + .onAppear() { #if DEBUG - if playSoundsI != 0 && playSoundsB && !soundPlayed { - controller.playSound(1008) // Startup chime - } + if playSoundsI != 0 && playSoundsB && !soundPlayed { + controller.playSound(1008) + } #endif - soundPlayed = true + soundPlayed = true + } // Startup chime + .overlay(alignment: .top) { + DebugViewV() + .id("ViewID") + } // Show the viewID on top of the app's NavigationView + + if (!showScanner && urlToOpen == nil) { + if let error2 = model.error2 { + ErrorSheet(data: error2, devMode: developerMode) { + model.setError(nil) + }.interactiveDismissDisabled() +// .transition(.move(edge: .top)) +// } else { +// Color.clear } - } else if controller.backendState == .error { - ErrorView(errortext: nil) // TODO: show Error View - } else { - LaunchAnimationView() } - } - .animation(.linear(duration: LAUNCHDURATION), value: controller.backendState) - .overlay(alignment: .top) { - // Show the viewID on top of the app's NavigationView - DebugViewV() - .id("ViewID") + }//.transition(.move(edge: .top)) + + let mainGroup = Group { + switch controller.backendState { + case .ready: mainContent + case .error: ErrorView(errortext: nil) // TODO: show Error View + default: // show launch animation until either ready or error + LaunchAnimationView() + } + }.animation(.linear(duration: LAUNCHDURATION), value: controller.backendState) + + Group { + mainGroup +// .animation(.default, value: model.error2 == nil) + .sheet(isPresented: $showUrlSheet, onDismiss: sheetDismissed) { + let sheet = URLSheet(stack: stack.push(), + selectedBalance: $selectedBalance, + urlToOpen: $urlToOpen) + Sheet(stack: stack.push(), sheetView: AnyView(sheet)) + } + .sheet(isPresented: $showScanner, + onDismiss: { showActionSheet = false; qrButtonTapped = false; userAction += 1 } + ) { + let qrSheet = AnyView(QRSheet(stack: stack.push(".sheet"), + selectedBalance: $selectedBalance)) + let _ = logger.trace("❗️showScanner: \(SCANDETENT)❗️") + if #available(iOS 16.4, *) { + let scanDetent: PresentationDetent = .fraction(SCANDETENT) + Sheet(stack: stack.push(), sheetView: qrSheet) + .presentationDetents([scanDetent]) + .transition(.opacity) + } else { + Sheet(stack: stack.push(), sheetView: qrSheet) + .transition(.opacity) + } + } + .sheet(isPresented: $showActionSheet, + onDismiss: { showScanner = false; qrButtonTapped = false; userAction += 1 } + ) { + if #available(iOS 16.4, *) { + let _ = logger.trace("❗️actionsSheet: small❗️ (showScanner == false)") + DualHeightSheet(stack: stack.push(), + qrButtonTapped: $qrButtonTapped) + } else { + Group { + Spacer() + ScrollView { + ActionsSheet(stack: stack.push(), + qrButtonTapped: $qrButtonTapped) + .innerHeight($innerHeight) +// .padding() + } + .frame(maxHeight: innerHeight) + .edgesIgnoringSafeArea(.all) + } + .background(WalletColors().gray2) + } // iOS 15 + } } .onOpenURL { url in symLog.log(".onOpenURL: \(url)") @@ -96,65 +157,12 @@ struct MainView: View { showUrlSheet = true // raise sheet } } - .sheet(isPresented: $showUrlSheet, onDismiss: sheetDismissed) { - let sheet = URLSheet(stack: stack.push(), - selectedBalance: $selectedBalance, - urlToOpen: $urlToOpen) - Sheet(stack: stack.push(), sheetView: AnyView(sheet)) - } - .sheet(isPresented: $model.showError) { // TODO: switch to alert/overlay - model.setError(nil) - } content: { - if let error2 = model.error2 { - ErrorSheet(data: error2, devMode: developerMode) { - model.setError(nil) - }.interactiveDismissDisabled() - } - } .onChange(of: qrButtonTapped) { tapped in if tapped { let delay = if #available(iOS 16.4, *) { 0.5 } else { 0.01 } withAnimation(Animation.easeOut(duration: 0.5).delay(delay)) { showScanner = true // switch to qrSheet => camera on } } } - .sheet(isPresented: $showScanner, - onDismiss: { showActionSheet = false; qrButtonTapped = false; userAction += 1 } - ) { - let qrSheet = AnyView(QRSheet(stack: stack.push(".sheet"), - selectedBalance: $selectedBalance)) - let _ = logger.trace("❗️showScanner: \(SCANDETENT)❗️") - if #available(iOS 16.4, *) { - let scanDetent: PresentationDetent = .fraction(SCANDETENT) - Sheet(stack: stack.push(), sheetView: qrSheet) - .presentationDetents([scanDetent]) - .transition(.opacity) - } else { - Sheet(stack: stack.push(), sheetView: qrSheet) - .transition(.opacity) - } - } - .sheet(isPresented: $showActionSheet, - onDismiss: { showScanner = false; qrButtonTapped = false; userAction += 1 } - ) { - if #available(iOS 16.4, *) { - let _ = logger.trace("❗️actionsSheet: small❗️ (showScanner == false)") - DualHeightSheet(stack: stack.push(), - qrButtonTapped: $qrButtonTapped) - } else { - Group { - Spacer() - ScrollView { - ActionsSheet(stack: stack.push(), - qrButtonTapped: $qrButtonTapped) - .innerHeight($innerHeight) -// .padding() - } - .frame(maxHeight: innerHeight) - .edgesIgnoringSafeArea(.all) - } - .background(WalletColors().gray2) - } - } } // body } // MARK: - TabBar diff --git a/TalerWallet1/Views/Sheets/Sheet.swift b/TalerWallet1/Views/Sheets/Sheet.swift @@ -36,34 +36,32 @@ struct Sheet: View { var body: some View { let idString = debugViewC.sheetID > 0 ? String(debugViewC.sheetID) : EMPTYSTRING // show nothing if 0 - NavigationView { - Group { - if let error2 = model.error2 { - ErrorSheet(data: error2, devMode: developerMode) { - model.setError(nil) - logger.log("ErrorSheet dismissTop") - dismissTop(stack.push()) - } - } else { - sheetView -// .navigationBarItems(leading: cancelButton) + ZStack { + NavigationView { + sheetView + .navigationBarTitleDisplayMode(.automatic) + .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all)) + } + .navigationViewStyle(.stack) + .talerNavBar(talerFontIndex: talerFontIndex) + .overlay(alignment: .top) { + // Show the viewID on top of the sheet's NavigationView + Text(idString) + .foregroundColor(.purple) + .font(.system(size: 11)) // no talerFont + .monospacedDigit() + .edgesIgnoringSafeArea(.top) + .id("sheetID") + .accessibilityLabel(Text("Sheet.ID.", comment: "VoiceOver")) + .accessibilityValue(idString) + } + if let error2 = model.error2 { + ErrorSheet(data: error2, devMode: developerMode) { + model.setError(nil) + logger.log("ErrorSheet dismissTop") + dismissTop(stack.push()) } } - .navigationBarTitleDisplayMode(.automatic) - .background(WalletColors().backgroundColor.edgesIgnoringSafeArea(.all)) - } - .navigationViewStyle(.stack) - .talerNavBar(talerFontIndex: talerFontIndex) - .overlay(alignment: .top) { - // Show the viewID on top of the sheet's NavigationView - Text(idString) - .foregroundColor(.purple) - .font(.system(size: 11)) // no talerFont - .monospacedDigit() - .edgesIgnoringSafeArea(.top) - .id("sheetID") - .accessibilityLabel(Text("Sheet.ID.", comment: "VoiceOver")) - .accessibilityValue(idString) } .onDisappear { symLog.log("❗️❗️Sheet onDisappear")