'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';
}}
/>
) : (
)}
)}
);
}