File size: 3,459 Bytes
2070fe3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
112
113
114
115
116
117
118
119
120
121
122
import React, { createContext, useState, useEffect, useContext } from 'react';
import { authAPI } from '../utils/api';

const AuthContext = createContext();

export const useAuth = () => {
  const context = useContext(AuthContext);
  if (!context) {
    throw new Error('useAuth must be used within AuthProvider');
  }
  return context;
};

export const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    checkAuth();
  }, []);

  const checkAuth = async () => {
    try {
      console.log('πŸ” Checking authentication status...');
      const response = await authAPI.getCurrentUser();
      
      if (response.data && response.data.user) {
        const userData = response.data.user;
        const formattedUser = {
          ...userData,
          username: userData.username || userData.name || 'User',
          avatar: userData.avatar || ''
        };
        
        console.log('βœ… User authenticated:', formattedUser.email);
        setUser(formattedUser);
        setLoading(false);
        return true; // Return true if authenticated
      } else {
        console.log('❌ No user data in response');
        setUser(null);
        setLoading(false);
        return false;
      }
    } catch (error) {
      console.error('❌ Authentication check failed:', error.response?.status, error.message);
      setUser(null);
      setLoading(false);
      return false; // Return false if not authenticated
    }
  };

  const login = async (credentials) => {
    try {
      console.log('πŸ” Logging in with email/password...');
      const response = await authAPI.login(credentials);
      const userData = response.data.user;
      const formattedUser = {
        ...userData,
        username: userData.username || userData.name || 'User',
        avatar: userData.avatar || ''
      };
      
      console.log('βœ… Login successful:', formattedUser.email);
      setUser(formattedUser);
      return response.data;
    } catch (error) {
      console.error('❌ Login failed:', error.response?.data?.message || error.message);
      throw error;
    }
  };

  const register = async (userData) => {
    try {
      console.log('πŸ“ Registering new user...');
      const response = await authAPI.register(userData);
      const user = response.data.user;
      const formattedUser = {
        ...user,
        username: user.username || user.name || 'User',
        avatar: user.avatar || ''
      };
      
      console.log('βœ… Registration successful:', formattedUser.email);
      setUser(formattedUser);
      return response.data;
    } catch (error) {
      console.error('❌ Registration failed:', error.response?.data?.message || error.message);
      throw error;
    }
  };

  const logout = async () => {
    try {
      console.log('πŸ‘‹ Logging out...');
      await authAPI.logout();
      setUser(null);
      console.log('βœ… Logout successful');
    } catch (error) {
      console.error('❌ Logout failed:', error);
      // Still clear user even if API call fails
      setUser(null);
    }
  };

  const googleLogin = () => {
    console.log('πŸ”— Redirecting to Google OAuth...');
    authAPI.googleLogin();
  };

  const value = {
    user,
    loading,
    login,
    register,
    logout,
    googleLogin,
    checkAuth,
  };

  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};