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
}