"use client"; import { useState, useRef, useEffect, ReactNode } from "react"; import clsx from "clsx"; import styles from "@/styles/Dropdown.module.css"; interface DropdownItem { text: string; onClick: () => void; } interface DropdownProps { trigger?: string; triggerIcon?: string; disabled?: boolean; items?: DropdownItem[]; customContent?: ReactNode; align?: "left" | "right"; } export function Dropdown({ trigger, triggerIcon, disabled = false, items = [], customContent, align = "left", }: DropdownProps) { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setIsOpen(false); } } if (isOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen]); return (
{isOpen && (
{customContent ? (
{customContent}
) : ( items.map((item, index) => ( { e.preventDefault(); item.onClick(); setIsOpen(false); }} > {item.text} )) )}
)}
); }