breadcrumbRow.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import type {CSSProperties} from 'react';
  2. import {forwardRef, 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 useCurrentHoverTime from 'sentry/utils/replays/playback/providers/useCurrentHoverTime';
  9. import type {ReplayFrame} from 'sentry/utils/replays/types';
  10. interface Props {
  11. extraction: Extraction | undefined;
  12. frame: ReplayFrame;
  13. index: number;
  14. onClick: ReturnType<typeof useCrumbHandlers>['onClickTimestamp'];
  15. onInspectorExpanded: (
  16. index: number,
  17. path: string,
  18. expandedState: Record<string, boolean>
  19. ) => void;
  20. startTimestampMs: number;
  21. style: CSSProperties;
  22. breadcrumbIndex?: number[][];
  23. expandPaths?: string[];
  24. }
  25. const BreadcrumbRow = forwardRef<HTMLDivElement, Props>(function BreadcrumbRow(
  26. {
  27. expandPaths,
  28. extraction,
  29. frame,
  30. index,
  31. onClick,
  32. onInspectorExpanded,
  33. startTimestampMs,
  34. style,
  35. },
  36. ref
  37. ) {
  38. const {currentTime} = useReplayContext();
  39. const [currentHoverTime] = useCurrentHoverTime();
  40. const {onMouseEnter, onMouseLeave} = useCrumbHandlers();
  41. const handleObjectInspectorExpanded = useCallback(
  42. (path: any, expandedState: any) => onInspectorExpanded?.(index, path, expandedState),
  43. [index, onInspectorExpanded]
  44. );
  45. const hasOccurred = currentTime >= frame.offsetMs;
  46. const isBeforeHover =
  47. currentHoverTime === undefined || currentHoverTime >= frame.offsetMs;
  48. return (
  49. <BreadcrumbItem
  50. ref={ref}
  51. className={classNames({
  52. beforeCurrentTime: hasOccurred,
  53. afterCurrentTime: !hasOccurred,
  54. beforeHoverTime: currentHoverTime !== undefined ? isBeforeHover : undefined,
  55. afterHoverTime: currentHoverTime !== undefined ? !isBeforeHover : undefined,
  56. })}
  57. style={style}
  58. frame={frame}
  59. extraction={extraction}
  60. onClick={onClick}
  61. onMouseEnter={onMouseEnter}
  62. onMouseLeave={onMouseLeave}
  63. startTimestampMs={startTimestampMs}
  64. expandPaths={expandPaths}
  65. onInspectorExpanded={handleObjectInspectorExpanded}
  66. />
  67. );
  68. });
  69. export default BreadcrumbRow;