import { useState } from "react"; import Box from "@mui/material/Box"; import Typography from "@mui/material/Typography"; import Menu from "@mui/material/Menu"; import MenuItem from "@mui/material/MenuItem"; import IconButton from "@mui/material/IconButton"; import { Button, TextField, Modal, ConfirmDialog } from "../../ui"; interface OdinSidebarProps { conversations: { id: number; title: string }[]; activeId: number | null; busy: boolean; onSelect: (id: number) => void; onNew: () => void; onRename: (id: number, title: string) => void; onDelete: (id: number) => void; } export default function OdinSidebar({ conversations, activeId, busy, onSelect, onNew, onRename, onDelete, }: OdinSidebarProps) { const [anchorEl, setAnchorEl] = useState(null); const [menuConv, setMenuConv] = useState<{ id: number; title: string; } | null>(null); const [renameOpen, setRenameOpen] = useState(false); const [renameDraft, setRenameDraft] = useState(""); const [deleteOpen, setDeleteOpen] = useState(false); const openMenu = ( e: React.MouseEvent, conv: { id: number; title: string }, ) => { e.stopPropagation(); setMenuConv(conv); setAnchorEl(e.currentTarget); }; const closeMenu = () => setAnchorEl(null); const handleRenameOpen = () => { closeMenu(); setRenameDraft(menuConv?.title ?? ""); setRenameOpen(true); }; const handleRenameSubmit = () => { if (menuConv) onRename(menuConv.id, renameDraft.trim() || menuConv.title); setRenameOpen(false); }; const handleDeleteOpen = () => { closeMenu(); setDeleteOpen(true); }; const handleDeleteConfirm = () => { if (menuConv) onDelete(menuConv.id); setDeleteOpen(false); }; return ( {/* Brand + New chat */} ({ px: 0.5, fontSize: "1.7rem", fontWeight: 700, lineHeight: 1.2, letterSpacing: "-0.02em", backgroundImage: `linear-gradient(120deg, ${t.vars!.palette.primary.light}, ${t.vars!.palette.primary.main})`, WebkitBackgroundClip: "text", backgroundClip: "text", WebkitTextFillColor: "transparent", })} > Odin {/* Conversation list */} {conversations.length === 0 && ( Zatím žádné konverzace. )} {conversations.map((conv) => { const isActive = conv.id === activeId; return ( !busy && onSelect(conv.id)} onKeyDown={(e) => { // Activate the row on Enter/Space like a native button. The // nested kebab IconButton stays a real