useCrumbHandlers.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import {useCallback} from 'react';
  2. import {useReplayContext} from 'sentry/components/replays/replayContext';
  3. import {relativeTimeInMs} from 'sentry/components/replays/utils';
  4. import {BreadcrumbType, Crumb} from 'sentry/types/breadcrumbs';
  5. import useActiveReplayTab from 'sentry/utils/replays/hooks/useActiveReplayTab';
  6. import type {NetworkSpan} from 'sentry/views/replays/types';
  7. function useCrumbHandlers(startTimestampMs: number = 0) {
  8. const {
  9. clearAllHighlights,
  10. highlight,
  11. removeHighlight,
  12. setCurrentHoverTime,
  13. setCurrentTime,
  14. } = useReplayContext();
  15. const {setActiveTab} = useActiveReplayTab();
  16. const handleMouseEnter = useCallback(
  17. (item: Crumb | NetworkSpan) => {
  18. if (startTimestampMs) {
  19. setCurrentHoverTime(relativeTimeInMs(item.timestamp ?? '', startTimestampMs));
  20. }
  21. if (item.data && 'nodeId' in item.data) {
  22. // XXX: Kind of hacky, but mouseLeave does not fire if you move from a
  23. // crumb to a tooltip
  24. clearAllHighlights();
  25. highlight({nodeId: item.data.nodeId, annotation: item.data.label});
  26. }
  27. },
  28. [setCurrentHoverTime, startTimestampMs, highlight, clearAllHighlights]
  29. );
  30. const handleMouseLeave = useCallback(
  31. (item: Crumb | NetworkSpan) => {
  32. setCurrentHoverTime(undefined);
  33. if (item.data && 'nodeId' in item.data) {
  34. removeHighlight({nodeId: item.data.nodeId});
  35. }
  36. },
  37. [setCurrentHoverTime, removeHighlight]
  38. );
  39. const handleClick = useCallback(
  40. (crumb: Crumb | NetworkSpan) => {
  41. if (crumb.timestamp !== undefined) {
  42. setCurrentTime(relativeTimeInMs(crumb.timestamp, startTimestampMs));
  43. }
  44. if ('type' in crumb) {
  45. switch (crumb.type) {
  46. case BreadcrumbType.NAVIGATION:
  47. setActiveTab('network');
  48. break;
  49. case BreadcrumbType.UI:
  50. setActiveTab('dom');
  51. break;
  52. default:
  53. setActiveTab('console');
  54. break;
  55. }
  56. }
  57. },
  58. [setCurrentTime, startTimestampMs, setActiveTab]
  59. );
  60. return {
  61. handleMouseEnter,
  62. handleMouseLeave,
  63. handleClick,
  64. };
  65. }
  66. export default useCrumbHandlers;