'use client'; import React, { useState } from 'react'; import { Box, Chip, Typography, useTheme, Menu, MenuItem, ListItemIcon, ListItemText, Paper, Tooltip } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { useRouter } from 'next/navigation'; import { useSetAtom } from 'jotai'; import { modelConfigListAtom, selectedModelInfoAtom } from '@/lib/store'; import { toast } from 'sonner'; import axios from 'axios'; // Icons import FolderIcon from '@mui/icons-material/Folder'; import CheckIcon from '@mui/icons-material/Check'; import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; // 样式 import * as styles from './contextBarStyles'; export default function ContextBar({ projects = [], currentProjectId, onMouseLeave }) { const { t } = useTranslation(); const theme = useTheme(); const router = useRouter(); // State const [projectMenuAnchor, setProjectMenuAnchor] = useState(null); // Jotai atoms const setConfigList = useSetAtom(modelConfigListAtom); const setSelectedModelInfo = useSetAtom(selectedModelInfoAtom); // Get current project const currentProject = projects.find(p => p.id === currentProjectId); // Handlers const handleProjectMenuOpen = event => { event.preventDefault(); setProjectMenuAnchor(event.currentTarget); }; const handleProjectMenuClose = () => { setProjectMenuAnchor(null); // 菜单关闭时,如果提供了 onMouseLeave 回调,则调用它 if (onMouseLeave) { onMouseLeave(); } }; const handleProjectChange = async newProjectId => { handleProjectMenuClose(); try { // Fetch model config for new project const response = await axios.get(`/api/projects/${newProjectId}/model-config`); setConfigList(response.data.data); if (response.data.defaultModelConfigId) { const defaultModel = response.data.data.find(item => item.id === response.data.defaultModelConfigId); setSelectedModelInfo(defaultModel || null); } else { setSelectedModelInfo(null); } // Navigate to the new project's text-split page router.push(`/projects/${newProjectId}/text-split`); } catch (error) { console.error('Error switching project:', error); toast.error(t('common.error', 'Error switching project')); } }; if (!currentProjectId || !currentProject) { return null; } return ( {/* Project Selector */} {t('common.project', 'Project')}: } label={ {currentProject?.name || t('projects.selectProject', 'Select Project')} } onClick={handleProjectMenuOpen} clickable variant="outlined" size="medium" sx={styles.getProjectChipStyles(theme)} aria-label={t('projects.selectProject', 'Select project')} aria-controls={projectMenuAnchor ? 'project-menu' : undefined} aria-haspopup="true" aria-expanded={Boolean(projectMenuAnchor)} /> {/* Project Menu */} {t('projects.allProjects', 'All Projects')} {projects.map((project, index) => ( handleProjectChange(project.id)} selected={project.id === currentProjectId} role="menuitem" sx={styles.getMenuItemStyles(theme)} > {project.id === currentProjectId ? ( ) : ( )} ))} ); }