trayContent.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import {useContext, useState} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Button} from 'sentry/components/button';
  4. import EmptyMessage from 'sentry/components/emptyMessage';
  5. import {SplitPanelContext} from 'sentry/components/splitPanel';
  6. import {TabList, Tabs} from 'sentry/components/tabs';
  7. import {IconChevron, IconSearch} from 'sentry/icons';
  8. import {t} from 'sentry/locale';
  9. import {space} from 'sentry/styles/space';
  10. import {parseMRI} from 'sentry/utils/metrics/mri';
  11. import {CodeLocations} from 'sentry/views/ddm/codeLocations';
  12. import {useDDMContext} from 'sentry/views/ddm/context';
  13. import {TraceTable} from 'sentry/views/ddm/traceTable';
  14. enum Tab {
  15. SAMPLES = 'samples',
  16. CODE_LOCATIONS = 'codeLocations',
  17. }
  18. export function TrayContent() {
  19. const {selectedWidgetIndex, widgets} = useDDMContext();
  20. const [selectedTab, setSelectedTab] = useState(Tab.CODE_LOCATIONS);
  21. const {isMaximized, maximiseSize, resetSize} = useContext(SplitPanelContext);
  22. // the tray is minimized when the main content is maximized
  23. const trayIsMinimized = isMaximized;
  24. const selectedWidget = widgets[selectedWidgetIndex];
  25. return (
  26. <TrayWrapper>
  27. <Header>
  28. <Title>
  29. {(selectedWidget?.mri && parseMRI(selectedWidget.mri)?.name) ||
  30. t('Choose a metric to display data')}
  31. </Title>
  32. <ToggleButton
  33. size="xs"
  34. isMinimized={trayIsMinimized}
  35. icon={<IconChevron size="xs" />}
  36. onClick={trayIsMinimized ? resetSize : maximiseSize}
  37. aria-label={trayIsMinimized ? t('show') : t('hide')}
  38. />
  39. </Header>
  40. <Tabs value={selectedTab} onChange={setSelectedTab}>
  41. <StyledTabList>
  42. <TabList.Item key={Tab.CODE_LOCATIONS}>{t('Code Location')}</TabList.Item>
  43. <TabList.Item key={Tab.SAMPLES}>{t('Samples')}</TabList.Item>
  44. </StyledTabList>
  45. </Tabs>
  46. <ContentWrapper>
  47. {!selectedWidget?.mri ? (
  48. <CenterContent>
  49. <EmptyMessage
  50. style={{margin: 'auto'}}
  51. icon={<IconSearch size="xxl" />}
  52. title={t('Nothing to show!')}
  53. description={t('Choose a metric to display data.')}
  54. />
  55. </CenterContent>
  56. ) : selectedTab === Tab.SAMPLES ? (
  57. <TraceTable
  58. // Force re-render when selectedWidget changes so the mocked data updates
  59. // TODO: remove this when we have real data
  60. key={selectedWidget.mri}
  61. />
  62. ) : (
  63. <CodeLocations mri={selectedWidget.mri} />
  64. )}
  65. </ContentWrapper>
  66. </TrayWrapper>
  67. );
  68. }
  69. const TrayWrapper = styled('div')`
  70. height: 100%;
  71. background-color: ${p => p.theme.background};
  72. z-index: ${p => p.theme.zIndex.sidebar};
  73. display: grid;
  74. grid-template-rows: auto auto 1fr;
  75. `;
  76. const Header = styled('div')`
  77. display: flex;
  78. flex-direction: row;
  79. justify-content: space-between;
  80. align-items: center;
  81. padding: 0 ${space(4)};
  82. height: 32px;
  83. background-color: ${p => p.theme.backgroundSecondary};
  84. `;
  85. const Title = styled('div')`
  86. font-size: ${p => p.theme.fontSizeLarge};
  87. font-weight: bold;
  88. `;
  89. const ToggleButton = styled(Button)<{isMinimized}>`
  90. & svg {
  91. transform: rotate(${p => (p.isMinimized ? '0deg' : '180deg')});
  92. }
  93. `;
  94. const StyledTabList = styled(TabList)`
  95. padding: 0 ${space(4)};
  96. background-color: ${p => p.theme.backgroundSecondary};
  97. `;
  98. const ContentWrapper = styled('div')`
  99. position: relative;
  100. padding: ${space(2)} ${space(4)};
  101. overflow: auto;
  102. `;
  103. const CenterContent = styled('div')`
  104. display: flex;
  105. justify-content: center;
  106. align-items: center;
  107. height: 100%;
  108. `;