import React, { useRef, useState } from "react"; import { usePopper } from "react-popper"; import { Listbox } from "@headlessui/react"; import { Check, ChevronDown } from "lucide-react"; // hooks import { useDropdownKeyDown } from "../hooks/use-dropdown-key-down"; import useOutsideClickDetector from "../hooks/use-outside-click-detector"; // helpers import { cn } from "../../helpers"; // types import { ICustomSelectItemProps, ICustomSelectProps } from "./helper"; const CustomSelect = (props: ICustomSelectProps) => { const { customButtonClassName = "", buttonClassName = "", placement, children, className = "", customButton, disabled = false, input = false, label, maxHeight = "md", noChevron = false, onChange, optionsClassName = "", value, tabIndex, } = props; // states const [referenceElement, setReferenceElement] = useState(null); const [popperElement, setPopperElement] = useState(null); const [isOpen, setIsOpen] = useState(false); // refs const dropdownRef = useRef(null); const { styles, attributes } = usePopper(referenceElement, popperElement, { placement: placement ?? "bottom-start", }); const openDropdown = () => { setIsOpen(true); if (referenceElement) referenceElement.focus(); }; const closeDropdown = () => setIsOpen(false); const handleKeyDown = useDropdownKeyDown(openDropdown, closeDropdown, isOpen); useOutsideClickDetector(dropdownRef, closeDropdown); return ( <> {customButton ? ( ) : ( )} {isOpen && ( closeDropdown()} static>
{children}
)}
); }; const Option = (props: ICustomSelectItemProps) => { const { children, value, className } = props; return ( cn( "cursor-pointer select-none truncate rounded px-1 py-1.5 text-custom-text-200", { "bg-custom-background-80": active, }, className ) } > {({ selected }) => (
{children}
{selected && }
)}
); }; CustomSelect.Option = Option; export { CustomSelect };