import { useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import VersionUpgradeModal from './modals/VersionUpgradeModal'; import { useDeviceSettings } from '../hooks/useDeviceSettings'; import { useVersionCheck } from '../hooks/useVersionCheck'; import { useUiPreferences } from '../hooks/useUiPreferences'; import { useSidebarController } from '../hooks/useSidebarController'; import { useTaskMaster } from '../contexts/TaskMasterContext'; import { useTasksSettings } from '../contexts/TasksSettingsContext'; import SidebarCollapsed from './sidebar/SidebarCollapsed'; import SidebarContent from './sidebar/SidebarContent'; import SidebarModals from './sidebar/SidebarModals'; import type { Project } from '../types/app'; import type { SidebarProjectListProps } from './sidebar/SidebarProjectList'; import type { MCPServerStatus, SidebarProps } from './sidebar/types'; type TaskMasterSidebarContext = { setCurrentProject: (project: Project) => void; mcpServerStatus: MCPServerStatus; }; function Sidebar({ projects, selectedProject, selectedSession, onProjectSelect, onSessionSelect, onNewSession, onSessionDelete, onProjectDelete, isLoading, loadingProgress, onRefresh, onShowSettings, isMobile, }: SidebarProps) { const { t } = useTranslation(['sidebar', 'common']); const { isPWA } = useDeviceSettings({ trackMobile: false }); const { updateAvailable, latestVersion, currentVersion, releaseInfo } = useVersionCheck( 'siteboon', 'claudecodeui', ); const { preferences, setPreference } = useUiPreferences(); const { sidebarVisible } = preferences; const { setCurrentProject, mcpServerStatus } = useTaskMaster() as TaskMasterSidebarContext; const { tasksEnabled } = useTasksSettings(); const { isSidebarCollapsed, expandedProjects, editingProject, showNewProject, editingName, loadingSessions, initialSessionsLoaded, currentTime, isRefreshing, editingSession, editingSessionName, searchFilter, deletingProjects, deleteConfirmation, sessionDeleteConfirmation, showVersionModal, filteredProjects, handleTouchClick, toggleProject, handleSessionClick, toggleStarProject, isProjectStarred, getProjectSessions, startEditing, cancelEditing, saveProjectName, showDeleteSessionConfirmation, confirmDeleteSession, requestProjectDelete, confirmDeleteProject, loadMoreSessions, handleProjectSelect, refreshProjects, updateSessionSummary, collapseSidebar: handleCollapseSidebar, expandSidebar: handleExpandSidebar, setShowNewProject, setEditingName, setEditingSession, setEditingSessionName, setSearchFilter, setDeleteConfirmation, setSessionDeleteConfirmation, setShowVersionModal, } = useSidebarController({ projects, selectedProject, selectedSession, isLoading, isMobile, t, onRefresh, onProjectSelect, onSessionSelect, onSessionDelete, onProjectDelete, setCurrentProject, setSidebarVisible: (visible) => setPreference('sidebarVisible', visible), sidebarVisible, }); useEffect(() => { if (typeof document === 'undefined') { return; } document.documentElement.classList.toggle('pwa-mode', isPWA); document.body.classList.toggle('pwa-mode', isPWA); }, [isPWA]); const handleProjectCreated = () => { if (window.refreshProjects) { void window.refreshProjects(); return; } window.location.reload(); }; const projectListProps: SidebarProjectListProps = { projects, filteredProjects, selectedProject, selectedSession, isLoading, loadingProgress, expandedProjects, editingProject, editingName, loadingSessions, initialSessionsLoaded, currentTime, editingSession, editingSessionName, deletingProjects, tasksEnabled, mcpServerStatus, getProjectSessions, isProjectStarred, onEditingNameChange: setEditingName, onToggleProject: toggleProject, onProjectSelect: handleProjectSelect, onToggleStarProject: toggleStarProject, onStartEditingProject: startEditing, onCancelEditingProject: cancelEditing, onSaveProjectName: (projectName) => { void saveProjectName(projectName); }, onDeleteProject: requestProjectDelete, onSessionSelect: handleSessionClick, onDeleteSession: showDeleteSessionConfirmation, onLoadMoreSessions: (project) => { void loadMoreSessions(project); }, onNewSession, onEditingSessionNameChange: setEditingSessionName, onStartEditingSession: (sessionId, initialName) => { setEditingSession(sessionId); setEditingSessionName(initialName); }, onCancelEditingSession: () => { setEditingSession(null); setEditingSessionName(''); }, onSaveEditingSession: (projectName, sessionId, summary) => { void updateSessionSummary(projectName, sessionId, summary); }, touchHandlerFactory: handleTouchClick, t, }; return ( <> {isSidebarCollapsed ? ( setShowVersionModal(true)} t={t} /> ) : ( <> setShowNewProject(false)} onProjectCreated={handleProjectCreated} deleteConfirmation={deleteConfirmation} onCancelDeleteProject={() => setDeleteConfirmation(null)} onConfirmDeleteProject={confirmDeleteProject} sessionDeleteConfirmation={sessionDeleteConfirmation} onCancelDeleteSession={() => setSessionDeleteConfirmation(null)} onConfirmDeleteSession={confirmDeleteSession} t={t} /> setSearchFilter('')} onRefresh={() => { void refreshProjects(); }} isRefreshing={isRefreshing} onCreateProject={() => setShowNewProject(true)} onCollapseSidebar={handleCollapseSidebar} updateAvailable={updateAvailable} releaseInfo={releaseInfo} latestVersion={latestVersion} onShowVersionModal={() => setShowVersionModal(true)} onShowSettings={onShowSettings} projectListProps={projectListProps} t={t} /> )} setShowVersionModal(false)} releaseInfo={releaseInfo} currentVersion={currentVersion} latestVersion={latestVersion} /> ); } export default Sidebar;