index.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import {useRef} from 'react';
  2. import styled from '@emotion/styled';
  3. import {DateNavigator} from 'sentry/components/checkInTimeline/dateNavigator';
  4. import {
  5. GridLineLabels,
  6. GridLineOverlay,
  7. } from 'sentry/components/checkInTimeline/gridLines';
  8. import {useDateNavigation} from 'sentry/components/checkInTimeline/hooks/useDateNavigation';
  9. import {useTimeWindowConfig} from 'sentry/components/checkInTimeline/hooks/useTimeWindowConfig';
  10. import Panel from 'sentry/components/panels/panel';
  11. import {Sticky} from 'sentry/components/sticky';
  12. import {space} from 'sentry/styles/space';
  13. import {useDebouncedValue} from 'sentry/utils/useDebouncedValue';
  14. import {useDimensions} from 'sentry/utils/useDimensions';
  15. import type {UptimeRule} from 'sentry/views/alerts/rules/uptime/types';
  16. import {OverviewRow} from './overviewRow';
  17. interface Props {
  18. uptimeRules: UptimeRule[];
  19. }
  20. export function OverviewTimeline({uptimeRules}: Props) {
  21. const elementRef = useRef<HTMLDivElement>(null);
  22. const {width: containerWidth} = useDimensions<HTMLDivElement>({elementRef});
  23. const timelineWidth = useDebouncedValue(containerWidth, 500);
  24. const timeWindowConfig = useTimeWindowConfig({timelineWidth});
  25. const dateNavigation = useDateNavigation();
  26. return (
  27. <MonitorListPanel role="region">
  28. <TimelineWidthTracker ref={elementRef} />
  29. <Header>
  30. <HeaderControlsLeft>
  31. <DateNavigator
  32. dateNavigation={dateNavigation}
  33. direction="back"
  34. size="xs"
  35. borderless
  36. />
  37. </HeaderControlsLeft>
  38. <AlignedGridLineLabels timeWindowConfig={timeWindowConfig} />
  39. <HeaderControlsRight>
  40. <DateNavigator
  41. dateNavigation={dateNavigation}
  42. direction="forward"
  43. size="xs"
  44. borderless
  45. />
  46. </HeaderControlsRight>
  47. </Header>
  48. <AlignedGridLineOverlay
  49. stickyCursor
  50. allowZoom
  51. showCursor
  52. timeWindowConfig={timeWindowConfig}
  53. />
  54. <UptimeAlertRow>
  55. {uptimeRules.map(uptimeRule => (
  56. <OverviewRow
  57. key={uptimeRule.id}
  58. timeWindowConfig={timeWindowConfig}
  59. uptimeRule={uptimeRule}
  60. />
  61. ))}
  62. </UptimeAlertRow>
  63. </MonitorListPanel>
  64. );
  65. }
  66. const Header = styled(Sticky)`
  67. display: grid;
  68. grid-column: 1/-1;
  69. grid-template-columns: subgrid;
  70. z-index: 1;
  71. background: ${p => p.theme.background};
  72. border-top-left-radius: ${p => p.theme.borderRadius};
  73. border-top-right-radius: ${p => p.theme.borderRadius};
  74. box-shadow: 0 1px ${p => p.theme.translucentBorder};
  75. &[data-stuck] {
  76. border-radius: 0;
  77. border-left: 1px solid ${p => p.theme.border};
  78. border-right: 1px solid ${p => p.theme.border};
  79. margin: 0 -1px;
  80. }
  81. `;
  82. const TimelineWidthTracker = styled('div')`
  83. position: absolute;
  84. width: 100%;
  85. grid-row: 1;
  86. grid-column: 2/-1;
  87. `;
  88. const AlignedGridLineOverlay = styled(GridLineOverlay)`
  89. grid-row: 1;
  90. grid-column: 2/-1;
  91. `;
  92. const AlignedGridLineLabels = styled(GridLineLabels)`
  93. grid-row: 1;
  94. grid-column: 2/-1;
  95. `;
  96. const MonitorListPanel = styled(Panel)`
  97. display: grid;
  98. grid-template-columns: 350px 1fr max-content;
  99. `;
  100. const UptimeAlertRow = styled('ul')`
  101. display: grid;
  102. grid-template-columns: subgrid;
  103. grid-column: 1 / -1;
  104. list-style: none;
  105. padding: 0;
  106. margin: 0;
  107. `;
  108. const HeaderControlsLeft = styled('div')`
  109. grid-column: 1;
  110. display: flex;
  111. justify-content: flex-end;
  112. padding: ${space(1.5)} ${space(2)};
  113. `;
  114. const HeaderControlsRight = styled('div')`
  115. grid-row: 1;
  116. grid-column: -1;
  117. padding: ${space(1.5)} ${space(2)};
  118. `;