replayDiffChooser.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import styled from '@emotion/styled';
  2. import {ReplaySideBySideImageDiff} from 'sentry/components/replays/diff/replaySideBySideImageDiff';
  3. import {ReplaySliderDiff} from 'sentry/components/replays/diff/replaySliderDiff';
  4. import {ReplayTextDiff} from 'sentry/components/replays/diff/replayTextDiff';
  5. import {TabList, TabPanels, TabStateProvider} from 'sentry/components/tabs';
  6. import {t} from 'sentry/locale';
  7. import {trackAnalytics} from 'sentry/utils/analytics';
  8. import type ReplayReader from 'sentry/utils/replays/replayReader';
  9. import useOrganization from 'sentry/utils/useOrganization';
  10. interface Props {
  11. leftOffsetMs: number;
  12. replay: null | ReplayReader;
  13. rightOffsetMs: number;
  14. defaultTab?: DiffType;
  15. }
  16. export const enum DiffType {
  17. HTML = 'html',
  18. SLIDER = 'slider',
  19. VISUAL = 'visual',
  20. }
  21. export default function ReplayDiffChooser({
  22. defaultTab = DiffType.SLIDER,
  23. leftOffsetMs,
  24. replay,
  25. rightOffsetMs,
  26. }: Props) {
  27. const organization = useOrganization();
  28. const onTabChange = (tabKey: DiffType) => {
  29. trackAnalytics('replay.hydration-modal.tab-change', {tabKey, organization});
  30. };
  31. return (
  32. <Grid>
  33. <TabStateProvider<DiffType> defaultValue={defaultTab} onChange={onTabChange}>
  34. <TabList>
  35. <TabList.Item key={DiffType.SLIDER}>{t('Slider Diff')}</TabList.Item>
  36. <TabList.Item key={DiffType.VISUAL}>{t('Side By Side Diff')}</TabList.Item>
  37. <TabList.Item key={DiffType.HTML}>{t('Html Diff')}</TabList.Item>
  38. </TabList>
  39. <TabPanels>
  40. <TabPanels.Item key={DiffType.VISUAL}>
  41. <ReplaySideBySideImageDiff
  42. leftOffsetMs={leftOffsetMs}
  43. replay={replay}
  44. rightOffsetMs={rightOffsetMs}
  45. />
  46. </TabPanels.Item>
  47. <TabPanels.Item key={DiffType.HTML}>
  48. <ReplayTextDiff
  49. leftOffsetMs={leftOffsetMs}
  50. replay={replay}
  51. rightOffsetMs={rightOffsetMs}
  52. />
  53. </TabPanels.Item>
  54. <TabPanels.Item key={DiffType.SLIDER}>
  55. <ReplaySliderDiff
  56. leftOffsetMs={leftOffsetMs}
  57. replay={replay}
  58. rightOffsetMs={rightOffsetMs}
  59. />
  60. </TabPanels.Item>
  61. </TabPanels>
  62. </TabStateProvider>
  63. </Grid>
  64. );
  65. }
  66. const Grid = styled('div')`
  67. display: grid;
  68. grid-template-rows: max-content 1fr;
  69. height: 100%;
  70. `;