import {useMemo, useState} from 'react'; import {updateProjects} from 'sentry/actionCreators/pageFilters'; import {CompactSelect} from 'sentry/components/compactSelect'; import ProjectBadge from 'sentry/components/idBadge/projectBadge'; import {t} from 'sentry/locale'; import {Project} from 'sentry/types'; import useOrganization from 'sentry/utils/useOrganization'; import usePageFilters from 'sentry/utils/usePageFilters'; import useProjects from 'sentry/utils/useProjects'; import useRouter from 'sentry/utils/useRouter'; import {ALLOWED_PROJECT_IDS_FOR_ORG_SLUG} from 'sentry/views/starfish/allowedProjects'; export function StarfishProjectSelector() { const {projects, initiallyLoaded: projectsLoaded, fetchError} = useProjects(); const organization = useOrganization(); const router = useRouter(); const {selection} = usePageFilters(); const allowedProjectIDs: string[] = useMemo( () => ALLOWED_PROJECT_IDS_FOR_ORG_SLUG[organization.slug] ?? [], [organization.slug] ); const [selectedProjectId, setSelectedProjectId] = useState( selection.projects[0] ?? allowedProjectIDs[0] ); const currentProject = selection.projects[0] ?? allowedProjectIDs[0]; if (selectedProjectId !== currentProject) { setSelectedProjectId(currentProject); } if (!projectsLoaded) { return ( <CompactSelect disabled options={[{label: t('Loading\u2026'), value: 'loading'}]} defaultValue="loading" /> ); } if (fetchError) { throw new Error('Failed to fetch projects'); } const projectOptions = projects .filter(project => allowedProjectIDs.includes(project.id)) .map(project => ({ label: <ProjectOptionLabel project={project} />, value: project.id, })) .sort((projectA, projectB) => Number(projectA.value) - Number(projectB.value)); const handleProjectChange = option => updateProjects([parseInt(option.value, 10)], router, { storageNamespace: 'starfish', save: true, }); return ( <CompactSelect menuWidth={250} options={projectOptions} value={String(selectedProjectId)} onChange={handleProjectChange} /> ); } function ProjectOptionLabel({project}: {project: Project}) { return <ProjectBadge project={project} avatarSize={20} disableLink />; }