useSplitPanelTracking.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import {useCallback, useRef} from 'react';
  2. import {trackAnalytics} from 'sentry/utils/analytics';
  3. import useReplayLayout from 'sentry/utils/replays/hooks/useReplayLayout';
  4. import useOrganization from 'sentry/utils/useOrganization';
  5. type CSSValuePct = `${number}%`;
  6. type CSSValueFR = '1fr';
  7. type Options = {
  8. slideDirection: 'updown' | 'leftright';
  9. };
  10. function useSplitPanelTracking({slideDirection}: Options) {
  11. const organization = useOrganization();
  12. const {getLayout} = useReplayLayout();
  13. const startSizeCSSRef = useRef<number>(0);
  14. const setStartPosition = useCallback(
  15. (startPosition: undefined | CSSValuePct | CSSValueFR) => {
  16. startSizeCSSRef.current = Number(startPosition?.replace('%', '') || 0);
  17. },
  18. []
  19. );
  20. const logEndPosition = useCallback(
  21. (endPosition: undefined | CSSValuePct | CSSValueFR) => {
  22. const smaller = slideDirection === 'updown' ? 'toTop' : 'toLeft';
  23. const bigger = slideDirection === 'updown' ? 'toBottom' : 'toRight';
  24. const endSizeCSS = Number(
  25. endPosition?.endsWith('fr') ? '50' : endPosition?.replace('%', '') || 0
  26. );
  27. trackAnalytics('replay.details-resized-panel', {
  28. organization,
  29. layout: getLayout(),
  30. slide_motion: endSizeCSS > startSizeCSSRef.current ? bigger : smaller,
  31. });
  32. },
  33. [getLayout, organization, slideDirection]
  34. );
  35. return {
  36. setStartPosition,
  37. logEndPosition,
  38. };
  39. }
  40. export default useSplitPanelTracking;