'use client'; import React, { useEffect, useState, useMemo } from 'react'; import { FormControl, Select, MenuItem, useTheme, ListSubheader, Box, IconButton, Tooltip } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { useAtom, useAtomValue } from 'jotai/index'; import { modelConfigListAtom, selectedModelInfoAtom } from '@/lib/store'; import axios from 'axios'; import SmartToyIcon from '@mui/icons-material/SmartToy'; import { getModelIcon } from '@/lib/util/modelIcon'; export default function ModelSelect({ size = 'small', minWidth = 50, projectId, minHeight = 36, required = false, onError }) { const theme = useTheme(); const { t } = useTranslation(); const models = useAtomValue(modelConfigListAtom); const [selectedModelInfo, setSelectedModelInfo] = useAtom(selectedModelInfoAtom); const [selectedModel, setSelectedModel] = useState(() => { if (selectedModelInfo && selectedModelInfo.id) { return selectedModelInfo.id; } return ''; }); const [error, setError] = useState(false); const [isHovered, setIsHovered] = useState(false); const [isOpen, setIsOpen] = useState(false); const handleModelChange = event => { if (!event || !event.target) return; const newModelId = event.target.value; if (error) { setError(false); if (onError) onError(false); } if (!newModelId) { setSelectedModel(''); setSelectedModelInfo(null); updateDefaultModel(null); } else { const selectedModelObj = models.find(model => model.id === newModelId); if (selectedModelObj) { setSelectedModel(newModelId); setSelectedModelInfo(selectedModelObj); updateDefaultModel(newModelId); } else { setSelectedModel(newModelId); setSelectedModelInfo({ id: newModelId }); } } setTimeout(() => { setIsHovered(false); setIsOpen(false); }, 200); }; const updateDefaultModel = async id => { const res = await axios.put(`/api/projects/${projectId}`, { projectId, defaultModelConfigId: id }); if (res.status === 200) { console.log('更新成功'); } }; const validateModel = () => { if (required && (!selectedModel || selectedModel === '')) { setError(true); if (onError) onError(true); return false; } return true; }; useEffect(() => { if (selectedModelInfo && selectedModelInfo.id) { setSelectedModel(selectedModelInfo.id); } else { setSelectedModel(''); } }, [selectedModelInfo]); useEffect(() => { if (required) { validateModel(); } }, [required]); const renderSelectedValue = value => { if (!value) { return ( {t('models.unselectedModel', t('playground.selectModelFirst'))} ); } const selectedModelObj = models.find(model => model.id === value); if (!selectedModelObj) return null; return ( { e.target.src = '/imgs/models/default.svg'; }} /> {selectedModelObj.modelName} ); }; const currentModelIcon = useMemo(() => { const selectedModelObj = models.find(model => model.id === selectedModel); return selectedModelObj ? getModelIcon(selectedModelObj.modelName, selectedModelObj.modelId) : null; }, [selectedModel, models]); const shouldShowFullSelect = isHovered || isOpen; return ( setIsHovered(true)} onMouseLeave={() => { setIsHovered(false); if (!isOpen) { setIsOpen(false); } }} sx={{ position: 'relative', display: 'flex', alignItems: 'center' }} > {!shouldShowFullSelect && ( m.id === selectedModel)?.modelName : t('playground.selectModelFirst', '请先选择模型') } placement="bottom" > {currentModelIcon ? ( { e.target.src = '/imgs/models/default.svg'; }} /> ) : ( )} )} ); }