import React, { useEffect } from "react"; import { getRefreshToken, getUserInfo } from "../../services/auth/auth"; import { useRouter } from "next/router"; export const AuthContext: any = React.createContext({}); const NON_AUTHENTICATED_ROUTES = ["/login", "/signup"]; export interface Auth { access_token: string; isAuthenticated: boolean; userInfo: {}; isLoading: boolean; } const AuthProvider = (props: any) => { const router = useRouter(); const [auth, setAuth] = React.useState({ access_token: "", isAuthenticated: false, userInfo: {}, isLoading: true }); async function checkRefreshToken() { let data = await getRefreshToken(); if (data) { return data.access_token; } } async function checkAuth() { try { let access_token = await checkRefreshToken(); let userInfo = {}; let isLoading = false; if (access_token) { userInfo = await getUserInfo(access_token); setAuth({ access_token, isAuthenticated: true, userInfo, isLoading }); // if user is authenticated and tries to access login or signup page, redirect to home if (NON_AUTHENTICATED_ROUTES.includes(router.pathname)) { router.push("/"); } } else { setAuth({ access_token, isAuthenticated: false, userInfo, isLoading }); router.push("/login"); } } catch (error) { router.push("/"); } } useEffect(() => { if (auth.isLoading) { checkAuth(); } return () => { auth.isLoading = false; }; }, []); return {props.children}; }; export default AuthProvider;