Spaces:
Runtime error
Runtime error
| 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>; | |
| }; |