import { useState, useEffect, createContext, useContext } from 'react';
import axios from 'axios';
const AuthContext = createContext();
export function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const [token, setToken] = useState(localStorage.getItem('token'));
const [loading, setLoading] = useState(true);
useEffect(() => {
if (token) {
validateToken();
} else {
setLoading(false);
}
}, [token]);
const validateToken = async () => {
try {
const response = await axios.post('/auth/validate-session', {
token
});
setUser(response.data.data.user);
} catch (error) {
logout();
} finally {
setLoading(false);
}
};
const signIn = async (provider, code) => {
try {
const endpoint = provider === 'google' ?
'/auth/signin-google' : '/auth/signin-microsoft';
const response = await axios.post(`${endpoint}/${code}`);
const { token: newToken, user: userData } = response.data.data;
setToken(newToken);
setUser(userData);
localStorage.setItem('token', newToken);
// Set default axios header
axios.defaults.headers.common['Authorization'] = `Bearer ${newToken}`;
return { success: true, user: userData };
} catch (error) {
return {
success: false,
error: error.response?.data?.error?.message || 'Authentication failed'
};
}
};
const logout = async () => {
try {
await axios.post('/auth/logout', {});
} catch (error) {
console.error('Logout error:', error);
} finally {
setUser(null);
setToken(null);
localStorage.removeItem('token');
delete axios.defaults.headers.common['Authorization'];
}
};
return (
<AuthContext.Provider value={{ user, token, signIn, logout, loading }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
}