breadcrumbRow.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import type {CSSProperties, MouseEvent} from 'react';
  2. import {useCallback} from 'react';
  3. import classNames from 'classnames';
  4. import BreadcrumbItem from 'sentry/components/replays/breadcrumbs/breadcrumbItem';
  5. import {useReplayContext} from 'sentry/components/replays/replayContext';
  6. import type {Extraction} from 'sentry/utils/replays/extractDomNodes';
  7. import useCrumbHandlers from 'sentry/utils/replays/hooks/useCrumbHandlers';
  8. import type {ReplayFrame} from 'sentry/utils/replays/types';
  9. import type {ReplayTraceRow} from 'sentry/views/replays/detail/perfTable/useReplayPerfData';
  10. interface Props {
  11. extraction: Extraction | undefined;
  12. frame: ReplayFrame;
  13. index: number;
  14. onClick: ReturnType<typeof useCrumbHandlers>['onClickTimestamp'];
  15. onDimensionChange: (index: number) => void;
  16. onInspectorExpanded: (
  17. index: number,
  18. path: string,
  19. expandedState: Record<string, boolean>,
  20. event: MouseEvent<HTMLDivElement>
  21. ) => void;
  22. startTimestampMs: number;
  23. style: CSSProperties;
  24. traces: ReplayTraceRow | undefined;
  25. breadcrumbIndex?: number[][];
  26. expandPaths?: string[];
  27. }
  28. export default function BreadcrumbRow({
  29. expandPaths,
  30. extraction,
  31. frame,
  32. index,
  33. onClick,
  34. onDimensionChange,
  35. onInspectorExpanded,
  36. startTimestampMs,
  37. style,
  38. traces,
  39. }: Props) {
  40. const {currentTime, currentHoverTime} = useReplayContext();
  41. const {onMouseEnter, onMouseLeave} = useCrumbHandlers();
  42. const handleDimensionChange = useCallback(
  43. () => onDimensionChange(index),
  44. [onDimensionChange, index]
  45. );
  46. const handleObjectInspectorExpanded = useCallback(
  47. (path, expandedState, e) => onInspectorExpanded?.(index, path, expandedState, e),
  48. [index, onInspectorExpanded]
  49. );
  50. const hasOccurred = currentTime >= frame.offsetMs;
  51. const isBeforeHover =
  52. currentHoverTime === undefined || currentHoverTime >= frame.offsetMs;
  53. return (
  54. <BreadcrumbItem
  55. className={classNames({
  56. beforeCurrentTime: hasOccurred,
  57. afterCurrentTime: !hasOccurred,
  58. beforeHoverTime: currentHoverTime !== undefined ? isBeforeHover : undefined,
  59. afterHoverTime: currentHoverTime !== undefined ? !isBeforeHover : undefined,
  60. })}
  61. style={style}
  62. frame={frame}
  63. traces={traces}
  64. extraction={extraction}
  65. onClick={onClick}
  66. onMouseEnter={onMouseEnter}
  67. onMouseLeave={onMouseLeave}
  68. startTimestampMs={startTimestampMs}
  69. expandPaths={expandPaths}
  70. onDimensionChange={handleDimensionChange}
  71. onInspectorExpanded={handleObjectInspectorExpanded}
  72. />
  73. );
  74. }