import React from 'react'; import { Header, FixedSessionsButton } from './Header'; import { Sidebar } from './Sidebar'; import { SettingsDialog } from './SettingsDialog'; import { ErrorBoundary } from '../ui/ErrorBoundary'; import { CommandPalette } from '../ui/CommandPalette'; import { HelpDialog } from '../ui/HelpDialog'; import { SessionSidebar } from '@/components/session/SessionSidebar'; import { SessionDialogs } from '@/components/session/SessionDialogs'; import { MobileOverlayPanel } from '@/components/ui/MobileOverlayPanel'; import { DiffWorkerProvider } from '@/contexts/DiffWorkerProvider'; import { useUIStore } from '@/stores/useUIStore'; import { useDeviceInfo } from '@/lib/device'; import { useEdgeSwipe } from '@/hooks/useEdgeSwipe'; import { cn } from '@/lib/utils'; import { ChatView, GitView, DiffView, TerminalView } from '@/components/views'; export const MainLayout: React.FC = () => { const { isSidebarOpen, activeMainTab, setIsMobile, isSessionSwitcherOpen, setSessionSwitcherOpen, isSettingsDialogOpen, setSettingsDialogOpen, } = useUIStore(); const { isMobile } = useDeviceInfo(); const [isDesktopRuntime, setIsDesktopRuntime] = React.useState(() => { if (typeof window === 'undefined') { return false; } return typeof window.opencodeDesktop !== 'undefined'; }); React.useEffect(() => { if (typeof window === 'undefined') { return; } setIsDesktopRuntime(typeof window.opencodeDesktop !== 'undefined'); }, []); useEdgeSwipe({ enabled: true }); React.useEffect(() => { const previous = useUIStore.getState().isMobile; if (previous !== isMobile) { setIsMobile(isMobile); } }, [isMobile, setIsMobile]); React.useEffect(() => { if (typeof window === 'undefined') { return; } let timeoutId: number | undefined; const handleResize = () => { if (timeoutId !== undefined) { window.clearTimeout(timeoutId); } timeoutId = window.setTimeout(() => { useUIStore.getState().updateProportionalSidebarWidths(); }, 150); }; window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); if (timeoutId !== undefined) { window.clearTimeout(timeoutId); } }; }, []); const secondaryView = React.useMemo(() => { switch (activeMainTab) { case 'git': return ; case 'diff': return ; case 'terminal': return ; default: return null; } }, [activeMainTab]); const isChatActive = activeMainTab === 'chat'; return (
setSettingsDialogOpen(false)} /> {isMobile ? ( <>
{secondaryView && (
{secondaryView}
)}
setSessionSwitcherOpen(false)} title="Sessions" > ) : ( <>
{secondaryView && (
{secondaryView}
)}
)}
); };