返回 DeepSeek-Reasonix
useAppShellStores.ts
根目录 / desktop / frontend / src / app-runtime / useAppShellStores.ts
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
94 lines TYPESCRIPT