'use client' import * as React from 'react' import type { Editor } from '@tiptap/core' import { getSelectedContentEditorMath } from '@admin/utils/editor/get-selected-content-editor-math' import { removeSelectedContentEditorMath } from '@admin/utils/editor/remove-selected-content-editor-math' import { updateSelectedContentEditorMath } from '@admin/utils/editor/update-selected-content-editor-math' import { cn } from '@admin/utils/shared/cn' import { BubbleMenu } from '@tiptap/react/menus' import { MathEditorControls } from './math-editor-controls' export function MathBubbleMenu({ editor }: { editor: Editor }) { const [selectedMath, setSelectedMath] = React.useState(() => getSelectedContentEditorMath(editor)) const syncSelectedMath = React.useCallback(() => { setSelectedMath(getSelectedContentEditorMath(editor)) }, [editor]) React.useEffect(() => { editor.on('selectionUpdate', syncSelectedMath) editor.on('transaction', syncSelectedMath) syncSelectedMath() return () => { editor.off('selectionUpdate', syncSelectedMath) editor.off('transaction', syncSelectedMath) } }, [editor, syncSelectedMath]) const applyMath = React.useCallback( (value: string) => { const didApply = updateSelectedContentEditorMath(editor, value, selectedMath) syncSelectedMath() return didApply }, [editor, selectedMath, syncSelectedMath] ) const removeMath = React.useCallback(() => { const didRemove = removeSelectedContentEditorMath(editor, selectedMath) syncSelectedMath() return didRemove }, [editor, selectedMath, syncSelectedMath]) return ( currentEditor.isEditable && Boolean(getSelectedContentEditorMath(currentEditor)) } options={{ flip: { padding: 8 }, offset: 8, placement: 'top', shift: { padding: 8 } }} >
) }