MCPcopy
hub / github.com/nytimes/react-tracking / useTrackingImpl

Function useTrackingImpl

src/useTrackingImpl.js:7–121  ·  view source on GitHub ↗
(trackingData, options)

Source from the content-addressed store, hash-verified

5import dispatchTrackingEvent from './dispatchTrackingEvent';
6
7export default function useTrackingImpl(trackingData, options) {
8 const { tracking } = useContext(ReactTrackingContext);
9 const latestData = useRef(trackingData);
10 const latestOptions = useRef(options);
11
12 useEffect(() => {
13 // store the latest data & options in a mutable ref to prevent
14 // dependencies from changing when the consumer passes in non-memoized objects
15 // same approach that we use for props in withTrackingComponentDecorator
16 latestData.current = trackingData;
17 latestOptions.current = options;
18 });
19
20 const {
21 dispatch = dispatchTrackingEvent,
22 dispatchOnMount = false,
23 process,
24 } = useMemo(() => latestOptions.current || {}, []);
25
26 const getProcessFn = useCallback(
27 () => tracking && tracking.process,
28 [tracking]
29 );
30
31 const getOwnTrackingData = useCallback(() => {
32 const data = latestData.current;
33 const ownTrackingData = typeof data === 'function' ? data() : data;
34 return ownTrackingData || {};
35 }, []);
36
37 const getTrackingDataFn = useCallback(() => {
38 const contextGetTrackingData =
39 (tracking && tracking.getTrackingData) || getOwnTrackingData;
40
41 return () =>
42 contextGetTrackingData === getOwnTrackingData
43 ? getOwnTrackingData()
44 : merge(
45 contextGetTrackingData(),
46 getOwnTrackingData(),
47 (latestOptions.current || {}).mergeOptions
48 );
49 }, [getOwnTrackingData, tracking]);
50
51 const getTrackingDispatcher = useCallback(() => {
52 const contextDispatch = (tracking && tracking.dispatch) || dispatch;
53 return data =>
54 contextDispatch(
55 merge(
56 getOwnTrackingData(),
57 data || {},
58 (latestOptions.current || {}).mergeOptions
59 )
60 );
61 }, [getOwnTrackingData, tracking, dispatch]);
62
63 const trackEvent = useCallback(
64 (data = {}) => {

Callers 2

useTrackingFunction · 0.85
WithTrackingFunction · 0.85

Calls 1

trackEventFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…