작성한지 약 2년이 지나 nextjs 15가 나온 시점이고 해당 레포는 파일 라우팅으로 전환되어있지만.. 임시저장에 있는 글을 올려본다.. 현재는 많이 달라졌을 수 있는 점 주의
nextjs 라우터를 커스텀하게 사용하고 있고, 뒤로 가기 등 원하는 시점에 라우팅 블로킹을 하고 싶음
browser history를 알 수 없음
크로스 브라우징이 안됨 ㅜㅜ
pushState로 업데이트를 해주고 routeChangeStart 사용하여 막으나 router이동을 막을 수는 없음. 수동으로 히스토리를 끼워맞춰주니까 히스토리가 꼬임 ㅜㅜ
import { useRouter } from 'next/router';
import { useCallback, useEffect, useRef, useState } from 'react';
interface UseBlockProps {
when?: boolean;
callback: () => Promise<boolean | undefined>;
}
export const useBlock = ({ when, callback }: UseBlockProps) => {
const router = useRouter();
const unblockRef = useRef<() => unknown>();
const callbackRef = useRef<() => Promise<boolean | undefined>>();
callbackRef.current = callback;
const unblock = useCallback(() => {
unblockRef.current?.();
}, []);
const handleRouteChangeStart = useCallback(
async (url: string) => {
try {
if (url === router.asPath) {
return;
}
setTimeout(() => {
router.replace(router.asPath, undefined, { shallow: true });
window.history.pushState(null, '', router.asPath);
}, 0);
if (when) {
if (await callbackRef.current?.()) {
unblock();
router.back();
}
}
} catch (error) {
console.error(error);
}
},
[router.asPath],
);
useEffect(() => {
router.events.on('routeChangeStart', handleRouteChangeStart);
unblockRef.current = () => router.events.off('routeChangeStart', handleRouteChangeStart);
}, [router, handleRouteChangeStart]);
return { unblock };
};