teamCrumb.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import {browserHistory, RouteComponentProps} from 'react-router';
  2. import debounce from 'lodash/debounce';
  3. import IdBadge from 'sentry/components/idBadge';
  4. import {DEFAULT_DEBOUNCE_DURATION} from 'sentry/constants';
  5. import recreateRoute from 'sentry/utils/recreateRoute';
  6. import useTeams from 'sentry/utils/useTeams';
  7. import BreadcrumbDropdown from 'sentry/views/settings/components/settingsBreadcrumb/breadcrumbDropdown';
  8. import MenuItem from 'sentry/views/settings/components/settingsBreadcrumb/menuItem';
  9. import {RouteWithName} from './types';
  10. import {CrumbLink} from '.';
  11. type Props = RouteComponentProps<{teamId: string}, {}> & {
  12. routes: RouteWithName[];
  13. route?: RouteWithName;
  14. };
  15. const TeamCrumb = ({params, routes, route, ...props}: Props) => {
  16. const {teams, onSearch, fetching} = useTeams();
  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. return (
  27. <BreadcrumbDropdown
  28. name={
  29. <CrumbLink
  30. to={recreateRoute(route, {
  31. routes,
  32. params: {...params, teamId: team.slug},
  33. })}
  34. >
  35. <IdBadge avatarSize={18} team={team} />
  36. </CrumbLink>
  37. }
  38. onSelect={item => {
  39. browserHistory.push(
  40. recreateRoute('', {
  41. routes,
  42. params: {...params, teamId: item.value},
  43. })
  44. );
  45. }}
  46. hasMenu={hasMenu}
  47. route={route}
  48. items={teams.map((teamItem, index) => ({
  49. index,
  50. value: teamItem.slug,
  51. label: (
  52. <MenuItem>
  53. <IdBadge team={teamItem} />
  54. </MenuItem>
  55. ),
  56. }))}
  57. onChange={debouncedHandleSearch}
  58. busyItemsStillVisible={fetching}
  59. {...props}
  60. />
  61. );
  62. };
  63. export default TeamCrumb;