@blocknote/core
Version:
A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.
56 lines (50 loc) • 1.56 kB
text/typescript
import { Extension } from "@tiptap/core";
import { Plugin } from "prosemirror-state";
import type { BlockNoteEditor } from "../../../editor/BlockNoteEditor.js";
import {
BlockSchema,
InlineContentSchema,
StyleSchema,
} from "../../../schema/index.js";
import { acceptedMIMETypes } from "./acceptedMIMETypes.js";
import { handleFileInsertion } from "./handleFileInsertion.js";
export const createDropFileExtension = <
BSchema extends BlockSchema,
I extends InlineContentSchema,
S extends StyleSchema,
>(
editor: BlockNoteEditor<BSchema, I, S>,
) =>
Extension.create<{ editor: BlockNoteEditor<BSchema, I, S> }, undefined>({
name: "dropFile",
addProseMirrorPlugins() {
return [
new Plugin({
props: {
handleDOMEvents: {
drop(_view, event) {
if (!editor.isEditable) {
return;
}
let format: (typeof acceptedMIMETypes)[number] | null = null;
for (const mimeType of acceptedMIMETypes) {
if (event.dataTransfer!.types.includes(mimeType)) {
format = mimeType;
break;
}
}
if (format === null) {
return true;
}
if (format === "Files") {
handleFileInsertion(event, editor);
return true;
}
return false;
},
},
},
}),
];
},
});