import { Editor } from "@tiptap/core"; import { Check, ChevronDown, Heading1, Heading2, Heading3, TextQuote, ListOrdered, TextIcon, Code, CheckSquare, } from "lucide-react"; import { Dispatch, FC, SetStateAction } from "react"; import { BubbleMenuItem } from "../bubble-menu"; import { cn } from "../utils"; interface NodeSelectorProps { editor: Editor; isOpen: boolean; setIsOpen: Dispatch>; } export const NodeSelector: FC = ({ editor, isOpen, setIsOpen }) => { const items: BubbleMenuItem[] = [ { name: "Text", icon: TextIcon, command: () => editor.chain().focus().toggleNode("paragraph", "paragraph").run(), isActive: () => editor.isActive("paragraph") && !editor.isActive("bulletList") && !editor.isActive("orderedList"), }, { name: "H1", icon: Heading1, command: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), isActive: () => editor.isActive("heading", { level: 1 }), }, { name: "H2", icon: Heading2, command: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), isActive: () => editor.isActive("heading", { level: 2 }), }, { name: "H3", icon: Heading3, command: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), isActive: () => editor.isActive("heading", { level: 3 }), }, { name: "To-do List", icon: CheckSquare, command: () => editor.chain().focus().toggleTaskList().run(), isActive: () => editor.isActive("taskItem"), }, { name: "Bullet List", icon: ListOrdered, command: () => editor.chain().focus().toggleBulletList().run(), isActive: () => editor.isActive("bulletList"), }, { name: "Numbered List", icon: ListOrdered, command: () => editor.chain().focus().toggleOrderedList().run(), isActive: () => editor.isActive("orderedList"), }, { name: "Quote", icon: TextQuote, command: () => editor.chain().focus().toggleNode("paragraph", "paragraph").toggleBlockquote().run(), isActive: () => editor.isActive("blockquote"), }, { name: "Code", icon: Code, command: () => editor.chain().focus().toggleCodeBlock().run(), isActive: () => editor.isActive("codeBlock"), }, ]; const activeItem = items.filter((item) => item.isActive()).pop() ?? { name: "Multiple", }; return (
{isOpen && (
{items.map((item, index) => ( ))}
)}
); };