import { BubbleMenuPlugin, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu' import React, { useEffect, useState } from 'react' import { useCurrentEditor } from './Context.js' type Optional = Pick, K> & Omit; export type BubbleMenuProps = Omit, 'element'> & { className?: string; children: React.ReactNode; updateDelay?: number; }; export const BubbleMenu = (props: BubbleMenuProps) => { const [element, setElement] = useState(null) const { editor: currentEditor } = useCurrentEditor() useEffect(() => { if (!element) { return } if (props.editor?.isDestroyed || currentEditor?.isDestroyed) { return } const { pluginKey = 'bubbleMenu', editor, tippyOptions = {}, updateDelay, shouldShow = null, } = props const menuEditor = editor || currentEditor if (!menuEditor) { console.warn('BubbleMenu component is not rendered inside of an editor component or does not have editor prop.') return } const plugin = BubbleMenuPlugin({ updateDelay, editor: menuEditor, element, pluginKey, shouldShow, tippyOptions, }) menuEditor.registerPlugin(plugin) return () => menuEditor.unregisterPlugin(pluginKey) }, [props.editor, currentEditor, element]) return (
{props.children}
) }