useCrumbHandlers.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import {useCallback} from 'react';
  2. import {useReplayContext} from 'sentry/components/replays/replayContext';
  3. import {relativeTimeInMs} from 'sentry/components/replays/utils';
  4. import {Crumb} from 'sentry/types/breadcrumbs';
  5. function useCrumbHandlers(startTimestampMs: number = 0) {
  6. const {
  7. clearAllHighlights,
  8. highlight,
  9. removeHighlight,
  10. setCurrentHoverTime,
  11. setCurrentTime,
  12. } = useReplayContext();
  13. const handleMouseEnter = useCallback(
  14. (item: Crumb) => {
  15. if (startTimestampMs) {
  16. setCurrentHoverTime(relativeTimeInMs(item.timestamp ?? '', startTimestampMs));
  17. }
  18. if (item.data && 'nodeId' in item.data) {
  19. // XXX: Kind of hacky, but mouseLeave does not fire if you move from a
  20. // crumb to a tooltip
  21. clearAllHighlights();
  22. highlight({nodeId: item.data.nodeId, annotation: item.data.label});
  23. }
  24. },
  25. [setCurrentHoverTime, startTimestampMs, highlight, clearAllHighlights]
  26. );
  27. const handleMouseLeave = useCallback(
  28. (item: Crumb) => {
  29. setCurrentHoverTime(undefined);
  30. if (item.data && 'nodeId' in item.data) {
  31. removeHighlight({nodeId: item.data.nodeId});
  32. }
  33. },
  34. [setCurrentHoverTime, removeHighlight]
  35. );
  36. const handleClick = useCallback(
  37. (crumb: Crumb) => {
  38. crumb.timestamp !== undefined && startTimestampMs !== undefined
  39. ? setCurrentTime(relativeTimeInMs(crumb.timestamp, startTimestampMs))
  40. : null;
  41. },
  42. [setCurrentTime, startTimestampMs]
  43. );
  44. return {
  45. handleMouseEnter,
  46. handleMouseLeave,
  47. handleClick,
  48. };
  49. }
  50. export default useCrumbHandlers;