import React from 'react'; import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Icon } from "@/components/icon/Icon"; import { useProjectsStore } from '@/stores/useProjectsStore'; import { isVSCodeRuntime } from '@/lib/desktop'; import { cn } from '@/lib/utils'; import { useI18n } from '@/lib/i18n'; const formatProjectLabel = (label: string): string => label.trim(); export const SettingsProjectSelector: React.FC<{ className?: string }> = ({ className }) => { const { t } = useI18n(); const projects = useProjectsStore((state) => state.projects); const activeProjectId = useProjectsStore((state) => state.activeProjectId); const setActiveProject = useProjectsStore((state) => state.setActiveProject); const isVSCode = React.useMemo(() => isVSCodeRuntime(), []); const sortedProjects = React.useMemo(() => { return [...projects].sort((a, b) => (a.label || a.path).localeCompare(b.label || b.path)); }, [projects]); const activeProject = React.useMemo(() => { if (sortedProjects.length === 0) { return null; } return sortedProjects.find((p) => p.id === activeProjectId) ?? sortedProjects[0]; }, [activeProjectId, sortedProjects]); if (isVSCode || sortedProjects.length === 0) { return null; } const rawLabel = activeProject?.label && activeProject.label.trim().length > 0 ? activeProject.label : (activeProject?.path.split('/').filter(Boolean).pop() || activeProject?.path || t('settings.shared.projectSelector.fallbackProject')); const label = formatProjectLabel(rawLabel); return (
{ if (!value) return; setActiveProject(value); }} > {sortedProjects.map((project) => { const raw = project.label?.trim() ? project.label.trim() : (project.path.split('/').filter(Boolean).pop() || project.path); const itemLabel = formatProjectLabel(raw); return ( {itemLabel} ); })}
); };