'use client'; import { useState } from 'react'; import { Box, Typography, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Divider, IconButton, Button, Drawer, useMediaQuery, Tooltip, } from '@mui/material'; import { useTheme } from '@mui/material/styles'; import { MessageSquare, Plus, Trash2, Menu as MenuIcon, Pencil, Sparkles, } from 'lucide-react'; import { useChatStore } from '../services/chat-store'; import { useI18n } from '../services/i18n'; const SIDEBAR_WIDTH = 280; export default function ChatSidebar() { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('md')); const { t } = useI18n(); const { sessions, activeSessionId, setActiveSession, createSession, deleteSession, renameSession, } = useChatStore(); const [open, setOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [editValue, setEditValue] = useState(''); const handleNew = () => { createSession('Neue Reparatur'); setOpen(false); }; const startEdit = (id: string, currentTitle: string) => { setEditingId(id); setEditValue(currentTitle); }; const commitEdit = () => { if (editingId && editValue.trim()) renameSession(editingId, editValue.trim()); setEditingId(null); setEditValue(''); }; const handleDelete = (e: React.MouseEvent, id: string) => { e.stopPropagation(); deleteSession(id); }; const handleSelect = (id: string) => { setActiveSession(id); setOpen(false); }; const content = ( {t('chatHistory')} ยท {sessions.length} {sessions.length === 0 && ( {t('chatNoSessionHint')} )} {sessions.map((session) => { const selected = activeSessionId === session.id; const editing = editingId === session.id; return ( { e.stopPropagation(); startEdit(session.id, session.title); }} sx={{ color: selected ? 'inherit' : 'text.secondary', p: 0.5, }} > handleDelete(e, session.id)} sx={{ color: selected ? 'inherit' : 'text.secondary', p: 0.5, }} > ) } > handleSelect(session.id)} sx={{ borderRadius: 2, pr: 7, py: 0.85, minHeight: 44, '&.Mui-selected': { bgcolor: 'primary.main', color: 'white', '&:hover': { bgcolor: 'primary.dark' }, '& .MuiListItemIcon-root': { color: 'white' }, }, }} > {editing ? ( setEditValue(e.target.value)} onBlur={commitEdit} onClick={(e) => e.stopPropagation()} onKeyDown={(e) => { if (e.key === 'Enter') commitEdit(); if (e.key === 'Escape') setEditingId(null); }} style={{ flex: 1, background: 'transparent', border: 'none', outline: 'none', color: 'inherit', fontFamily: 'inherit', fontSize: '0.84rem', fontWeight: 600, }} /> ) : ( )} ); })} ); if (isMobile) { return ( <> setOpen(true)} sx={{ width: 36, height: 36, bgcolor: 'background.paper', border: '1px solid', borderColor: 'divider', boxShadow: 'var(--pp-shadow-soft)', }} aria-label="Chat-Verlauf" > setOpen(false)} PaperProps={{ sx: { width: SIDEBAR_WIDTH } }} > {content} ); } return content; }