81 lines
1.9 KiB
JavaScript
81 lines
1.9 KiB
JavaScript
import { useState } from 'react';
|
|
import authService from '../services/authService';
|
|
import { jwtDecode } from 'jwt-decode';
|
|
import { useNavigate } from 'react-router-dom';
|
|
|
|
const useAuth = () => {
|
|
const [user, setUser] = useState(null);
|
|
const [loading, setLoading] = useState(false);
|
|
const [error, setError] = useState(null);
|
|
const navigate = useNavigate();
|
|
|
|
const login = async (email, password) => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const { TOKEN } = await authService.login(email, password);
|
|
localStorage.setItem('token', TOKEN);
|
|
const decoded = jwtDecode(TOKEN);
|
|
setUser(decoded);
|
|
if (decoded.ROLE == 'student') {
|
|
window.location.href = '/learning';
|
|
}else if (decoded.ROLE == 'teacher') {
|
|
window.location.href = '/portal';
|
|
}else if (decoded.ROLE == 'admin') {
|
|
window.location.href = '/admin';
|
|
}
|
|
|
|
} catch (err) {
|
|
setError(err.message);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const register = async (email, password, role) => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const { token } = await authService.register(email, password, role);
|
|
localStorage.setItem('token', token);
|
|
const decoded = jwtDecode(token);
|
|
setUser(decoded);
|
|
navigate(`/${decoded.role}`);
|
|
} catch (err) {
|
|
setError(err.message);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
|
|
const logout = () => {
|
|
authService.logout();
|
|
setUser(null);
|
|
if (!localStorage.removeItem('token')) {
|
|
navigate('/login');
|
|
}else{
|
|
logout();
|
|
}
|
|
};
|
|
|
|
const getUserFromToken = () => {
|
|
const token = localStorage.getItem('token');
|
|
if (token) {
|
|
const decoded = jwtDecode(token);
|
|
setUser(decoded);
|
|
}
|
|
};
|
|
|
|
return {
|
|
user,
|
|
loading,
|
|
error,
|
|
login,
|
|
register,
|
|
logout,
|
|
getUserFromToken,
|
|
};
|
|
};
|
|
|
|
export default useAuth;
|