import React, { useState, useRef, useEffect } from "react"; import { Model } from "../types"; interface ModelPickerProps { models: Model[]; selectedModel: string; onSelectModel: (modelId: string) => void; onManageModels: () => void; disabled?: boolean; } function ModelPicker({ models, selectedModel, onSelectModel, onManageModels, disabled = false, }: ModelPickerProps) { const [isOpen, setIsOpen] = useState(false); const [openUpward, setOpenUpward] = useState(false); const containerRef = useRef(null); const dropdownRef = useRef(null); // Close dropdown when clicking outside useEffect(() => { function handleClickOutside(event: MouseEvent) { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { setIsOpen(false); } } if (isOpen) { document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); } }, [isOpen]); // Close on escape useEffect(() => { function handleKeyDown(event: KeyboardEvent) { if (event.key === "Escape") { setIsOpen(false); } } if (isOpen) { document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); } }, [isOpen]); // Determine if dropdown should open upward useEffect(() => { if (isOpen && containerRef.current) { const rect = containerRef.current.getBoundingClientRect(); const spaceBelow = window.innerHeight - rect.bottom; const dropdownHeight = 320; // approximate max height setOpenUpward(spaceBelow < dropdownHeight && rect.top > spaceBelow); } }, [isOpen]); const selectedModelObj = models.find((m) => m.id === selectedModel); const displayName = selectedModelObj?.display_name || selectedModel; const displayWithSource = selectedModelObj?.source && selectedModelObj.source !== "custom" ? `${displayName} (${selectedModelObj.source})` : displayName; const handleSelect = (modelId: string) => { onSelectModel(modelId); setIsOpen(false); }; const handleManageModels = () => { setIsOpen(false); onManageModels(); }; return (
{isOpen && (
{models.map((model) => ( ))}
)}
); } export default ModelPicker;