computer-scienceangular-roadmapbackend-roadmapblockchain-roadmapdba-roadmapdeveloper-roadmapdevops-roadmapfrontend-roadmapgo-roadmaphactoberfestjava-roadmapjavascript-roadmapnodejs-roadmappython-roadmapqa-roadmapreact-roadmaproadmapstudy-planvue-roadmapweb3-roadmap
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.0 KiB
69 lines
2.0 KiB
import { ChevronDown } from 'lucide-react'; |
|
import { useState, useRef, useEffect } from 'react'; |
|
import { cn } from '../../lib/classname'; |
|
import { |
|
difficultyLevels, |
|
type DifficultyLevel, |
|
} from '../GenerateCourse/AICourse'; |
|
|
|
type DifficultyDropdownProps = { |
|
value: DifficultyLevel; |
|
onChange: (value: DifficultyLevel) => void; |
|
}; |
|
|
|
export function DifficultyDropdown(props: DifficultyDropdownProps) { |
|
const { value, onChange } = props; |
|
|
|
const [isOpen, setIsOpen] = useState(false); |
|
const dropdownRef = useRef<HTMLDivElement>(null); |
|
|
|
useEffect(() => { |
|
function handleClickOutside(event: MouseEvent) { |
|
if ( |
|
dropdownRef.current && |
|
!dropdownRef.current.contains(event.target as Node) |
|
) { |
|
setIsOpen(false); |
|
} |
|
} |
|
|
|
document.addEventListener('mousedown', handleClickOutside); |
|
return () => document.removeEventListener('mousedown', handleClickOutside); |
|
}, []); |
|
|
|
return ( |
|
<div className="relative" ref={dropdownRef}> |
|
<button |
|
type="button" |
|
onClick={() => setIsOpen(!isOpen)} |
|
className={cn( |
|
'flex items-center gap-2 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 hover:bg-gray-200 hover:text-black', |
|
)} |
|
> |
|
<span className="capitalize">{value}</span> |
|
<ChevronDown size={16} className={cn(isOpen && 'rotate-180')} /> |
|
</button> |
|
|
|
{isOpen && ( |
|
<div className="absolute z-10 mt-1 flex flex-col overflow-hidden rounded-md border border-gray-200 bg-white shadow-lg"> |
|
{difficultyLevels.map((level) => ( |
|
<button |
|
key={level} |
|
type="button" |
|
onClick={() => { |
|
onChange(level); |
|
setIsOpen(false); |
|
}} |
|
className={cn( |
|
'px-5 py-2 text-left text-sm capitalize hover:bg-gray-100', |
|
value === level && 'bg-gray-200 font-medium hover:bg-gray-200', |
|
)} |
|
> |
|
{level} |
|
</button> |
|
))} |
|
</div> |
|
)} |
|
</div> |
|
); |
|
}
|
|
|