replayDiffContent.tsx 2.2 KB

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