useReplayHighlighting.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import type {RefObject} from 'react';
  2. import {useCallback} from 'react';
  3. import type {Replayer} from '@sentry-internal/rrweb';
  4. import {
  5. clearAllHighlights,
  6. highlightNode,
  7. removeHighlightedNode,
  8. } from 'sentry/utils/replays/highlightNode';
  9. interface Props {
  10. replayerRef: RefObject<Replayer>;
  11. }
  12. type HighlightParams = Parameters<typeof highlightNode>[1];
  13. type RemoveParams = Parameters<typeof removeHighlightedNode>[1];
  14. export default function useReplayHighlighting({replayerRef}: Props) {
  15. const highlightCallback = useCallback(
  16. (params: HighlightParams) => {
  17. const replayer = replayerRef.current;
  18. if (!replayer) {
  19. return;
  20. }
  21. highlightNode(replayer, params);
  22. },
  23. [replayerRef]
  24. );
  25. const clearAllHighlightsCallback = useCallback(() => {
  26. const replayer = replayerRef.current;
  27. if (!replayer) {
  28. return;
  29. }
  30. clearAllHighlights(replayer);
  31. }, [replayerRef]);
  32. const removeHighlightCallback = useCallback(
  33. (params: RemoveParams) => {
  34. const replayer = replayerRef.current;
  35. if (!replayer) {
  36. return;
  37. }
  38. removeHighlightedNode(replayer, params);
  39. },
  40. [replayerRef]
  41. );
  42. return {
  43. addHighlight: highlightCallback,
  44. removeHighlight: removeHighlightCallback,
  45. clearAllHighlights: clearAllHighlightsCallback,
  46. };
  47. }