import * as React from 'react' import type { Editor } from '@tiptap/core' import { ColorHighlightPopover } from '@admin/components/custom/content-editor/tiptap-ui/color-highlight-popover' import { HeadingDropdownMenu } from '@admin/components/custom/content-editor/tiptap-ui/heading-dropdown-menu' import { LinkContent, LinkPopover } from '@admin/components/custom/content-editor/tiptap-ui/link-popover' import { ListDropdownMenu } from '@admin/components/custom/content-editor/tiptap-ui/list-dropdown-menu' import { MarkButton } from '@admin/components/custom/content-editor/tiptap-ui/mark-button' import { Separator } from '@admin/components/ui/separator' import { cn } from '@admin/utils/shared/cn' import { BubbleMenu } from '@tiptap/react/menus' const HIDDEN_SELECTION_TOOLBAR_TYPES = [ 'mediaGalleryPlaceholder', 'image', 'horizontalRule', 'codeBlock', 'code', 'inlineMath', 'rawContentBlock', 'link', 'table', 'tableCell', 'tableHeader' ] as const export function SelectionBubbleMenu({ editor }: { editor: Editor }) { const [hasOpenSelectionMenuChild, setHasOpenSelectionMenuChild] = React.useState(false) const hasOpenSelectionMenuChildRef = React.useRef(false) const setSelectionMenuChildOpen = React.useCallback((isOpen: boolean) => { hasOpenSelectionMenuChildRef.current = isOpen setHasOpenSelectionMenuChild(isOpen) }, []) const handleSelectionMenuChildOpenChange = React.useCallback( (isOpen: boolean) => { setSelectionMenuChildOpen(isOpen) }, [setSelectionMenuChildOpen] ) const handleSelectionMenuPointerDown = React.useCallback( (event: React.PointerEvent) => { const target = event.target if (!(target instanceof Element)) return const menuTrigger = target.closest('button[aria-haspopup], button[aria-expanded]') if (menuTrigger) { setSelectionMenuChildOpen(true) } }, [setSelectionMenuChildOpen] ) return ( <> currentEditor.isEditable && currentEditor.isActive('link') } options={{ placement: 'top', offset: 8, flip: { padding: 8 }, shift: { padding: 8 } }} >
currentEditor.isEditable && (from !== to || hasOpenSelectionMenuChild || hasOpenSelectionMenuChildRef.current) && HIDDEN_SELECTION_TOOLBAR_TYPES.every((type) => !currentEditor.isActive(type)) } options={{ placement: 'top', offset: 8, flip: { padding: 8 }, shift: { padding: 8 } }} >
) }