Spaces:
Running
Running
File size: 2,655 Bytes
aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 b3c8917 aa06156 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
import { createContext, useContext, useState, useEffect } from 'react';
import axios from 'axios';
import { useNavigate } from 'react-router-dom';
import { toast } from 'react-toastify';
const AuthContext = createContext();
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const navigate = useNavigate();
// Set axios defaults
axios.defaults.withCredentials = true;
// Check auth status on app load
useEffect(() => {
const checkAuth = async () => {
try {
const res = await axios.get('/api/auth/me');
setUser(res.data.user);
} catch (err) {
setUser(null);
} finally {
setLoading(false);
}
};
checkAuth();
}, []);
// Register user
const register = async (formData) => {
try {
setLoading(true);
const res = await axios.post('/api/auth/register', formData);
setUser(res.data.user);
toast.success('ثبتنام با موفقیت انجام شد');
navigate('/dashboard');
return res.data;
} catch (err) {
const errorMessage = err.response?.data?.message || 'خطا در ثبتنام';
toast.error(errorMessage);
throw errorMessage;
} finally {
setLoading(false);
}
};
// Login user
const login = async (formData) => {
try {
setLoading(true);
const res = await axios.post('/api/auth/login', formData);
setUser(res.data.user);
toast.success('ورود با موفقیت انجام شد');
navigate('/dashboard');
return res.data;
} catch (err) {
const errorMessage = err.response?.data?.message || 'خطا در ورود';
toast.error(errorMessage);
throw errorMessage;
} finally {
setLoading(false);
}
};
// Logout user
const logout = async () => {
try {
await axios.get('/api/auth/logout');
setUser(null);
toast.success('خروج با موفقیت انجام شد');
navigate('/');
} catch (err) {
toast.error('خطا در خروج از سیستم');
}
};
// Check if user is authenticated
const isAuthenticated = () => {
return !!user;
};
// Check if user has specific role
const hasRole = (role) => {
return user?.role === role;
};
return (
<AuthContext.Provider
value={{
user,
loading,
register,
login,
logout,
isAuthenticated,
hasRole
}}
>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
return useContext(AuthContext);
}
|