import { FC, HTMLProps, PropsWithChildren, useEffect, useRef, useState, } from 'react' import Icon from '../../../../shared/components/icon' import { Overlay, Popover } from 'react-bootstrap' import { useTranslation } from 'react-i18next' import { EditorView } from '@codemirror/view' import { PastedContent } from '../../extensions/visual/pasted-content' import useEventListener from '../../../../shared/hooks/use-event-listener' import SplitTestBadge from '../../../../shared/components/split-test-badge' import { useSplitTestContext } from '../../../../shared/context/split-test-context' const isMac = /Mac/.test(window.navigator?.platform) export const PastedContentMenu: FC<{ insertPastedContent: ( view: EditorView, pastedContent: PastedContent, formatted: boolean ) => void pastedContent: PastedContent view: EditorView formatted: boolean }> = ({ view, insertPastedContent, pastedContent, formatted }) => { const [menuOpen, setMenuOpen] = useState(false) const toggleButtonRef = useRef(null) const { t } = useTranslation() const { splitTestInfo } = useSplitTestContext() const feedbackURL = splitTestInfo['paste-html']?.badgeInfo?.url // record whether the Shift key is currently down, for use in the `paste` event handler const shiftRef = useRef(false) useEventListener('keydown', (event: KeyboardEvent) => { shiftRef.current = event.shiftKey }) useEffect(() => { if (menuOpen) { const abortController = new AbortController() view.dom.addEventListener( 'paste', event => { event.preventDefault() event.stopPropagation() insertPastedContent(view, pastedContent, !shiftRef.current) setMenuOpen(false) }, { signal: abortController.signal, capture: true } ) return () => { abortController.abort() } } }, [view, menuOpen, pastedContent, insertPastedContent]) // TODO: keyboard navigation return ( <> {menuOpen && ( setMenuOpen(false)} animation={false} container={view.scrollDOM} containerPadding={0} placement="bottom" rootClose target={toggleButtonRef.current ?? undefined} > )} ) } const MenuItem = ({ children, ...buttonProps }: PropsWithChildren>) => ( )