import Transition from '@app/components/Transition'; import useClickOutside from '@app/hooks/useClickOutside'; import { withProperties } from '@app/utils/typeHelpers'; import { ChevronDownIcon } from '@heroicons/react/solid'; import type { AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react'; import { useRef, useState } from 'react'; interface DropdownItemProps extends AnchorHTMLAttributes { buttonType?: 'primary' | 'ghost'; } const DropdownItem = ({ children, buttonType = 'primary', ...props }: DropdownItemProps) => { let styleClass = 'button-md text-white'; switch (buttonType) { case 'ghost': styleClass += ' bg-gray-700 hover:bg-gray-600 focus:border-gray-500 focus:text-white'; break; default: styleClass += ' bg-indigo-600 hover:bg-indigo-500 focus:border-indigo-700 focus:text-white'; } return ( {children} ); }; interface ButtonWithDropdownProps extends ButtonHTMLAttributes { text: React.ReactNode; dropdownIcon?: React.ReactNode; buttonType?: 'primary' | 'ghost'; } const ButtonWithDropdown = ({ text, children, dropdownIcon, className, buttonType = 'primary', ...props }: ButtonWithDropdownProps) => { const [isOpen, setIsOpen] = useState(false); const buttonRef = useRef(null); useClickOutside(buttonRef, () => setIsOpen(false)); const styleClasses = { mainButtonClasses: 'button-md text-white border', dropdownSideButtonClasses: 'button-md border', dropdownClasses: 'button-md', }; switch (buttonType) { case 'ghost': styleClasses.mainButtonClasses += ' bg-transparent border-gray-600 hover:border-gray-200 focus:border-gray-100 active:border-gray-100'; styleClasses.dropdownSideButtonClasses = styleClasses.mainButtonClasses; styleClasses.dropdownClasses += ' bg-gray-700'; break; default: styleClasses.mainButtonClasses += ' bg-indigo-600 border-indigo-600 hover:bg-indigo-500 hover:border-indigo-500 active:bg-indigo-700 active:border-indigo-700 focus:ring-blue'; styleClasses.dropdownSideButtonClasses += ' bg-indigo-700 border-indigo-600 hover:bg-indigo-500 active:bg-indigo-700 focus:ring-blue'; styleClasses.dropdownClasses += ' bg-indigo-600'; } return ( {children && (
{children}
)}
); }; export default withProperties(ButtonWithDropdown, { Item: DropdownItem });