Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 | 1x 1x 9x 9x 9x 1x 9x 9x 9x 3x 3x 3x 9x 9x 3x 3x 2x 2x 2x 2x 2x 2x 1x 1x 1x 9x 9x 1x 1x 1x 1x 1x 1x 9x 9x | import React, { createContext, useContext, useState, useEffect } from 'react';
import axios from 'axios';
import toast from 'react-hot-toast';
const AuthContext = createContext();
export const useAuth = () => {
const context = useContext(AuthContext);
Iif (!context) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const token = localStorage.getItem('token');
Iif (token) {
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
fetchUser();
} else {
setLoading(false);
}
}, []);
const fetchUser = async () => {
try {
const response = await axios.get('/api/auth/me');
setUser(response.data.user);
} catch (error) {
console.error('Failed to fetch user:', error);
localStorage.removeItem('token');
delete axios.defaults.headers.common['Authorization'];
} finally {
setLoading(false);
}
};
const login = async (email, password) => {
try {
const response = await axios.post('/api/auth/login', { email, password });
const { token, user } = response.data;
localStorage.setItem('token', token);
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
setUser(user);
toast.success('Login successful!');
return { success: true };
} catch (error) {
const message = error.response?.data?.error || 'Login failed';
toast.error(message);
return { success: false, error: message };
}
};
const register = async (userData) => {
try {
const response = await axios.post('/api/auth/register', userData);
const { token, user } = response.data;
localStorage.setItem('token', token);
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
setUser(user);
toast.success('Registration successful!');
return { success: true };
} catch (error) {
const message = error.response?.data?.error || 'Registration failed';
toast.error(message);
return { success: false, error: message };
}
};
const logout = async () => {
try {
await axios.post('/api/auth/logout');
} catch (error) {
console.error('Logout error:', error);
} finally {
localStorage.removeItem('token');
delete axios.defaults.headers.common['Authorization'];
setUser(null);
toast.success('Logged out successfully');
}
};
const value = {
user,
loading,
login,
register,
logout,
fetchUser
};
return (
<AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
);
};
|