diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-11-15 17:09:13 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-15 17:26:17 +0100 |
| commit | 36baf3e5725aeae00d81d3a082b3c04074e09f8e (patch) | |
| tree | 34069dc40f7cd45707e8cea0a8993e94841af778 /src/utils/hooks/use-on-route-change/use-on-route-change.ts | |
| parent | c826ad66df066b90b09009f2f4b83b56d018436e (diff) | |
refactor(hooks): replace useRouteChange with useOnRouteChange hook
* handle both event start and event complete
* clean the effect
* add tests
Diffstat (limited to 'src/utils/hooks/use-on-route-change/use-on-route-change.ts')
| -rw-r--r-- | src/utils/hooks/use-on-route-change/use-on-route-change.ts | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/utils/hooks/use-on-route-change/use-on-route-change.ts b/src/utils/hooks/use-on-route-change/use-on-route-change.ts new file mode 100644 index 0000000..85e7060 --- /dev/null +++ b/src/utils/hooks/use-on-route-change/use-on-route-change.ts @@ -0,0 +1,35 @@ +import { useRouter } from 'next/router'; +import { useEffect } from 'react'; + +export type OnRouteChangeStep = 'start' | 'end'; + +export type OnRouteChangeHandler = () => void; + +/** + * React hook to trigger a callback function on route change. + * + * @param {OnRouteChangeHandler} handler - The callback to trigger. + * @param {OnRouteChangeStep} [step] - The event step. + */ +export const useOnRouteChange = ( + handler: OnRouteChangeHandler, + step: OnRouteChangeStep = 'start' +) => { + const router = useRouter(); + + useEffect(() => { + if (step === 'end') { + router.events.on('routeChangeComplete', handler); + + return () => { + router.events.off('routeChangeComplete', handler); + }; + } + + router.events.on('routeChangeStart', handler); + + return () => { + router.events.off('routeChangeStart', handler); + }; + }, [handler, router.events, step]); +}; |
