'use client'; import React, { useEffect } from 'react'; import type { WithRequiredKey } from '@udecode/plate'; import { FloatingMedia as FloatingMediaPrimitive, FloatingMediaStore, useFloatingMediaValue, useImagePreviewValue, } from '@udecode/plate-media/react'; import { useEditorRef, useEditorSelector, useElement, useReadOnly, useRemoveNodeButton, useSelected, } from '@udecode/plate/react'; import { Link, Trash2Icon } from 'lucide-react'; import { Button, buttonVariants } from './button'; import { CaptionButton } from './caption'; import { inputVariants } from './input'; import { Popover, PopoverAnchor, PopoverContent } from './popover'; import { Separator } from './separator'; export interface MediaPopoverProps { children: React.ReactNode; plugin: WithRequiredKey; } export function MediaPopover({ children, plugin }: MediaPopoverProps) { const editor = useEditorRef(); const readOnly = useReadOnly(); const selected = useSelected(); const selectionCollapsed = useEditorSelector( (editor) => !editor.api.isExpanded(), [], ); const isImagePreviewOpen = useImagePreviewValue('isOpen', editor.id); const isOpen = !readOnly && selected && selectionCollapsed && !isImagePreviewOpen; const isEditing = useFloatingMediaValue('isEditing'); useEffect(() => { if (!isOpen && isEditing) { FloatingMediaStore.set('isEditing', false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isOpen]); const element = useElement(); const { props: buttonProps } = useRemoveNodeButton({ element }); if (readOnly) return <>{children}; return ( {children} e.preventDefault()} > {isEditing ? (
) : (
Edit link Caption
)}
); }