import { autoUpdate, flip, FloatingPortal, offset, Placement, useFloating, } from "@floating-ui/react-dom-interactions"; import { Menu } from "@headlessui/react"; import clsx from "clsx"; import { motion } from "framer-motion"; import * as React from "react"; import { transformOriginByPlacement } from "utils/constants"; import { stopPropagation } from "utils/stop-propagation"; const MotionMenuItems = motion(Menu.Items); export interface DropdownProps { trigger?: React.ReactNode; children?: React.ReactNode; className?: string; placement?: Placement; } const Dropdown: React.VoidFunctionComponent = ({ children, className, trigger, placement: preferredPlacement, }) => { const { reference, floating, x, y, strategy, placement, refs, update } = useFloating({ strategy: "fixed", placement: preferredPlacement, middleware: [offset(5), flip()], }); const animationOrigin = transformOriginByPlacement[placement]; React.useEffect(() => { if (!refs.reference.current || !refs.floating.current) { return; } // Only call this when the floating element is rendered return autoUpdate(refs.reference.current, refs.floating.current, update); }, [refs.reference, refs.floating, update]); return ( {({ open }) => ( <> {trigger} {open ? ( {children} ) : null} )} ); }; export const DropdownItem: React.VoidFunctionComponent<{ icon?: React.ComponentType<{ className?: string }>; label?: React.ReactNode; disabled?: boolean; onClick?: () => void; }> = ({ icon: Icon, label, onClick, disabled }) => { return ( {({ active }) => ( )} ); }; export default Dropdown;