import { blockHasType, BlockSchema, editorHasBlockWithType, InlineContentSchema, StyleSchema, } from "@blocknote/core"; import { ChangeEvent, KeyboardEvent, useCallback, useEffect, useState, } from "react"; import { RiInputField } from "react-icons/ri"; import { useComponentsContext } from "../../../editor/ComponentsContext.js"; import { useBlockNoteEditor } from "../../../hooks/useBlockNoteEditor.js"; import { useEditorState } from "../../../hooks/useEditorState.js"; import { useDictionary } from "../../../i18n/dictionary.js"; export const FileCaptionButton = () => { const dict = useDictionary(); const Components = useComponentsContext()!; const editor = useBlockNoteEditor< BlockSchema, InlineContentSchema, StyleSchema >(); const block = useEditorState({ editor, selector: ({ editor }) => { if (!editor.isEditable) { return undefined; } const selectedBlocks = editor.getSelection()?.blocks || [ editor.getTextCursorPosition().block, ]; if (selectedBlocks.length !== 1) { return undefined; } const block = selectedBlocks[0]; if ( !blockHasType(block, editor, block.type, { url: "string", caption: "string", }) ) { return undefined; } return block; }, }); const [currentEditingCaption, setCurrentEditingCaption] = useState(); useEffect(() => { if (block === undefined) { return; } setCurrentEditingCaption(block.props.caption); }, [block]); const handleChange = useCallback( (event: ChangeEvent) => setCurrentEditingCaption(event.currentTarget.value), [], ); const handleEnter = useCallback( (event: KeyboardEvent) => { if ( block !== undefined && editorHasBlockWithType(editor, block.type, { caption: "string", }) && event.key === "Enter" && !event.nativeEvent.isComposing ) { event.preventDefault(); editor.updateBlock(block.id, { props: { caption: currentEditingCaption, }, }); } }, [block, currentEditingCaption, editor], ); if (block === undefined) { return null; } return ( } /> } value={currentEditingCaption || ""} autoFocus={true} placeholder={dict.formatting_toolbar.file_caption.input_placeholder} onKeyDown={handleEnter} onChange={handleChange} /> ); };