From ab7811aebd5f4314de755e4bf508d6670a645500 Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Sat, 17 Jan 2026 21:54:08 -0500 Subject: [PATCH] fix: preview tear down fix --- .../Views/Components/PreviewWindowHelper.swift | 18 ++++++++++++------ Gaze/Views/Setup/BlinkSetupView.swift | 13 ++++--------- Gaze/Views/Setup/LookAwaySetupView.swift | 11 ++++------- Gaze/Views/Setup/PostureSetupView.swift | 13 ++++--------- 4 files changed, 24 insertions(+), 31 deletions(-) diff --git a/Gaze/Views/Components/PreviewWindowHelper.swift b/Gaze/Views/Components/PreviewWindowHelper.swift index 1ddbb51..d00f822 100644 --- a/Gaze/Views/Components/PreviewWindowHelper.swift +++ b/Gaze/Views/Components/PreviewWindowHelper.swift @@ -11,8 +11,15 @@ import SwiftUI enum PreviewWindowHelper { static func showPreview( on screen: NSScreen, - content: Content - ) -> NSWindowController { + content: @escaping (@escaping () -> Void) -> Content + ) { + var controller: NSWindowController? + + let dismiss: () -> Void = { + controller?.window?.close() + controller = nil + } + let panel = NSPanel( contentRect: screen.frame, styleMask: [.borderless, .nonactivatingPanel], @@ -25,11 +32,10 @@ enum PreviewWindowHelper { panel.hasShadow = false panel.ignoresMouseEvents = false panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] - panel.contentView = NSHostingView(rootView: content) + panel.contentView = NSHostingView(rootView: content(dismiss)) panel.setFrame(screen.frame, display: true) - let controller = NSWindowController(window: panel) - controller.showWindow(nil) - return controller + controller = NSWindowController(window: panel) + controller?.showWindow(nil) } } diff --git a/Gaze/Views/Setup/BlinkSetupView.swift b/Gaze/Views/Setup/BlinkSetupView.swift index 75109cc..b566fb9 100644 --- a/Gaze/Views/Setup/BlinkSetupView.swift +++ b/Gaze/Views/Setup/BlinkSetupView.swift @@ -10,7 +10,6 @@ import SwiftUI struct BlinkSetupView: View { @Bindable var settingsManager: SettingsManager - @State private var previewWindowController: NSWindowController? var body: some View { VStack(spacing: 0) { @@ -123,14 +122,10 @@ struct BlinkSetupView: View { private func showPreviewWindow() { guard let screen = NSScreen.main else { return } - previewWindowController = PreviewWindowHelper.showPreview( - on: screen, - content: BlinkReminderView( - sizePercentage: settingsManager.settings.subtleReminderSize.percentage - ) { [weak previewWindowController] in - previewWindowController?.window?.close() - } - ) + let sizePercentage = settingsManager.settings.subtleReminderSize.percentage + PreviewWindowHelper.showPreview(on: screen) { dismiss in + BlinkReminderView(sizePercentage: sizePercentage, onDismiss: dismiss) + } } } diff --git a/Gaze/Views/Setup/LookAwaySetupView.swift b/Gaze/Views/Setup/LookAwaySetupView.swift index 1645ef3..efd29d0 100644 --- a/Gaze/Views/Setup/LookAwaySetupView.swift +++ b/Gaze/Views/Setup/LookAwaySetupView.swift @@ -10,7 +10,6 @@ import SwiftUI struct LookAwaySetupView: View { @Bindable var settingsManager: SettingsManager - @State private var previewWindowController: NSWindowController? var cameraAccess = CameraAccessService.shared @State private var failedCameraAccess = false @@ -78,12 +77,10 @@ struct LookAwaySetupView: View { private func showPreviewWindow() { guard let screen = NSScreen.main else { return } - previewWindowController = PreviewWindowHelper.showPreview( - on: screen, - content: LookAwayReminderView(countdownSeconds: settingsManager.settings.lookAwayCountdownSeconds) { [weak previewWindowController] in - previewWindowController?.window?.close() - } - ) + let countdownSeconds = settingsManager.settings.lookAwayCountdownSeconds + PreviewWindowHelper.showPreview(on: screen) { dismiss in + LookAwayReminderView(countdownSeconds: countdownSeconds, onDismiss: dismiss) + } } } diff --git a/Gaze/Views/Setup/PostureSetupView.swift b/Gaze/Views/Setup/PostureSetupView.swift index 659be71..7ae0622 100644 --- a/Gaze/Views/Setup/PostureSetupView.swift +++ b/Gaze/Views/Setup/PostureSetupView.swift @@ -10,7 +10,6 @@ import SwiftUI struct PostureSetupView: View { @Bindable var settingsManager: SettingsManager - @State private var previewWindowController: NSWindowController? var body: some View { VStack(spacing: 0) { @@ -72,14 +71,10 @@ struct PostureSetupView: View { private func showPreviewWindow() { guard let screen = NSScreen.main else { return } - previewWindowController = PreviewWindowHelper.showPreview( - on: screen, - content: PostureReminderView( - sizePercentage: settingsManager.settings.subtleReminderSize.percentage - ) { [weak previewWindowController] in - previewWindowController?.window?.close() - } - ) + let sizePercentage = settingsManager.settings.subtleReminderSize.percentage + PreviewWindowHelper.showPreview(on: screen) { dismiss in + PostureReminderView(sizePercentage: sizePercentage, onDismiss: dismiss) + } } }