import { Node, mergeAttributes, ReactNodeViewRenderer, NodeViewWrapper } from "@tiptap/react"; import type { NodeViewProps } from "@tiptap/react"; import { FileText } from "lucide-react"; import { usePageTitle } from "./PageTitleContext"; declare module "@tiptap/react" { interface Commands { pageLink: { insertPageLink: (attrs: { pageId: string }) => ReturnType; }; } } function PageLinkNodeView({ node }: NodeViewProps) { const title = usePageTitle(node.attrs.pageId); const handleClick = (e: React.MouseEvent) => { (e.currentTarget as HTMLElement).dispatchEvent( new CustomEvent("page-link-click", { bubbles: true, detail: { pageId: node.attrs.pageId }, }), ); }; return ( {title} ); } export const PageLinkExtension = Node.create({ name: "pageLink", group: "block", atom: true, addAttributes() { return { pageId: { default: null }, }; }, parseHTML() { return [ { tag: 'div[data-page-link]' }, { tag: 'span[data-page-link]' }, ]; }, renderHTML({ HTMLAttributes }) { return [ "div", mergeAttributes(HTMLAttributes, { "data-page-link": HTMLAttributes.pageId, class: "page-link-block", }), ]; }, addCommands() { return { insertPageLink: (attrs) => ({ chain }) => { return chain().insertContent({ type: this.name, attrs }).run(); }, }; }, addNodeView() { return ReactNodeViewRenderer(PageLinkNodeView); }, });