import { FC, memo, useEffect, useRef } from 'react' import useDropdown from '../../../../shared/hooks/use-dropdown' import OLListGroup from '@/shared/components/ol/ol-list-group' import OLTooltip from '@/shared/components/ol/ol-tooltip' import OLOverlay from '@/shared/components/ol/ol-overlay' import OLPopover from '@/shared/components/ol/ol-popover' import { EditorView } from '@codemirror/view' import { emitToolbarEvent } from '../../extensions/toolbar/utils/analytics' import { useCodeMirrorViewContext } from '../codemirror-context' import classNames from 'classnames' export const ToolbarButtonMenu: FC< React.PropsWithChildren<{ id: string label: string icon: React.ReactNode orientation?: 'vertical' | 'horizontal' className?: string disabled?: boolean disablePopover?: boolean altCommand?: (view: EditorView) => void onToggle?: (isOpen: boolean) => void }> > = memo(function ButtonMenu({ icon, id, label, orientation = 'vertical', className, altCommand, onToggle, disabled, disablePopover, children, }) { const target = useRef(null) const { open, onToggle: handleToggle, ref } = useDropdown() const view = useCodeMirrorViewContext() useEffect(() => { if (!open) return const onResize = () => { handleToggle(false) } window.addEventListener('resize', onResize) return () => { window.removeEventListener('resize', onResize) } }, [open, handleToggle]) useEffect(() => { if (disablePopover && open) { handleToggle(false) } }, [open, disablePopover, handleToggle]) useEffect(() => { onToggle?.(open) }, [open, onToggle]) const button = ( ) const overlay = ( handleToggle(false)} > { handleToggle(false) }} > {children} ) if (!label) { return ( <> {button} {overlay} ) } return ( <> {overlay} ) })