import { Extension } from "@tiptap/core"; import { Plugin } from "prosemirror-state"; import type { BlockNoteEditor } from "../../editor/BlockNoteEditor"; import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema"; import { nestedListsToBlockNoteStructure } from "./html/util/nestedLists"; const acceptedMIMETypes = [ "blocknote/html", "text/html", "text/plain", ] as const; export const createPasteFromClipboardExtension = < BSchema extends BlockSchema, I extends InlineContentSchema, S extends StyleSchema >( editor: BlockNoteEditor ) => Extension.create<{ editor: BlockNoteEditor }, undefined>({ name: "pasteFromClipboard", addProseMirrorPlugins() { return [ new Plugin({ props: { handleDOMEvents: { paste(_view, event) { event.preventDefault(); let format: (typeof acceptedMIMETypes)[number] | null = null; for (const mimeType of acceptedMIMETypes) { if (event.clipboardData!.types.includes(mimeType)) { format = mimeType; break; } } if (format !== null) { let data = event.clipboardData!.getData(format); if (format === "text/html") { const htmlNode = nestedListsToBlockNoteStructure( data.trim() ); data = htmlNode.innerHTML; } editor._tiptapEditor.view.pasteHTML(data); } return true; }, }, }, }), ]; }, });