1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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 type {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 />;
- }
|