import React, { useState } from 'react'; import { MessageSquare, Plus, Trash2, X, Folder, ChevronRight, ChevronDown, MoreVertical, FolderPlus } from 'lucide-react'; import { Session, Folder as FolderType, Language } from '../types'; import { TEXTS } from '../constants'; import { getConversationalTime } from '../utils'; interface SidebarProps { isOpen: boolean; onClose: () => void; sessions: Session[]; folders: FolderType[]; currentSessionId: string | null; onSelectSession: (id: string) => void; onNewChat: () => void; onNewFolder: (name: string) => void; onDeleteSession: (id: string, e: React.MouseEvent) => void; onMoveSession: (sessionId: string, folderId: string | undefined) => void; onDeleteFolder: (id: string) => void; language: Language; } export const Sidebar: React.FC = ({ isOpen, onClose, sessions, folders, currentSessionId, onSelectSession, onNewChat, onNewFolder, onDeleteSession, onMoveSession, onDeleteFolder, language }) => { const [expandedFolders, setExpandedFolders] = useState>(new Set(folders.map(f => f.id))); const [showNewFolderInput, setShowNewFolderInput] = useState(false); const [newFolderName, setNewFolderName] = useState(''); const [openMenuSessionId, setOpenMenuSessionId] = useState(null); const toggleFolder = (id: string) => { const newSet = new Set(expandedFolders); if (newSet.has(id)) { newSet.delete(id); } else { newSet.add(id); } setExpandedFolders(newSet); }; const handleCreateFolder = (e: React.FormEvent) => { e.preventDefault(); if (newFolderName.trim()) { onNewFolder(newFolderName.trim()); setNewFolderName(''); setShowNewFolderInput(false); } }; const sessionsByFolder: Record = {}; const unsortedSessions: Session[] = []; sessions.forEach(s => { if (s.folderId && folders.find(f => f.id === s.folderId)) { if (!sessionsByFolder[s.folderId]) sessionsByFolder[s.folderId] = []; sessionsByFolder[s.folderId].push(s); } else { unsortedSessions.push(s); } }); const renderSessionItem = (session: Session) => (
{ onSelectSession(session.id); if(window.innerWidth < 768) onClose(); }} >

{session.title}

{getConversationalTime(session.updatedAt, language)}

{/* Context Menu Trigger */} {/* Context Menu Dropdown */} {openMenuSessionId === session.id && ( <>
{ e.stopPropagation(); setOpenMenuSessionId(null); }}>
{TEXTS.moveTo[language]}
{folders.map(f => ( ))}
)}
); return ( <> {/* Overlay for mobile */}
{/* Sidebar Panel */}

{TEXTS.sidebarTitle[language]}

{showNewFolderInput && (
setNewFolderName(e.target.value)} placeholder={TEXTS.folderNamePlaceholder[language]} className="flex-1 text-xs p-2 rounded border border-earth-300 focus:border-clay-400 outline-none" />
)}
{/* Folders */} {folders.map(folder => (
toggleFolder(folder.id)} >
{expandedFolders.has(folder.id) ? : } {folder.name}
{expandedFolders.has(folder.id) && (
{sessionsByFolder[folder.id]?.length > 0 ? ( sessionsByFolder[folder.id].map(renderSessionItem) ) : (

Empty dossier

)}
)}
))} {/* Unsorted Sessions */}
{folders.length > 0 && TEXTS.unsorted[language]}
{unsortedSessions.map(renderSessionItem)}
if.emotion v2.1
); };