Spaces:
Running
Running
| "use client"; | |
| import { useState, useEffect, useRef } from "react"; | |
| import { MODEL_CONFIG_CODE_GENERATION } from "@/lib/constants"; | |
| import { useModel } from "@/lib/contexts/model-context"; | |
| import { ChevronDown } from "lucide-react"; | |
| export function ModelSelector() { | |
| const { selectedModelIndex, setSelectedModelIndex } = useModel(); | |
| const [isOpen, setIsOpen] = useState(false); | |
| const selectorRef = useRef<HTMLDivElement>(null); | |
| const handleSelect = (index: number) => { | |
| setSelectedModelIndex(index); | |
| setIsOpen(false); | |
| }; | |
| useEffect(() => { | |
| const handleClickOutside = (event: MouseEvent) => { | |
| if ( | |
| selectorRef.current && | |
| !selectorRef.current.contains(event.target as Node) | |
| ) { | |
| setIsOpen(false); | |
| } | |
| }; | |
| if (isOpen) { | |
| document.addEventListener("mousedown", handleClickOutside); | |
| } | |
| return () => { | |
| document.removeEventListener("mousedown", handleClickOutside); | |
| }; | |
| }, [isOpen]); | |
| return ( | |
| <div className="relative inline-block text-left" ref={selectorRef}> | |
| <div | |
| onClick={() => setIsOpen(!isOpen)} | |
| className={` | |
| cursor-pointer flex items-center justify-between gap-2 | |
| text-white/90 hover:text-white | |
| px-3 py-1.5 rounded-md | |
| border border-novita-gray/30 hover:border-novita-gray/60 | |
| bg-novita-gray/5 hover:bg-novita-gray/20 | |
| transition-all duration-200 ease-in-out | |
| ${isOpen ? "border-novita-gray/60 bg-novita-gray/20" : ""} | |
| `} | |
| > | |
| <span className="text-sm"> | |
| {MODEL_CONFIG_CODE_GENERATION[selectedModelIndex]?.id || | |
| "Select model"} | |
| </span> | |
| <ChevronDown | |
| className={`w-4 h-4 transition-transform duration-200 ${isOpen ? "transform rotate-180" : ""}`} | |
| /> | |
| </div> | |
| {isOpen && ( | |
| <div className="absolute z-40 mt-1 w-full origin-top-right rounded-md bg-novita-dark border border-novita-gray/20 shadow-lg"> | |
| <div className="py-1"> | |
| {MODEL_CONFIG_CODE_GENERATION.map((model, index) => ( | |
| <div | |
| key={model.id} | |
| onClick={() => handleSelect(index)} | |
| className={` | |
| px-4 py-2 text-xs cursor-pointer hover:bg-novita-gray/20 | |
| ${selectedModelIndex === index ? "text-white bg-novita-gray/40" : "text-white/70"} | |
| `} | |
| > | |
| {model.id} | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| )} | |
| </div> | |
| ); | |
| } | |