import React, { useState, useEffect, useRef } from "react"; interface DropdownProps { header: string; options: string[]; onSelect: (option: string) => void; search?: boolean; onClick?: () => void; onChange?: () => void; } const RegularDropDown: React.FC = ({ header, options, onSelect, search = true, onClick, onChange, }) => { const [isOpen, setIsOpen] = useState(false); const [selectedOption, setSelectedOption] = useState(null); const [searchTerm, setSearchTerm] = useState(""); // State to store search term const [filteredOptions, setFilteredOptions] = useState(options); // State for filtered options const dropdownRef = useRef(null); // Ref for the dropdown container // Reset selectedOption when the dropdown closes useEffect(() => { if (!isOpen) { setSelectedOption(null); setSearchTerm(""); // Clear the search term when the dropdown closes setFilteredOptions(options); // Reset filtered options when the dropdown closes } }, [isOpen, options]); // Reset selectedOption when the header prop changes useEffect(() => { setSelectedOption(null); setSearchTerm(""); // Reset search term if header changes setFilteredOptions(options); // Reset options if header changes }, [header, options]); // Close dropdown if clicked outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; document.addEventListener("click", handleClickOutside); return () => { document.removeEventListener("click", handleClickOutside); }; }, []); // Toggle the dropdown const toggleDropdown = () => { setIsOpen((prev) => !prev); }; // Handle option selection const handleOptionClick = (option: string) => { setSelectedOption(option); onSelect(option); setIsOpen(false); }; // Handle search input change const handleSearchChange = (event: React.ChangeEvent) => { const term = event.target.value; setSearchTerm(term); // Filter options based on the search term const filtered = options.filter((option) => option.toLowerCase().includes(term.toLowerCase()) ); setFilteredOptions(filtered); }; return (
{/* Dropdown Header */}
{selectedOption || header}
{/* Dropdown Options */} {isOpen && (
{/* Search Bar */} {search && (
)} {/* Filtered Options */} {filteredOptions.length > 0 ? ( filteredOptions.map((option, index) => (
handleOptionClick(option)} > {option}
)) ) : (
No options found
)}
)}
); }; export default RegularDropDown;