UNPKG

create-ex-den-kit

Version:

Create exam projects with Ex-Den-Kit

112 lines (92 loc) 3.48 kB
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> ); };