replayTimeline.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import {useRef} from 'react';
  2. import styled from '@emotion/styled';
  3. import {Panel} from 'sentry/components/panels';
  4. import Placeholder from 'sentry/components/placeholder';
  5. import {
  6. MajorGridlines,
  7. MinorGridlines,
  8. } from 'sentry/components/replays/breadcrumbs/gridlines';
  9. import ReplayTimelineEvents from 'sentry/components/replays/breadcrumbs/replayTimelineEvents';
  10. import ReplayTimelineSpans from 'sentry/components/replays/breadcrumbs/replayTimelineSpans';
  11. import Stacked from 'sentry/components/replays/breadcrumbs/stacked';
  12. import {TimelineScrubber} from 'sentry/components/replays/player/scrubber';
  13. import useScrubberMouseTracking from 'sentry/components/replays/player/useScrubberMouseTracking';
  14. import {useReplayContext} from 'sentry/components/replays/replayContext';
  15. import {Resizeable} from 'sentry/components/replays/resizeable';
  16. type Props = {};
  17. function ReplayTimeline({}: Props) {
  18. const {replay} = useReplayContext();
  19. const elem = useRef<HTMLDivElement>(null);
  20. const mouseTrackingProps = useScrubberMouseTracking({elem});
  21. if (!replay) {
  22. return <Placeholder height="54px" bottomGutter={2} />;
  23. }
  24. const durationMs = replay.getDurationMs();
  25. const startTimestampMs = replay.getReplay().started_at.getTime();
  26. const userCrumbs = replay.getUserActionCrumbs();
  27. const networkSpans = replay.getNetworkSpans();
  28. return (
  29. <Panel ref={elem} {...mouseTrackingProps}>
  30. <Resizeable>
  31. {({width}) => (
  32. <Stacked>
  33. <MinorGridlines durationMs={durationMs} width={width} />
  34. <MajorGridlines durationMs={durationMs} width={width} />
  35. <TimelineScrubber />
  36. <UnderTimestamp paddingTop="36px">
  37. <ReplayTimelineSpans
  38. durationMs={durationMs}
  39. spans={networkSpans}
  40. startTimestampMs={startTimestampMs}
  41. />
  42. </UnderTimestamp>
  43. <UnderTimestamp paddingTop="26px">
  44. <ReplayTimelineEvents
  45. crumbs={userCrumbs}
  46. durationMs={durationMs}
  47. startTimestampMs={startTimestampMs}
  48. width={width}
  49. />
  50. </UnderTimestamp>
  51. </Stacked>
  52. )}
  53. </Resizeable>
  54. </Panel>
  55. );
  56. }
  57. const UnderTimestamp = styled('div')<{paddingTop: string}>`
  58. /* Weird size to put equal space above/below a <small> node that MajorGridlines emits */
  59. padding-top: ${p => p.paddingTop};
  60. `;
  61. export default ReplayTimeline;