Skip to content

Instantly share code, notes, and snippets.

@amirrezasalimi
Created August 27, 2022 09:22
Show Gist options
  • Save amirrezasalimi/37129cb7d39796f58bff2f030f236984 to your computer and use it in GitHub Desktop.
Save amirrezasalimi/37129cb7d39796f58bff2f030f236984 to your computer and use it in GitHub Desktop.
nextjs prevent route change hook (typescript)
interface IRouteChangeProps {
routeChangeFn: () => boolean
}
const useRouteChange = (props: IRouteChangeProps) => {
const router = useRouter();
const routeChangeStart = () => {
const close_res = props.routeChangeFn();
if (!close_res) {
router.events.emit('routeChangeError', router.asPath, { shallow: true });
throw 'Abort route change. Please ignore this error.';
}
}
useEffect(() => {
router.events.on('routeChangeStart', routeChangeStart);
return () => {
router.events.off('routeChangeStart', routeChangeStart);
}
}, [routeChangeStart])
}
export default useRouteChange;
@amirrezasalimi
Copy link
Author

amirrezasalimi commented Aug 27, 2022

example:

    useRouteChange({
        routeChangeFn: () => {
            if(hasUnsavedData){
               alert("where you want to go ? we have a lot to do")
               return false;
             }
            return true;
        }
    });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment