(trackingData, options)
| 5 | import dispatchTrackingEvent from './dispatchTrackingEvent'; |
| 6 | |
| 7 | export 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 = {}) => { |
no test coverage detected
searching dependent graphs…