UNPKG

@blocknote/core

Version:

A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.

81 lines (70 loc) 2.33 kB
import type { BlockNoteEditor } from "../../../../editor/BlockNoteEditor.js"; import { BlockFromConfig, BlockSchemaWithBlock, FileBlockConfig, } from "../../../../schema/index.js"; import { createAddFileButton } from "./createAddFileButton.js"; import { createFileNameWithIcon } from "./createFileNameWithIcon.js"; export const createFileBlockWrapper = ( block: BlockFromConfig<FileBlockConfig, any, any>, editor: BlockNoteEditor< BlockSchemaWithBlock<FileBlockConfig["type"], FileBlockConfig>, any, any >, element?: { dom: HTMLElement; destroy?: () => void }, buttonText?: string, buttonIcon?: HTMLElement, ) => { const wrapper = document.createElement("div"); wrapper.className = "bn-file-block-content-wrapper"; // Show the add file button if the file has not been uploaded yet. Change to // show a loader if a file upload for the block begins. if (block.props.url === "") { const addFileButton = createAddFileButton( block, editor, buttonText, buttonIcon, ); wrapper.appendChild(addFileButton.dom); const destroyUploadStartHandler = editor.onUploadStart((blockId) => { if (blockId === block.id) { wrapper.removeChild(addFileButton.dom); const loading = document.createElement("div"); loading.className = "bn-file-loading-preview"; loading.textContent = "Loading..."; wrapper.appendChild(loading); } }); return { dom: wrapper, destroy: () => { destroyUploadStartHandler(); addFileButton.destroy(); }, }; } const ret: { dom: HTMLElement; destroy?: () => void } = { dom: wrapper }; // Show the file preview, or the file name and icon. if (block.props.showPreview === false || !element) { // Show file name and icon. const fileNameWithIcon = createFileNameWithIcon(block); wrapper.appendChild(fileNameWithIcon.dom); ret.destroy = () => { fileNameWithIcon.destroy?.(); }; } else { // Show file preview. wrapper.appendChild(element.dom); } // Show the caption if there is one. if (block.props.caption) { const caption = document.createElement("p"); caption.className = "bn-file-caption"; caption.textContent = block.props.caption; wrapper.appendChild(caption); } return ret; };