novita-anysite / src /components /model-selector.tsx
viktor-hu's picture
Update UI (#8)
25c879d verified
"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>
);
}