import { DEFAULT_LINK_PROTOCOL, LinkToolbarExtension, VALID_LINK_PROTOCOLS, } from "@blocknote/core/extensions"; import { ChangeEvent, KeyboardEvent, useCallback, useEffect, useState, } from "react"; import { RiLink, RiText } from "react-icons/ri"; import { useComponentsContext } from "../../editor/ComponentsContext.js"; import { useExtension } from "../../hooks/useExtension.js"; import { useDictionary } from "../../i18n/dictionary.js"; import { LinkToolbarProps } from "./LinkToolbarProps.js"; const validateUrl = (url: string) => { for (const protocol of VALID_LINK_PROTOCOLS) { if (url.startsWith(protocol)) { return url; } } return `${DEFAULT_LINK_PROTOCOL}://${url}`; }; export const EditLinkMenuItems = ( props: Pick< LinkToolbarProps, "url" | "text" | "range" | "setToolbarOpen" | "setToolbarPositionFrozen" > & { showTextField?: boolean; }, ) => { const Components = useComponentsContext()!; const dict = useDictionary(); const { editLink } = useExtension(LinkToolbarExtension); const { url, text, showTextField } = props; const [currentUrl, setCurrentUrl] = useState(url); const [currentText, setCurrentText] = useState(text); useEffect(() => { setCurrentUrl(url); setCurrentText(text); }, [text, url]); const handleEnter = useCallback( (event: KeyboardEvent) => { if (event.key === "Enter" && !event.nativeEvent.isComposing) { event.preventDefault(); editLink(validateUrl(currentUrl), currentText, props.range.from); props.setToolbarOpen?.(false); props.setToolbarPositionFrozen?.(false); } }, [editLink, currentUrl, currentText, props], ); const handleUrlChange = useCallback( (event: ChangeEvent) => setCurrentUrl(event.currentTarget.value), [], ); const handleTextChange = useCallback( (event: ChangeEvent) => setCurrentText(event.currentTarget.value), [], ); const handleSubmit = useCallback(() => { editLink(validateUrl(currentUrl), currentText, props.range.from); props.setToolbarOpen?.(false); props.setToolbarPositionFrozen?.(false); }, [editLink, currentUrl, currentText, props]); return ( {/* // TODO: add labels? */} } autoFocus={true} placeholder={dict.link_toolbar.form.url_placeholder} value={currentUrl} onKeyDown={handleEnter} onChange={handleUrlChange} onSubmit={handleSubmit} /> {showTextField !== false && ( } placeholder={dict.link_toolbar.form.title_placeholder} value={currentText} onKeyDown={handleEnter} onChange={handleTextChange} onSubmit={handleSubmit} /> )} ); };