navigation.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {Fragment} from 'react';
  2. import {NAV_GROUP_LABELS} from 'sentry/components/nav/constants';
  3. import {SecondaryNav} from 'sentry/components/nav/secondary';
  4. import {PrimaryNavGroup} from 'sentry/components/nav/types';
  5. import {t} from 'sentry/locale';
  6. import {useApiQuery} from 'sentry/utils/queryClient';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import type {DashboardListItem} from 'sentry/views/dashboards/types';
  9. type DashboardsNavigationProps = {
  10. children: React.ReactNode;
  11. };
  12. function DashboardsSecondaryNav({children}: DashboardsNavigationProps) {
  13. const organization = useOrganization();
  14. const baseUrl = `/organizations/${organization.slug}/dashboards`;
  15. const starredDashboards = useApiQuery<DashboardListItem[]>(
  16. [
  17. `/organizations/${organization.slug}/dashboards/`,
  18. {
  19. query: {
  20. filter: 'onlyFavorites',
  21. },
  22. },
  23. ],
  24. {
  25. staleTime: Infinity,
  26. }
  27. );
  28. return (
  29. <Fragment>
  30. <SecondaryNav group={PrimaryNavGroup.DASHBOARDS}>
  31. <SecondaryNav.Header>
  32. {NAV_GROUP_LABELS[PrimaryNavGroup.DASHBOARDS]}
  33. </SecondaryNav.Header>
  34. <SecondaryNav.Body>
  35. <SecondaryNav.Section>
  36. <SecondaryNav.Item to={`${baseUrl}/`} end>
  37. {t('All')}
  38. </SecondaryNav.Item>
  39. </SecondaryNav.Section>
  40. <SecondaryNav.Section title={t('Starred')}>
  41. {starredDashboards.data?.map(dashboard => (
  42. <SecondaryNav.Item
  43. key={dashboard.id}
  44. to={`/organizations/${organization.slug}/dashboard/${dashboard.id}/`}
  45. >
  46. {dashboard.title}
  47. </SecondaryNav.Item>
  48. )) ?? null}
  49. </SecondaryNav.Section>
  50. </SecondaryNav.Body>
  51. </SecondaryNav>
  52. {children}
  53. </Fragment>
  54. );
  55. }
  56. export default function DashboardsNavigation({children}: DashboardsNavigationProps) {
  57. const organization = useOrganization();
  58. const hasNavigationV2 = organization?.features.includes('navigation-sidebar-v2');
  59. if (!hasNavigationV2) {
  60. return children;
  61. }
  62. return <DashboardsSecondaryNav>{children}</DashboardsSecondaryNav>;
  63. }