| 1 | import { useLayoutStore } from "../store/layout"; |
| 2 | import { useOverlayStore } from "../store/overlays"; |
| 3 | import { useAppNavigationStore } from "../store/appNavigation"; |
| 4 | import { useRemoteStore } from "../store/remote"; |
| 5 | import { useWindowChromeStore } from "../store/windowChrome"; |
| 6 | import { useDesktopPreferences } from "./useDesktopPreferences"; |
| 7 | |
| 8 | /** |
| 9 | * Single subscription surface for the store-backed shell state AppRuntime |
| 10 | * wires into regions: overlay visibility, navigation page, layout geometry |
| 11 | * flags, remote catalogs, window chrome and desktop preferences. Controller |
| 12 | * state never flows through here — this hook only reads stores. |
| 13 | */ |
| 14 | export function useAppShellStores() { |
| 15 | const startupSplashVisible = useOverlayStore((s) => s.startupSplashVisible); |
| 16 | const setStartupSplashVisible = useOverlayStore((s) => s.setStartupSplashVisible); |
| 17 | // null until the mount probe resolves; true shows the first-run guide. |
| 18 | const needsOnboarding = useOverlayStore((s) => s.needsOnboarding); |
| 19 | const providerSetupNeeded = useOverlayStore((s) => s.providerSetupNeeded); |
| 20 | const setProviderSetupNeeded = useOverlayStore((s) => s.setProviderSetupNeeded); |
| 21 | const paletteOpen = useOverlayStore((s) => s.paletteOpen); |
| 22 | const setPaletteOpen = useOverlayStore((s) => s.setPaletteOpen); |
| 23 | const shortcutsOpen = useOverlayStore((s) => s.shortcutsOpen); |
| 24 | const setShortcutsOpen = useOverlayStore((s) => s.setShortcutsOpen); |
| 25 | const takeoverDialogTab = useOverlayStore((s) => s.takeoverDialogTab); |
| 26 | const reclaimBusyTab = useOverlayStore((s) => s.reclaimBusyTab); |
| 27 | const transientOverlayDismissSignal = useOverlayStore((s) => s.transientOverlayDismissSignal); |
| 28 | const setTransientOverlayDismissSignal = useOverlayStore((s) => s.setTransientOverlayDismissSignal); |
| 29 | const sidebarSearchOpen = useOverlayStore((s) => s.sidebarSearchOpen); |
| 30 | const setSidebarSearchOpen = useOverlayStore((s) => s.setSidebarSearchOpen); |
| 31 | const sidebarSearchFocusSignal = useOverlayStore((s) => s.sidebarSearchFocusSignal); |
| 32 | const setSidebarSearchFocusSignal = useOverlayStore((s) => s.setSidebarSearchFocusSignal); |
| 33 | |
| 34 | const page = useAppNavigationStore((s) => s.page); |
| 35 | const openPage = useAppNavigationStore((s) => s.openPage); |
| 36 | const returnToWorkspace = useAppNavigationStore((s) => s.returnToWorkspace); |
| 37 | const enterConversation = useAppNavigationStore((s) => s.enterConversation); |
| 38 | const visitedTrash = useAppNavigationStore((s) => s.visitedTrash); |
| 39 | const visitedAutomation = useAppNavigationStore((s) => s.visitedAutomation); |
| 40 | const automationReturn = useAppNavigationStore((s) => s.automationReturn); |
| 41 | const setSettingsTarget = useAppNavigationStore((s) => s.setSettingsTarget); |
| 42 | const settingsFocus = useAppNavigationStore((s) => s.settingsFocus); |
| 43 | const setSettingsFocus = useAppNavigationStore((s) => s.setSettingsFocus); |
| 44 | |
| 45 | const sidebarCollapsed = useLayoutStore((s) => s.sidebarCollapsed); |
| 46 | const sidebarResizing = useLayoutStore((state) => state.sidebarResizing); |
| 47 | const sidebarTogglePressed = useLayoutStore((state) => state.sidebarTogglePressed); |
| 48 | const workspacePanelOpen = useLayoutStore((s) => s.workspacePanelOpen); |
| 49 | const rightDockTreeWidth = useLayoutStore((s) => s.rightDockTreeWidth); |
| 50 | const setRightDockTreeWidth = useLayoutStore((s) => s.setRightDockTreeWidth); |
| 51 | const rightDockPreviewWidth = useLayoutStore((s) => s.rightDockPreviewWidth); |
| 52 | const workspacePanelResizing = useLayoutStore((state) => state.workspacePanelResizing); |
| 53 | const liveTerminalHeight = useLayoutStore((state) => state.liveTerminalHeight); |
| 54 | const setLiveWorkspacePanelRenderWidth = useLayoutStore((state) => state.setLiveWorkspacePanelRenderWidth); |
| 55 | const workspacePanelMaximized = useLayoutStore((s) => s.workspacePanelMaximized); |
| 56 | const rightDockMode = useLayoutStore((s) => s.rightDockMode); |
| 57 | const terminalPanelOpen = useLayoutStore((s) => s.terminalPanelOpen); |
| 58 | |
| 59 | const remoteHosts = useRemoteStore((s) => s.hosts); |
| 60 | const remoteStatuses = useRemoteStore((s) => s.statuses); |
| 61 | const requestRemoteExplorer = useRemoteStore((s) => s.openExplorer); |
| 62 | |
| 63 | const desktopPlatform = useWindowChromeStore((state) => state.platform); |
| 64 | const mainWindowMaximised = useWindowChromeStore((state) => state.mainWindowMaximised); |
| 65 | |
| 66 | const preferences = useDesktopPreferences(); |
| 67 | |
| 68 | const managementActive = page.kind !== "workspace"; |
| 69 | const settingsTarget = page.kind === "settings" ? page.tab : null; |
| 70 | const windowsFramelessChrome = desktopPlatform === "windows"; |
| 71 | const terminalResizing = liveTerminalHeight !== null; |
| 72 | |
| 73 | return { |
| 74 | startupSplashVisible, setStartupSplashVisible, |
| 75 | needsOnboarding, providerSetupNeeded, setProviderSetupNeeded, |
| 76 | paletteOpen, setPaletteOpen, shortcutsOpen, setShortcutsOpen, |
| 77 | takeoverDialogTab, reclaimBusyTab, |
| 78 | transientOverlayDismissSignal, setTransientOverlayDismissSignal, |
| 79 | sidebarSearchOpen, setSidebarSearchOpen, sidebarSearchFocusSignal, setSidebarSearchFocusSignal, |
| 80 | page, openPage, returnToWorkspace, enterConversation, |
| 81 | visitedTrash, visitedAutomation, automationReturn, |
| 82 | settingsTarget, settingsFocus, setSettingsTarget, setSettingsFocus, |
| 83 | sidebarCollapsed, sidebarResizing, sidebarTogglePressed, |
| 84 | workspacePanelOpen, rightDockTreeWidth, setRightDockTreeWidth, rightDockPreviewWidth, |
| 85 | workspacePanelResizing, liveTerminalHeight, setLiveWorkspacePanelRenderWidth, |
| 86 | workspacePanelMaximized, rightDockMode, terminalPanelOpen, |
| 87 | remoteHosts, remoteStatuses, requestRemoteExplorer, |
| 88 | desktopPlatform, mainWindowMaximised, |
| 89 | preferences, |
| 90 | managementActive, |
| 91 | windowsFramelessChrome, terminalResizing, |
| 92 | }; |
| 93 | } |
| 94 |