|
import { Transition } from '@headlessui/react'; |
|
import { Link } from '@inertiajs/react'; |
|
import { createContext, useContext, useState } from 'react'; |
|
|
|
const DropDownContext = createContext(); |
|
|
|
const Dropdown = ({ children }) => { |
|
const [open, setOpen] = useState(false); |
|
|
|
const toggleOpen = () => { |
|
setOpen((previousState) => !previousState); |
|
}; |
|
|
|
return ( |
|
<DropDownContext.Provider value={{ open, setOpen, toggleOpen }}> |
|
<div className="relative">{children}</div> |
|
</DropDownContext.Provider> |
|
); |
|
}; |
|
|
|
const Trigger = ({ children }) => { |
|
const { open, setOpen, toggleOpen } = useContext(DropDownContext); |
|
|
|
return ( |
|
<> |
|
<div onClick={toggleOpen}>{children}</div> |
|
|
|
{open && ( |
|
<div |
|
className="fixed inset-0 z-40" |
|
onClick={() => setOpen(false)} |
|
></div> |
|
)} |
|
</> |
|
); |
|
}; |
|
|
|
const Content = ({ |
|
align = 'right', |
|
width = '48', |
|
contentClasses = 'py-1 bg-white', |
|
children, |
|
}) => { |
|
const { open, setOpen } = useContext(DropDownContext); |
|
|
|
let alignmentClasses = 'origin-top'; |
|
|
|
if (align === 'left') { |
|
alignmentClasses = 'ltr:origin-top-left rtl:origin-top-right start-0'; |
|
} else if (align === 'right') { |
|
alignmentClasses = 'ltr:origin-top-right rtl:origin-top-left end-0'; |
|
} |
|
|
|
let widthClasses = ''; |
|
|
|
if (width === '48') { |
|
widthClasses = 'w-48'; |
|
} |
|
|
|
return ( |
|
<> |
|
<Transition |
|
show={open} |
|
enter="transition ease-out duration-200" |
|
enterFrom="opacity-0 scale-95" |
|
enterTo="opacity-100 scale-100" |
|
leave="transition ease-in duration-75" |
|
leaveFrom="opacity-100 scale-100" |
|
leaveTo="opacity-0 scale-95" |
|
> |
|
<div |
|
className={`absolute z-50 mt-2 rounded-md shadow-lg ${alignmentClasses} ${widthClasses}`} |
|
onClick={() => setOpen(false)} |
|
> |
|
<div |
|
className={ |
|
`rounded-md ring-1 ring-black ring-opacity-5 ` + |
|
contentClasses |
|
} |
|
> |
|
{children} |
|
</div> |
|
</div> |
|
</Transition> |
|
</> |
|
); |
|
}; |
|
|
|
const DropdownLink = ({ className = '', children, ...props }) => { |
|
return ( |
|
<Link |
|
{...props} |
|
className={ |
|
'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 transition duration-150 ease-in-out hover:bg-gray-100 focus:bg-gray-100 focus:outline-none ' + |
|
className |
|
} |
|
> |
|
{children} |
|
</Link> |
|
); |
|
}; |
|
|
|
Dropdown.Trigger = Trigger; |
|
Dropdown.Content = Content; |
|
Dropdown.Link = DropdownLink; |
|
|
|
export default Dropdown; |
|
|