import { useCallback, useRef, useEffect } from 'react'; import { Box, Drawer, Typography, IconButton, } from '@mui/material'; import MenuIcon from '@mui/icons-material/Menu'; import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; import DragIndicatorIcon from '@mui/icons-material/DragIndicator'; import { useSessionStore } from '@/store/sessionStore'; import { useAgentStore } from '@/store/agentStore'; import { useLayoutStore } from '@/store/layoutStore'; import { useAgentWebSocket } from '@/hooks/useAgentWebSocket'; import SessionSidebar from '@/components/SessionSidebar/SessionSidebar'; import CodePanel from '@/components/CodePanel/CodePanel'; import ChatInput from '@/components/Chat/ChatInput'; import MessageList from '@/components/Chat/MessageList'; import type { Message } from '@/types/agent'; const DRAWER_WIDTH = 260; export default function AppLayout() { const { activeSessionId } = useSessionStore(); const { isConnected, isProcessing, getMessages, addMessage } = useAgentStore(); const { isLeftSidebarOpen, isRightPanelOpen, rightPanelWidth, setRightPanelWidth, toggleLeftSidebar, toggleRightPanel } = useLayoutStore(); const isResizing = useRef(false); const startResizing = useCallback((e: React.MouseEvent) => { e.preventDefault(); isResizing.current = true; document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', stopResizing); document.body.style.cursor = 'col-resize'; }, []); const stopResizing = useCallback(() => { isResizing.current = false; document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', stopResizing); document.body.style.cursor = 'default'; }, []); const handleMouseMove = useCallback((e: MouseEvent) => { if (!isResizing.current) return; const newWidth = window.innerWidth - e.clientX; const maxWidth = window.innerWidth * 0.8; const minWidth = 300; if (newWidth > minWidth && newWidth < maxWidth) { setRightPanelWidth(newWidth); } }, [setRightPanelWidth]); useEffect(() => { return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', stopResizing); }; }, [handleMouseMove, stopResizing]); const messages = activeSessionId ? getMessages(activeSessionId) : []; useAgentWebSocket({ sessionId: activeSessionId, onReady: () => console.log('Agent ready'), onError: (error) => console.error('Agent error:', error), }); const handleSendMessage = useCallback( async (text: string) => { if (!activeSessionId || !text.trim()) return; const userMsg: Message = { id: `user_${Date.now()}`, role: 'user', content: text.trim(), timestamp: new Date().toISOString(), }; addMessage(activeSessionId, userMsg); try { await fetch('/api/submit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ session_id: activeSessionId, text: text.trim(), }), }); } catch (e) { console.error('Send failed:', e); } }, [activeSessionId, addMessage] ); return ( {/* Left Sidebar Drawer */} {/* Main Content Area */} {/* Top Header Bar (Fixed) */} {isLeftSidebarOpen ? : } Hugging Face {activeSessionId ? ( <> ) : ( NO SESSION SELECTED Initialize a session via the sidebar )} {/* Resize Handle */} {isRightPanelOpen && ( )} {/* Right Panel Drawer */} ); }