import React from 'react'; import { cn } from '@/lib/utils'; import { SIDEBAR_SECTIONS } from '@/constants/sidebar'; import type { SidebarSection } from '@/constants/sidebar'; import { RiArrowLeftSLine } from '@remixicon/react'; import { Button } from '@/components/ui/button'; import { AgentsSidebar } from '@/components/sections/agents/AgentsSidebar'; import { AgentsPage } from '@/components/sections/agents/AgentsPage'; import { CommandsSidebar } from '@/components/sections/commands/CommandsSidebar'; import { CommandsPage } from '@/components/sections/commands/CommandsPage'; import { ProvidersSidebar } from '@/components/sections/providers/ProvidersSidebar'; import { ProvidersPage } from '@/components/sections/providers/ProvidersPage'; import { GitIdentitiesSidebar } from '@/components/sections/git-identities/GitIdentitiesSidebar'; import { GitIdentitiesPage } from '@/components/sections/git-identities/GitIdentitiesPage'; import { OpenChamberPage } from '@/components/sections/openchamber/OpenChamberPage'; import { ErrorBoundary } from '@/components/ui/ErrorBoundary'; import { MobileOverlayPanel } from '@/components/ui/MobileOverlayPanel'; interface SettingsDialogProps { isOpen: boolean; onClose: () => void; } const SETTINGS_SECTIONS = (() => { const filtered = SIDEBAR_SECTIONS.filter(section => section.id !== 'sessions'); const settingsSection = filtered.find(s => s.id === 'settings'); const otherSections = filtered.filter(s => s.id !== 'settings'); return settingsSection ? [settingsSection, ...otherSections] : filtered; })(); /** * Mobile-only settings dialog using MobileOverlayPanel. * Desktop uses SettingsView rendered inline in MainLayout. */ export const SettingsDialog: React.FC = ({ isOpen, onClose }) => { const [activeTab, setActiveTab] = React.useState('settings'); const [showPageContent, setShowPageContent] = React.useState(false); React.useEffect(() => { if (isOpen) { setActiveTab('settings'); setShowPageContent(false); } }, [isOpen]); const handleTabChange = React.useCallback((tab: SidebarSection) => { setActiveTab(tab); setShowPageContent(false); }, []); const handleItemSelect = React.useCallback(() => { setShowPageContent(true); }, []); const renderSidebarContent = () => { if (activeTab === 'settings') { return null; } const content = (() => { switch (activeTab) { case 'agents': return ; case 'commands': return ; case 'providers': return ; case 'git-identities': return ; default: return null; } })(); return
{content}
; }; const renderPageContent = () => { switch (activeTab) { case 'agents': return ; case 'commands': return ; case 'providers': return ; case 'git-identities': return ; case 'settings': return ; default: return null; } }; const mainContent = (
{/* Tab bar */}
{SETTINGS_SECTIONS.map(({ id, label, icon: Icon }) => { const isActive = activeTab === id; const PhosphorIcon = Icon as React.ComponentType<{ className?: string; weight?: string }>; return ( ); })}
{/* Content area - mobile drill-down pattern */}
{activeTab !== 'settings' && !showPageContent && (
{renderSidebarContent()}
)} {(activeTab === 'settings' || showPageContent) && (
{renderPageContent()}
)}
); return ( (
{showPageContent && ( )} Settings
{closeButton}
)} > {mainContent}
); };