import { useState, ChangeEvent, KeyboardEvent, useRef, useEffect } from "react"; import { useNotesStore } from "../contexts/NotesStore" type ListItemProps = { id: string; label: string; callback: React.MouseEventHandler; } function ListItem(props: ListItemProps) { const { updateNote } = useNotesStore(); const [tempLabel, setTempLabel] = useState(props.label); const [isEditing, setIsEditing] = useState(false); const containerRef = useRef(null); const iconClasses = () => { return `bi bi-file-earmark-text me-2` + (isEditing ? "m-0" : ""); }; const handleDoubleClick = () => setIsEditing(true) const handleChange = (event: ChangeEvent) => { setTempLabel(event.target.value) } const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Enter") { saveEdit(); } if (event.key === "Escape") { cancelEdit(); } } const cancelEdit = () => { setTempLabel(props.label); // reset setIsEditing(false); }; const saveEdit = () => { updateNote(props.id, { title: tempLabel }); setIsEditing(false); }; useEffect(() => { if (!isEditing) return; const handleClickOutside = (event: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { cancelEdit(); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [isEditing]); return (
{ isEditing ? ( ) : ( {props.label} ) }
) } export default ListItem