import {ArrowDown, ArrowUp, Check, LucideIcon, Pen, Trash2, X} from "lucide-react"; import React, {ChangeEvent, useState} from "react"; import IconContainer from "@/components/ui/IconContainer"; interface ListItemProps { onClick: () => void; selectedId: number | string; id: number | string; icon?: LucideIcon; numericalIdentifier?: number; isEditable?: boolean; text: string; handleDelete?: (itemId: string) => void; handleUpdate?: (itemId: string, newValue: string, subNewValue: number) => void; onReorder?: (itemId: string, newOrder: number) => void; } export default function ListItem( { text, selectedId, id, icon, onClick, isEditable = false, handleDelete, numericalIdentifier, handleUpdate, onReorder }: ListItemProps): React.JSX.Element { const [editMode, setEditMode] = useState(false); const [newName, setNewName] = useState(''); const [newChapterOrder, setNewChapterOrder] = useState(numericalIdentifier ?? 0); function handleEdit(itemName: string): void { setNewName(itemName) setEditMode(true) } function handleSave(): void { if (!handleUpdate) return; handleUpdate(String(id), newName, newChapterOrder) setEditMode(false); } function moveItem(direction: "up" | "down"): void { const nextOrder: number = direction === "up" ? newChapterOrder - 1 : newChapterOrder + 1; if (nextOrder < 0) return; setNewChapterOrder(nextOrder); if (onReorder) { onReorder(String(id), nextOrder); } } return (
  • {(numericalIdentifier != null && newChapterOrder >= 0) && ( {newChapterOrder} )} {icon && ( )}
    {editMode ? ( <> ): void => setNewName(e.target.value)} autoFocus className="flex-1 bg-transparent text-sm font-medium text-text-primary outline-none min-w-0" />
    ) : ( {text} )} {!editMode && isEditable && (
    )}
  • ) }