projectSelectControl.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /**
  2. * MODIFIED FROM PROJECT QUOTA FORM
  3. */
  4. import {useMemo} from 'react';
  5. import type {ControlProps} from 'sentry/components/core/select';
  6. import {Select} from 'sentry/components/core/select';
  7. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  8. import {t} from 'sentry/locale';
  9. import type {Project} from 'sentry/types/project';
  10. import useProjects from 'sentry/utils/useProjects';
  11. type Props = {
  12. disabled: boolean;
  13. filteredIdList: string[];
  14. onChange: ControlProps['onChange'];
  15. value: string; // project ID
  16. };
  17. function ProjectSelectControl({
  18. disabled,
  19. onChange,
  20. value: valueProp,
  21. filteredIdList = [],
  22. }: Props) {
  23. const {projects} = useProjects();
  24. const options = useMemo(() => {
  25. const myProjects: Project[] = [];
  26. const allProjects: Project[] = [];
  27. projects.forEach(project => {
  28. if (filteredIdList.indexOf(project.id) < 0) {
  29. project.isMember ? myProjects.push(project) : allProjects.push(project);
  30. }
  31. });
  32. return [
  33. {
  34. label: t('My Projects'),
  35. options: myProjects.map(p => ({
  36. value: p.id,
  37. textValue: p.slug,
  38. label: <ProjectBadge project={p} avatarSize={20} disableLink />,
  39. project: p,
  40. })),
  41. },
  42. {
  43. label: t('All Projects'),
  44. options: allProjects.map(p => ({
  45. value: p.id,
  46. textValue: p.slug,
  47. label: <ProjectBadge project={p} avatarSize={20} disableLink />,
  48. project: p,
  49. })),
  50. },
  51. ];
  52. }, [projects, filteredIdList]);
  53. return (
  54. <Select
  55. placeholder={t('Select a project to continue')}
  56. name="projectSlug"
  57. disabled={disabled}
  58. options={options}
  59. value={valueProp}
  60. onChange={onChange}
  61. maxMenuWidth={250}
  62. />
  63. );
  64. }
  65. export default ProjectSelectControl;