Auth Provider đầy đủ

Auth Provider đầy đủ

Dưới đây là 1 đoạn code Auth Provider mà mình hay dùng :

'use client'
import { API } from "@/lib/axios";
import { BASE_URL_API } from "@/lib/config";
import { Usertype } from "@/types/User";
import axios from "axios";
import { createContext, ReactNode, useContext, useEffect, useState } from "react";

interface AuthcontextType {
     user: Usertype | undefined;
     login: (email: string, password: string) => Promise<number>;
     logout: () => void,
     isAuthLoading: boolean,
     isLoggedIn: () => boolean
}
export const Authcontext = createContext<AuthcontextType | undefined>(undefined)
export const AuthProvider = ({ children }: { children: ReactNode }) => {
     const [isAuthLoading, setIsAuthLoading] = useState(true);
     const [user, setUser] = useState<Usertype | undefined>(undefined);
     const login = async (email: string, password: string) => {
          try {
               setIsAuthLoading(true);
               const response = await API.post('login', { email, password });
               if (response.data === 200 && response.data?.token) {
                    localStorage.setItem('token', response.data.access_token);
                    localStorage.setItem('refreshToken', response.data.refresh_token);
                    const dataUser: Usertype = {
                         email: response.data.email,
                         username: response.data.username,
                         dayoff: response.data.dayoff ?? 0,
                    }
                    setUser(dataUser)
               }
               return 1;
          } catch (error) {
               console.error("Login failed:", error);
               return 0;
          } finally {
               setIsAuthLoading(false);
          }
     }
     const logout = () => {
          localStorage.removeItem('token');
          localStorage.removeItem('refreshToken');
          setUser(undefined)
          if (window.location.pathname !== '/login') {
               window.location.href = '/login'
          }
     }
     // ✅ Kiểm tra đăng nhập từ localStorage
     const checkAuth = async () => {
          const token = localStorage.getItem('token');
          if (!token) {
               setIsAuthLoading(false);
               return;
          }
          try {
               const response = await axios.get(`${BASE_URL_API}me`, {
                    headers: {
                         Authorization: `Bearer ${token}`,
                    },
               });

               if (response.status === 200) {
                    const dataUser: Usertype = {
                         email: response.data.email,
                         username: response.data.username,
                         dayoff: response.data.dayoff ?? 0,
                    };
                    setUser(dataUser);
               } else {
                    logout();
               }
          } catch (error) {
               logout();
          } finally {
               setIsAuthLoading(false);
          }
     };

     // ✅ Kiểm tra đăng nhập nhanh
     const isLoggedIn = (): boolean => {
          return !!localStorage.getItem('token');
     };

     // ✅ Tự động kiểm tra khi app khởi chạy
     useEffect(() => {
          checkAuth();
     }, []);
     return (<>
          <Authcontext.Provider value={{ login, logout, user, isAuthLoading, isLoggedIn }}>
               {children}
          </Authcontext.Provider>
     </>)
}
export const useAuth = () => {
     const context = useContext(Authcontext);
     if (!context) {
          throw new Error('lỗi provider')
     }
     return context;
}
export interface Usertype {

     email: string,

     username: string,

     dayoff?: number | 0

}