@@ -12,24 +12,25 @@ final class SettingsWindowManager: ObservableObject {
1212 private var settingsWindow : NSWindow ?
1313 private var closeObserver : NSObjectProtocol ?
1414
15- func open( appState: AppState , page: SettingsPage ? = nil ) {
15+ /// Sidebar page to apply when Settings appears. Survives first-open timing.
16+ @Published private( set) var requestedPage : SettingsPage ?
17+ /// Pair-phone sheet to present when Gateway settings appears.
18+ @Published private( set) var pendingPairingPresentation = false
19+
20+ func open( appState: AppState , page: SettingsPage ? = nil , showPairing: Bool = false ) {
21+ recordOpenRequest ( page: page, showPairing: showPairing)
22+
1623 // If window already exists, just bring it to front
1724 if let window = settingsWindow, window. isVisible {
1825 window. makeKeyAndOrderFront ( nil )
1926 NSApp . activate ( ignoringOtherApps: true )
20- if let page {
21- NotificationCenter . default. post (
22- name: . selectSettingsPage,
23- object: nil ,
24- userInfo: [ " page " : page. rawValue]
25- )
26- }
2727 return
2828 }
2929
3030 // Create the settings view
31- let settingsView = SettingsView ( )
31+ let settingsView = SettingsView ( initialPage : requestedPage ?? . dictation )
3232 . environmentObject ( appState)
33+ . environmentObject ( self )
3334
3435 // Create a new window
3536 let window = NSWindow (
@@ -50,14 +51,6 @@ final class SettingsWindowManager: ObservableObject {
5051 DockVisibilityCoordinator . shared. windowDidOpen ( )
5152 NSApp . activate ( ignoringOtherApps: true )
5253
53- if let page {
54- NotificationCenter . default. post (
55- name: . selectSettingsPage,
56- object: nil ,
57- userInfo: [ " page " : page. rawValue]
58- )
59- }
60-
6154 // Held so it can be removed on close — a block-based observer lives
6255 // until its token is released, so opening repeatedly would otherwise
6356 // stack up observers.
@@ -77,6 +70,33 @@ final class SettingsWindowManager: ObservableObject {
7770 }
7871 }
7972 }
73+
74+ /// Stores a sidebar page and/or pair-phone request until Settings consumes it.
75+ func recordOpenRequest( page: SettingsPage ? = nil , showPairing: Bool = false ) {
76+ if let page {
77+ requestedPage = page
78+ }
79+ if showPairing {
80+ pendingPairingPresentation = true
81+ if requestedPage == nil {
82+ requestedPage = . gateway
83+ }
84+ }
85+ }
86+
87+ /// Returns and clears the requested sidebar page, if any.
88+ func consumeRequestedPage( ) -> SettingsPage ? {
89+ guard let page = requestedPage else { return nil }
90+ requestedPage = nil
91+ return page
92+ }
93+
94+ /// Returns whether a pair-phone sheet was requested, then clears the flag.
95+ func consumePendingPairingPresentation( ) -> Bool {
96+ guard pendingPairingPresentation else { return false }
97+ pendingPairingPresentation = false
98+ return true
99+ }
80100}
81101
82102/// Manages the standalone update details window.
0 commit comments