()
| 4 | import { useLogContext } from '../../contexts/LogContext'; |
| 5 | |
| 6 | export default function useLogPageView(): MutableRefObject<() => void> { |
| 7 | const router = useRouter(); |
| 8 | const { logEventStart, logEventEnd } = useLogContext(); |
| 9 | const routeChangedCallbackRef = useRef<() => void>(); |
| 10 | const lifecycleCallbackRef = useRef<(event: CustomEvent) => void>(); |
| 11 | |
| 12 | useEffect(() => { |
| 13 | routeChangedCallbackRef.current = () => { |
| 14 | logEventEnd('page view'); |
| 15 | logEventStart('page view', { event_name: 'page view' }); |
| 16 | }; |
| 17 | |
| 18 | lifecycleCallbackRef.current = (event) => { |
| 19 | if (event.detail.newState === 'active') { |
| 20 | logEventStart('page view', { event_name: 'page view' }); |
| 21 | } |
| 22 | }; |
| 23 | }, [logEventStart, logEventEnd]); |
| 24 | |
| 25 | useEffect(() => { |
| 26 | const handleRouteChange = () => routeChangedCallbackRef.current(); |
| 27 | router.events.on('routeChangeComplete', handleRouteChange); |
| 28 | |
| 29 | const handleLifecycle = (event: CustomEvent) => |
| 30 | lifecycleCallbackRef.current(event); |
| 31 | window.addEventListener('statechange', handleLifecycle); |
| 32 | |
| 33 | return () => { |
| 34 | router.events.off('routeChangeComplete', handleRouteChange); |
| 35 | window.removeEventListener('statechange', handleLifecycle); |
| 36 | }; |
| 37 | // @NOTE see https://dailydotdev.atlassian.net/l/cp/dK9h1zoM |
| 38 | // eslint-disable-next-line react-hooks/exhaustive-deps |
| 39 | }, []); |
| 40 | |
| 41 | return routeChangedCallbackRef; |
| 42 | } |
no test coverage detected