teamCrumb.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import debounce from 'lodash/debounce';
  2. import IdBadge from 'sentry/components/idBadge';
  3. import {DEFAULT_DEBOUNCE_DURATION} from 'sentry/constants';
  4. import type {RouteComponentProps} from 'sentry/types/legacyReactRouter';
  5. import recreateRoute from 'sentry/utils/recreateRoute';
  6. import {useNavigate} from 'sentry/utils/useNavigate';
  7. import {useParams} from 'sentry/utils/useParams';
  8. import {useTeams} from 'sentry/utils/useTeams';
  9. import BreadcrumbDropdown from './breadcrumbDropdown';
  10. import MenuItem from './menuItem';
  11. import {CrumbLink} from '.';
  12. type Props = RouteComponentProps<{teamId: string}, {}>;
  13. function TeamCrumb({routes, route, ...props}: Props) {
  14. const navigate = useNavigate();
  15. const {teams, onSearch, fetching} = useTeams();
  16. const params = useParams();
  17. const team = teams.find(({slug}) => slug === params.teamId);
  18. const hasMenu = teams.length > 1;
  19. const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  20. onSearch(e.target.value);
  21. };
  22. const debouncedHandleSearch = debounce(handleSearchChange, DEFAULT_DEBOUNCE_DURATION);
  23. if (!team) {
  24. return null;
  25. }
  26. const teamUrl = `/settings/${params.orgId}/teams/${team.slug}/`;
  27. return (
  28. <BreadcrumbDropdown
  29. name={
  30. <CrumbLink to={teamUrl}>
  31. <IdBadge avatarSize={18} team={team} />
  32. </CrumbLink>
  33. }
  34. onSelect={item => {
  35. navigate(
  36. recreateRoute('', {
  37. routes,
  38. params: {...params, teamId: item.value},
  39. })
  40. );
  41. }}
  42. hasMenu={hasMenu}
  43. route={route}
  44. items={teams.map((teamItem, index) => ({
  45. index,
  46. value: teamItem.slug,
  47. label: (
  48. <MenuItem>
  49. <IdBadge team={teamItem} />
  50. </MenuItem>
  51. ),
  52. }))}
  53. onChange={debouncedHandleSearch}
  54. busyItemsStillVisible={fetching}
  55. {...props}
  56. />
  57. );
  58. }
  59. export default TeamCrumb;