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);
}