import { Menu, Transition } from "@headlessui/react"; import { Fragment, useState } from "react"; import { HiEllipsisHorizontal, HiMiniPlus } from "react-icons/hi2"; import { twMerge } from "tailwind-merge"; interface Item { key: string; value: string; selected: boolean; leftIcon?: React.ReactNode; } interface Group { key: string; label: string; icon: React.ReactNode; items: Item[]; } interface CheckboxDropdownProps { children: React.ReactNode; items?: Item[]; groups?: Group[]; createNewItemLabel?: string; menuSpacing?: "sm" | "md" | "lg"; position?: "left" | "right"; handleSelect: ( groupKey: string | null, item: { key: string; value: string }, ) => void; handleEdit?: (key: string) => void; handleCreate?: () => void; asChild?: boolean; } export default function CheckboxDropdown({ children, items, groups, createNewItemLabel = "Create new", menuSpacing = "sm", position = "left", handleSelect, handleEdit, handleCreate, asChild = true, }: CheckboxDropdownProps) { const [selectedGroup, setSelectedGroup] = useState(null); const menuSpacingClass = { sm: "top-[26px]", md: "top-[32px]", lg: "top-[38px]", }; const renderMenuItems = (items: Item[], groupKey: string | null) => ( <> {items.length > 0 ? ( items.map((item) => (
{ e.preventDefault(); handleSelect(groupKey, { key: item.key, value: item.value }); }} > event.stopPropagation()} onChange={() => handleSelect(groupKey, { key: item.key, value: item.value }) } checked={item.selected} /> {item.leftIcon && ( {item.leftIcon} )} {handleEdit && ( )}
)) ) : ( !handleCreate && (
No items
) )} {handleCreate && ( )} ); return ( <> {children} setSelectedGroup(null)} >
{!selectedGroup ? ( <> {items && renderMenuItems(items, null)} {groups?.map((group) => (
{ e.preventDefault(); setSelectedGroup(group.key); }} > {group.icon} {group.label}
))} ) : ( <> {groups?.find((g) => g.key === selectedGroup)?.items && renderMenuItems( groups.find((g) => g.key === selectedGroup)?.items || [], selectedGroup, )} )}
); }