commit 1b48e4cddfffd2437b705e53945e1a5d1ed357ee
parent 5df99f26ad3c28228e410ea29c5df1f050193ac1
Author: Marc Stibane <marc@taler.net>
Date: Sun, 16 Feb 2025 15:36:35 +0100
ZStack for Errors
Diffstat:
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")