replayDiffContent.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import ErrorBoundary from 'sentry/components/errorBoundary';
  2. import {EventDataSection} from 'sentry/components/events/eventDataSection';
  3. import Placeholder from 'sentry/components/placeholder';
  4. import {OpenReplayComparisonButton} from 'sentry/components/replays/breadcrumbs/openReplayComparisonButton';
  5. import {ReplaySliderDiff} from 'sentry/components/replays/diff/replaySliderDiff';
  6. import {ReplayGroupContextProvider} from 'sentry/components/replays/replayGroupContext';
  7. import {t} from 'sentry/locale';
  8. import type {Event} from 'sentry/types/event';
  9. import type {Group} from 'sentry/types/group';
  10. import {getReplayDiffOffsetsFromEvent} from 'sentry/utils/replays/getDiffTimestamps';
  11. import useReplayReader from 'sentry/utils/replays/hooks/useReplayReader';
  12. interface Props {
  13. event: Event;
  14. group: Group | undefined;
  15. orgSlug: string;
  16. replaySlug: string;
  17. }
  18. export default function ReplayDiffContent({event, group, orgSlug, replaySlug}: Props) {
  19. const replayContext = useReplayReader({
  20. orgSlug,
  21. replaySlug,
  22. });
  23. const {fetching, replay} = replayContext;
  24. if (fetching) {
  25. return <Placeholder />;
  26. }
  27. if (!replay) {
  28. return null;
  29. }
  30. const {leftOffsetMs, rightOffsetMs} = getReplayDiffOffsetsFromEvent(replay, event);
  31. return (
  32. <EventDataSection
  33. type="hydration-diff"
  34. title={t('Hydration Error Diff')}
  35. actions={
  36. <OpenReplayComparisonButton
  37. key="open-modal-button"
  38. leftOffsetMs={leftOffsetMs}
  39. replay={replay}
  40. rightOffsetMs={rightOffsetMs}
  41. surface="issue-details" // TODO: refactor once this component is used in more surfaces
  42. size="xs"
  43. >
  44. {t('Open Diff Viewer')}
  45. </OpenReplayComparisonButton>
  46. }
  47. >
  48. <ErrorBoundary mini>
  49. <ReplayGroupContextProvider groupId={group?.id} eventId={event.id}>
  50. <ReplaySliderDiff
  51. minHeight="355px"
  52. leftOffsetMs={leftOffsetMs}
  53. replay={replay}
  54. rightOffsetMs={rightOffsetMs}
  55. />
  56. </ReplayGroupContextProvider>
  57. </ErrorBoundary>
  58. </EventDataSection>
  59. );
  60. }