import React, { FunctionComponent, ReactNode, useState, useRef, useEffect } from "react"; import { ChevronDown } from "react-feather"; import { createPortal } from "react-dom"; export interface DropdownProps { dropdownButtonText: string | ReactNode; children: React.ReactNode; classNameRoot?: string; className?: string; classNameMenu?: string; classNameShared?: string; disabled?: boolean; menuPortalTarget?: HTMLElement; } export const Dropdown: FunctionComponent = ({ dropdownButtonText, children, classNameRoot, className, classNameMenu, classNameShared, disabled, menuPortalTarget, ...props }) => { const [isOpen, setIsOpen] = useState(false); const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 }); const addonStylesShared = classNameShared ? ` ${classNameShared}` : ""; const buttonRef = useRef(null); useEffect(() => { if (isOpen && buttonRef.current && menuPortalTarget) { const rect = buttonRef.current.getBoundingClientRect(); const scrollTop = window.scrollY || document.documentElement.scrollTop; const scrollLeft = window.scrollX || document.documentElement.scrollLeft; setMenuPosition({ top: rect.bottom + scrollTop, left: rect.left + scrollLeft }); } }, [isOpen, menuPortalTarget]); const renderDropdownContent = () => { const content = (
setIsOpen(false)} style={menuPortalTarget ? { position: "absolute", zIndex: 9999, top: menuPosition.top, left: menuPosition.left, maxWidth: buttonRef.current?.offsetWidth } : undefined} className={`rounded bg-white border border-gray-300 py-2 shadow-lg${addonStylesShared}${ classNameMenu ? ` ${classNameMenu}` : "" }`} > {children}
); if (menuPortalTarget && typeof document !== "undefined") { return createPortal(content, menuPortalTarget); } return content; }; return (
{isOpen && ( <>
); }; interface DropdownItemProps { children?: React.ReactNode; onClick?: () => void; className?: string; } export const DropdownItem: FunctionComponent = ({ className, children, ...props }) => { return (
{children}
); };