Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | import React, { useState, useEffect, useRef } from "react"; type SelectOption = { label: string; value: string; }; interface CustomSelectProps { options: SelectOption[]; onChange?: (value: string) => void; } const CustomSelect = ({ options, onChange }: CustomSelectProps) => { const [isOpen, setIsOpen] = useState(false); const [selectedOption, setSelectedOption] = useState(options[0]); const selectRef = useRef<HTMLDivElement | null>(null); // Function to close the dropdown when a click occurs outside the component const handleClickOutside = (event: MouseEvent) => { if (selectRef.current && !selectRef.current.contains(event.target as Node)) { setIsOpen(false); } }; useEffect(() => { // Add a click event listener to the document document.addEventListener("click", handleClickOutside); // Clean up the event listener when the component unmounts return () => { document.removeEventListener("click", handleClickOutside); }; }, []); const toggleDropdown = () => { setIsOpen(!isOpen); }; const handleOptionClick = (option: SelectOption) => { setSelectedOption(option); toggleDropdown(); // Call onChange callback if provided if (onChange) { onChange(option.value); } }; return ( <div className="custom-select custom-select-2 flex-shrink-0 relative" ref={selectRef} > <div className={`select-selected whitespace-nowrap ${ isOpen ? "select-arrow-active" : "" }`} onClick={toggleDropdown} > {selectedOption.label} </div> <div className={`select-items ${isOpen ? "" : "select-hide"}`}> {options.slice(1).map((option, index) => ( <div key={index} onClick={() => handleOptionClick(option)} className={`select-item ${ selectedOption === option ? "same-as-selected" : "" }`} > {option.label} </div> ))} </div> </div> ); }; export default CustomSelect; |