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 | import React, { useState, useEffect } from "react"; interface Option { label: string; value: string; } interface CustomSelectProps { options: Option[]; } const CustomSelect = ({ options }: CustomSelectProps) => { const [isOpen, setIsOpen] = useState(false); const [selectedOption, setSelectedOption] = useState<Option>(options[0]); const toggleDropdown = () => { setIsOpen(!isOpen); }; const handleOptionClick = (option: Option) => { setSelectedOption(option); toggleDropdown(); }; useEffect(() => { // closing modal while clicking outside function handleClickOutside(event: MouseEvent) { const target = event.target as HTMLElement; if (!target.closest(".dropdown-content")) { setIsOpen(false); } } if (isOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen]); return ( <div className="dropdown-content custom-select relative" style={{ width: "200px" }}> <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, -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; |