import { useState, useEffect, useCallback } from 'react'; import type { Page, Session } from './types'; import type { Locale } from './i18n'; import { setLocale, getLocale } from './i18n'; import Sidebar from './components/Sidebar'; import ChatWindow from './components/ChatWindow'; import SkillsPage from './components/SkillsPage'; import MemoryPage from './components/MemoryPage'; import SettingsPage from './components/SettingsPage'; import ChannelsPage from './components/ChannelsPage'; import McpPage from './components/McpPage'; import HistoryPage from './components/HistoryPage'; import AgentsPage from './components/AgentsPage'; import ScheduledTasksPage from './components/ScheduledTasksPage'; import SecretsPage from './components/SecretsPage'; import ConfigBotPage from './components/ConfigBotPage'; import ProjectsPage from './components/ProjectsPage'; import RolesPage from './components/RolesPage'; import ExecutionsPage from './components/ExecutionsPage'; import GoalsPage from './components/GoalsPage'; import LineagesPage from './components/LineagesPage'; export default function App() { const [activePage, setActivePage] = useState('chat'); const [sessionCount, setSessionCount] = useState(0); const [locale, setLocaleState] = useState(getLocale()); const handleLocaleChange = useCallback((newLocale: Locale) => { setLocale(newLocale); setLocaleState(newLocale); }, []); // Fetch session count for the sidebar badge useEffect(() => { fetch('/api/sessions') .then((r) => r.json()) .then((data: Session[]) => { if (Array.isArray(data)) setSessionCount(data.length); }) .catch(() => {}); }, []); // Load saved locale from settings useEffect(() => { fetch('/api/settings') .then((r) => r.json()) .then((data: Record) => { if (data.language) handleLocaleChange(data.language as Locale); }) .catch(() => {}); }, [handleLocaleChange]); const renderPage = () => { switch (activePage) { case 'chat': return ; case 'history': return ; case 'skills': return ; case 'agents': return ; case 'memory': return ; case 'mcp': return ; case 'tasks': return ; case 'secrets': return ; case 'settings': return ; case 'channels': return ; case 'config': return ; case 'projects': return ; case 'roles': return ; case 'executions': return ; case 'goals': return ; case 'lineages': return ; default: return ; } }; return (
{/* macOS draggable titlebar region */}
{renderPage()}
); }