import { useCallback, useState } from "react"; export interface ApplicationWorkspaceState { navigationOpen: boolean; activeView: ViewId | null; contentOpen: boolean; contentExpanded: boolean; } export interface ApplicationWorkspaceController extends ApplicationWorkspaceState { openNavigation: () => void; toggleNavigation: () => void; closeNavigation: () => void; openView: (view: ViewId) => void; closeView: () => void; setContentExpanded: (expanded: boolean) => void; } export interface ApplicationWorkspaceInitialState { navigationOpen?: boolean; activeView?: ViewId | null; contentExpanded?: boolean; } /** Owns the Launcher-derived navigation/content-window state machine. */ export function useApplicationWorkspace({ navigationOpen: initialNavigationOpen = false, activeView: initialActiveView = null, contentExpanded: initialContentExpanded = true, }: ApplicationWorkspaceInitialState = {}): ApplicationWorkspaceController { const [navigationOpen, setNavigationOpen] = useState(initialNavigationOpen || initialActiveView !== null); const [activeView, setActiveView] = useState(initialActiveView); const [contentExpanded, setContentExpanded] = useState(initialContentExpanded); const openNavigation = useCallback(() => setNavigationOpen(true), []); const closeView = useCallback(() => setActiveView(null), []); const closeNavigation = useCallback(() => { setNavigationOpen(false); setActiveView(null); }, []); const toggleNavigation = useCallback(() => { if (navigationOpen) { setNavigationOpen(false); setActiveView(null); } else { setNavigationOpen(true); } }, [navigationOpen]); const openView = useCallback((view: ViewId) => { setNavigationOpen(true); setActiveView(view); setContentExpanded(true); }, []); return { navigationOpen, activeView, contentOpen: activeView !== null, contentExpanded, openNavigation, toggleNavigation, closeNavigation, openView, closeView, setContentExpanded, }; }