import { useEffect, useState } from "react"; import jwtDecode from "jwt-decode"; import { useRouter } from "next/router"; import { useLogOut } from "./useLogOut"; import { getCookie, setAuthCookie } from "../lib"; import { TJwtPayload } from "../types"; import { updateRefreshToken } from "../api"; import { IS_LOGGED_IN_COOKIE_NAME, VERIFYING_TOKEN_COOKIE_NAME } from "../vars"; /** * Hook that enables auth state and for check actual token * Used with {useUser} Context */ export const useJWTAuthentication = (): boolean => { const [isAuthorized, setIsAuthorized] = useState(false); const cookieIsExist = getCookie(VERIFYING_TOKEN_COOKIE_NAME); const userIsLoggedIn = getCookie(IS_LOGGED_IN_COOKIE_NAME); const router = useRouter(); const { logOut } = useLogOut(); useEffect(() => { if (cookieIsExist) { setIsAuthorized(true); return; } if (userIsLoggedIn) { updateRefreshToken() .then((res) => { if (res) { const { exp } = jwtDecode(res.ACCESS_TOKEN); setAuthCookie(exp); setIsAuthorized(!!res); // Using router for rerender trigger useJWTAuth hook router.push(`?/authorized=true`, router.asPath, { shallow: true }); return !!res; } logOut(); }) .catch(() => { setIsAuthorized(false); logOut(); }); } else { setIsAuthorized(false); } }, [cookieIsExist, userIsLoggedIn, router, logOut]); return isAuthorized; };