import { Check, ChevronDown, ChevronRight, Edit3, Folder, FolderOpen, Star, Trash2, X } from 'lucide-react'; import type { TFunction } from 'i18next'; import { Button } from '../../../../shared/view/ui'; import { cn } from '../../../../lib/utils'; import type { Project, ProjectSession, LLMProvider } from '../../../../types/app'; import type { MCPServerStatus, SessionWithProvider } from '../../types/types'; import { getTaskIndicatorStatus } from '../../utils/utils'; import TaskIndicator from './TaskIndicator'; import SidebarProjectSessions from './SidebarProjectSessions'; type SidebarProjectItemProps = { project: Project; selectedProject: Project | null; selectedSession: ProjectSession | null; isExpanded: boolean; isDeleting: boolean; isStarred: boolean; editingProject: string | null; editingName: string; sessions: SessionWithProvider[]; initialSessionsLoaded: boolean; isLoadingMoreSessions: boolean; currentTime: Date; processingSessions?: Set; editingSession: string | null; editingSessionName: string; tasksEnabled: boolean; mcpServerStatus: MCPServerStatus; onEditingNameChange: (name: string) => void; onToggleProject: (projectName: string) => void; onProjectSelect: (project: Project) => void; onToggleStarProject: (projectName: string) => void; onStartEditingProject: (project: Project) => void; onCancelEditingProject: () => void; onSaveProjectName: (projectName: string) => void; onDeleteProject: (project: Project) => void; onSessionSelect: (session: SessionWithProvider, projectName: string) => void; onDeleteSession: ( projectName: string, sessionId: string, sessionTitle: string, provider: LLMProvider, ) => void; onLoadMoreSessions: (projectId: string) => void; onNewSession: (project: Project) => void; onEditingSessionNameChange: (value: string) => void; onStartEditingSession: (sessionId: string, initialName: string) => void; onCancelEditingSession: () => void; onSaveEditingSession: (projectName: string, sessionId: string, summary: string, provider: LLMProvider) => void; t: TFunction; }; const getSessionCountDisplay = (project: Project, sessions: SessionWithProvider[]): string => { const total = Number(project.sessionMeta?.total ?? sessions.length); return String(total); }; export default function SidebarProjectItem({ project, selectedProject, selectedSession, isExpanded, isDeleting, isStarred, editingProject, editingName, sessions, initialSessionsLoaded, isLoadingMoreSessions, currentTime, processingSessions, editingSession, editingSessionName, tasksEnabled, mcpServerStatus, onEditingNameChange, onToggleProject, onProjectSelect, onToggleStarProject, onStartEditingProject, onCancelEditingProject, onSaveProjectName, onDeleteProject, onSessionSelect, onDeleteSession, onLoadMoreSessions, onNewSession, onEditingSessionNameChange, onStartEditingSession, onCancelEditingSession, onSaveEditingSession, t, }: SidebarProjectItemProps) { // Project identity is tracked by the DB-assigned `projectId` everywhere // after the projectName → projectId migration. const isSelected = selectedProject?.projectId === project.projectId; const isEditing = editingProject === project.projectId; const totalSessionCount = Number(project.sessionMeta?.total ?? sessions.length); const sessionCountDisplay = getSessionCountDisplay(project, sessions); const sessionCountLabel = `${sessionCountDisplay} session${totalSessionCount === 1 ? '' : 's'}`; const taskStatus = getTaskIndicatorStatus(project, mcpServerStatus); const toggleProject = () => onToggleProject(project.projectId); const toggleStarProject = () => onToggleStarProject(project.projectId); const saveProjectName = () => { onSaveProjectName(project.projectId); }; const selectAndToggleProject = () => { if (selectedProject?.projectId !== project.projectId) { onProjectSelect(project); } toggleProject(); }; return (
{isExpanded ? ( ) : ( )}
{isEditing ? ( onEditingNameChange(event.target.value)} className="w-full rounded-lg border-2 border-primary/40 bg-background px-3 py-2 text-sm text-foreground shadow-sm transition-all duration-200 focus:border-primary focus:shadow-md focus:outline-none" placeholder={t('projects.projectNamePlaceholder')} autoFocus autoComplete="off" onClick={(event) => event.stopPropagation()} onKeyDown={(event) => { if (event.key === 'Enter') { saveProjectName(); } if (event.key === 'Escape') { onCancelEditingProject(); } }} style={{ fontSize: '16px', WebkitAppearance: 'none', borderRadius: '8px', }} /> ) : ( <>

{project.displayName}

{tasksEnabled && ( )}

{sessionCountLabel}

)}
{isEditing ? ( <> ) : ( <>
{isExpanded ? ( ) : ( )}
)}
); }