// Dropdown.tsx 'use client'; import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'; import { usePopper } from 'react-popper'; import type { ReactNode } from 'react'; type DropdownProps = { button?: ReactNode; // 👈 make optional children: ReactNode; btnClassName?: string; placement?: any; offset?: [number, number]; panelClassName?: string; closeOnItemClick?: boolean; }; const Dropdown = (props: DropdownProps, forwardedRef: any) => { const [visible, setVisible] = useState(false); const referenceRef = useRef(null); const popperRef = useRef(null); const { styles, attributes } = usePopper(referenceRef.current, popperRef.current, { placement: props.placement || 'bottom-end', modifiers: [{ name: 'offset', options: { offset: props.offset ?? [0, 8] } }], }); useEffect(() => { const onDoc = (e: MouseEvent) => { if (!referenceRef.current || !popperRef.current) return; if (referenceRef.current.contains(e.target as Node)) return; if (popperRef.current.contains(e.target as Node)) return; setVisible(false); }; document.addEventListener('mousedown', onDoc); return () => document.removeEventListener('mousedown', onDoc); }, []); useImperativeHandle(forwardedRef, () => ({ close: () => setVisible(false) })); const defaultButton = ( ); return ( <>
{visible && (
{props.children}
)}
); }; export default forwardRef(Dropdown);