mb672038's picture
می خوام که واقعا برنامه لاگین داشته باشه و ورود همچنین با توضیحا نی که دادم نمی خوام نمایشی باشه می خوام واقعی کار کنه
aa06156 verified
Raw
History Blame Contribute Delete
2.66 kB
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);
}