Spaces:
Sleeping
Sleeping
| import React, { createContext, useState, useEffect, useContext } from 'react'; | |
| // Create the auth context | |
| export const AuthContext = createContext(); | |
| // Custom hook to use the auth context | |
| export const useAuth = () => useContext(AuthContext); | |
| export const AuthProvider = ({ children }) => { | |
| const [isAuthenticated, setIsAuthenticated] = useState(false); | |
| const [isLoading, setIsLoading] = useState(true); | |
| const [user, setUser] = useState(null); | |
| // Check for token on initial load | |
| useEffect(() => { | |
| const validateToken = async () => { | |
| const token = localStorage.getItem('token'); | |
| if (!token) { | |
| setIsAuthenticated(false); | |
| setIsLoading(false); | |
| return; | |
| } | |
| try { | |
| const response = await fetch('http://localhost:8000/user/me', { | |
| headers: { | |
| 'Authorization': `Bearer ${token}` | |
| } | |
| }); | |
| if (response.ok) { | |
| const userData = await response.json(); | |
| setUser(userData); | |
| setIsAuthenticated(true); | |
| console.log('User authenticated from stored token'); | |
| } else { | |
| // Token is invalid, remove it | |
| localStorage.removeItem('token'); | |
| setIsAuthenticated(false); | |
| setUser(null); | |
| console.log('Stored token is invalid, removed'); | |
| } | |
| } catch (error) { | |
| console.error('Error validating token:', error); | |
| // Don't remove token on network errors to allow offline access | |
| } finally { | |
| setIsLoading(false); | |
| } | |
| }; | |
| validateToken(); | |
| }, []); | |
| // Login function | |
| const login = async (username, password) => { | |
| try { | |
| const response = await fetch('http://localhost:8000/login', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ username, password }), | |
| }); | |
| if (response.ok) { | |
| const data = await response.json(); | |
| localStorage.setItem('token', data.access_token); | |
| // Fetch user data | |
| const userResponse = await fetch('http://localhost:8000/user/me', { | |
| headers: { | |
| 'Authorization': `Bearer ${data.access_token}` | |
| } | |
| }); | |
| if (userResponse.ok) { | |
| const userData = await userResponse.json(); | |
| setUser(userData); | |
| } | |
| setIsAuthenticated(true); | |
| return { success: true, message: 'Login successful' }; | |
| } else { | |
| const error = await response.json(); | |
| return { success: false, message: error.detail || 'Login failed' }; | |
| } | |
| } catch (error) { | |
| console.error('Login error:', error); | |
| return { success: false, message: 'An error occurred during login' }; | |
| } | |
| }; | |
| // Signup function | |
| const signup = async (username, password) => { | |
| try { | |
| const response = await fetch('http://localhost:8000/signup', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ username, password }), | |
| }); | |
| if (response.ok) { | |
| const data = await response.json(); | |
| localStorage.setItem('token', data.access_token); | |
| // Fetch user data | |
| const userResponse = await fetch('http://localhost:8000/user/me', { | |
| headers: { | |
| 'Authorization': `Bearer ${data.access_token}` | |
| } | |
| }); | |
| if (userResponse.ok) { | |
| const userData = await userResponse.json(); | |
| setUser(userData); | |
| } | |
| setIsAuthenticated(true); | |
| return { success: true, message: 'Signup successful' }; | |
| } else { | |
| const error = await response.json(); | |
| return { success: false, message: error.detail || 'Signup failed' }; | |
| } | |
| } catch (error) { | |
| console.error('Signup error:', error); | |
| return { success: false, message: 'An error occurred during signup' }; | |
| } | |
| }; | |
| // Logout function | |
| const logout = () => { | |
| localStorage.removeItem('token'); | |
| setIsAuthenticated(false); | |
| setUser(null); | |
| return { success: true, message: 'Logout successful' }; | |
| }; | |
| // Get token function | |
| const getToken = () => localStorage.getItem('token'); | |
| // Context value | |
| const value = { | |
| isAuthenticated, | |
| isLoading, | |
| user, | |
| login, | |
| signup, | |
| logout, | |
| getToken | |
| }; | |
| return ( | |
| <AuthContext.Provider value={value}> | |
| {children} | |
| </AuthContext.Provider> | |
| ); | |
| }; |