create-ex-den-kit
Version:
Create exam projects with Ex-Den-Kit
112 lines (92 loc) • 3.48 kB
JSX
import React, { createContext, useState, useContext, useEffect } from 'react';
import axios from 'axios';
import toast from 'react-hot-toast';
const AuthContext = createContext({});
export const useAuth = () => useContext(AuthContext);
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [isAdmin, setIsAdmin] = useState(false);
useEffect(() => {
const token = localStorage.getItem('token');
const userData = localStorage.getItem('user');
if (token && userData) {
setUser(JSON.parse(userData));
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
setIsAdmin(JSON.parse(userData).role === 'admin');
}
setLoading(false);
}, []);
const login = async (credentials) => {
try {
const response = await axios.post('/api/auth/login', credentials);
const { token, user } = response.data;
localStorage.setItem('token', token);
localStorage.setItem('user', JSON.stringify(user));
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
setUser(user);
setIsAdmin(user.role === 'admin');
toast.success('Успешный вход в систему!');
return { success: true };
} catch (error) {
const message = error.response?.data?.error || 'Ошибка при входе';
toast.error(message);
return { success: false, error: message };
}
};
const register = async (userData) => {
try {
const response = await axios.post('/api/auth/register', userData);
toast.success('Регистрация успешна! Теперь войдите в систему.');
return { success: true };
} catch (error) {
const message = error.response?.data?.error || 'Ошибка при регистрации';
toast.error(message);
return { success: false, error: message };
}
};
const adminLogin = async (credentials) => {
try {
// Проверяем админские права
const checkResponse = await axios.post('/api/admin/check', credentials);
if (checkResponse.data.isAdmin) {
// Логинимся как админ
const loginResponse = await axios.post('/api/auth/login', credentials);
const { token, user } = loginResponse.data;
localStorage.setItem('token', token);
localStorage.setItem('user', JSON.stringify(user));
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
setUser(user);
setIsAdmin(true);
toast.success('Вход в админ панель выполнен!');
return { success: true };
}
} catch (error) {
const message = error.response?.data?.error || 'Ошибка при входе';
toast.error(message);
return { success: false, error: message };
}
};
const logout = () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
delete axios.defaults.headers.common['Authorization'];
setUser(null);
setIsAdmin(false);
toast.success('Вы вышли из системы');
};
const value = {
user,
isAdmin,
loading,
login,
register,
adminLogin,
logout,
};
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
);
};