Nagesh Muralidhar
Initial commit of PodCraft application
fd52f31
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>
);
};