From e6f269b9f2fcb7ca6d8a6e08451b02a42e6f00e5 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 27 Mar 2026 13:52:09 +0200 Subject: [PATCH] Hook up the settings screen --- .../Sources/Application/Application.swift | 8 ++++++ .../UserSessionFlowCoordinator.swift | 27 +++++++++++++------ .../SettingsScreen/View/SettingsScreen.swift | 1 + 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/ElementX/Sources/Application/Application.swift b/ElementX/Sources/Application/Application.swift index f142a8842..43e92db9a 100644 --- a/ElementX/Sources/Application/Application.swift +++ b/ElementX/Sources/Application/Application.swift @@ -55,6 +55,14 @@ struct Application: App { } } .handlesExternalEvents(matching: ["*"]) + .commands { + CommandGroup(replacing: .appSettings) { + Button(L10n.commonSettings) { + appCoordinator.handleAppRoute(.settings, windowType: nil) + } + .keyboardShortcut(",", modifiers: .command) + } + } // This is invoked in response of the WindowManager receiving a register // coordinator request and invoking the `OpenWindowAction` with which diff --git a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift index e8b9c925d..ba6d19626 100644 --- a/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift +++ b/ElementX/Sources/FlowCoordinators/UserSessionFlowCoordinator.swift @@ -122,10 +122,14 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { case .accountProvisioningLink: break // We always ignore this flow when logged in. case .settings, .chatBackupSettings: - if stateMachine.state != .settingsScreen { - stateMachine.tryEvent(.showSettingsScreen) + if ProcessInfo.processInfo.isiOSAppOnMac { + startSettingsFlow(detached: true) + } else { + if stateMachine.state != .settingsScreen { + stateMachine.tryEvent(.showSettingsScreen) + } + settingsFlowCoordinator?.handleAppRoute(appRoute, animated: animated) } - settingsFlowCoordinator?.handleAppRoute(appRoute, animated: animated) case .call(let roomID, let isVoiceCall): Task { await presentCallScreen(roomID: roomID, isVoiceCall: isVoiceCall) } case .genericCallLink(let url): @@ -179,7 +183,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { } stateMachine.addRoutes(event: .showSettingsScreen, transitions: [.tabBar => .settingsScreen]) { [weak self] _ in - self?.startSettingsFlow() + self?.startSettingsFlow(detached: false) } stateMachine.addRoutes(event: .dismissedSettingsScreen, transitions: [.settingsScreen => .tabBar]) { [weak self] _ in self?.settingsFlowCoordinator = nil @@ -303,7 +307,7 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { // MARK: - Settings - private func startSettingsFlow() { + private func startSettingsFlow(detached: Bool) { let navigationStackCoordinator = NavigationStackCoordinator() let coordinator = SettingsFlowCoordinator(appLockService: appLockService, navigationStackCoordinator: navigationStackCoordinator, @@ -331,11 +335,18 @@ class UserSessionFlowCoordinator: FlowCoordinatorProtocol { } .store(in: &cancellables) - settingsFlowCoordinator = coordinator coordinator.handleAppRoute(.settings, animated: false) - navigationTabCoordinator.setSheetCoordinator(navigationStackCoordinator) { [weak self] in - self?.stateMachine.tryEvent(.dismissedSettingsScreen) + if detached { + flowParameters.windowManager.registerCoordinator(navigationStackCoordinator, + flowCoordinator: coordinator, + forWindowType: .settings) + } else { + settingsFlowCoordinator = coordinator + + navigationTabCoordinator.setSheetCoordinator(navigationStackCoordinator) { [weak self] in + self?.stateMachine.tryEvent(.dismissedSettingsScreen) + } } } diff --git a/ElementX/Sources/Screens/Settings/SettingsScreen/View/SettingsScreen.swift b/ElementX/Sources/Screens/Settings/SettingsScreen/View/SettingsScreen.swift index 829ebe069..0177ba6b1 100644 --- a/ElementX/Sources/Screens/Settings/SettingsScreen/View/SettingsScreen.swift +++ b/ElementX/Sources/Screens/Settings/SettingsScreen/View/SettingsScreen.swift @@ -40,6 +40,7 @@ struct SettingsScreen: View { .compoundList() .navigationTitle(L10n.commonSettings) .navigationBarTitleDisplayMode(.inline) + .toolbarVisibility(ProcessInfo.processInfo.isiOSAppOnMac ? .hidden : .automatic, for: .navigationBar) .toolbar { toolbar } }