ishans24's picture
adding file
1c8e50c
import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
import { authAPI } from '../services/api';
const AUTH_TOKEN_KEY = 'authToken';
const AuthContext = createContext();
export const useAuth = () => {
const context = useContext(AuthContext);
if (!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);
const loadUserProfile = useCallback(async () => {
try {
const response = await authAPI.getProfile();
setUser(response.data);
} catch (error) {
window.localStorage.removeItem(AUTH_TOKEN_KEY);
setUser(null);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
const token = window.localStorage.getItem(AUTH_TOKEN_KEY);
if (token) {
loadUserProfile();
} else {
setLoading(false);
}
}, [loadUserProfile]);
const login = useCallback(
async (credentials) => {
const response = await authAPI.signin(credentials);
const token = response?.data?.token ?? response?.data?.jwt ?? response?.data;
if (!token || typeof token !== 'string') {
throw new Error('Invalid token received from server');
}
window.localStorage.setItem(AUTH_TOKEN_KEY, token);
await loadUserProfile();
return response?.data;
},
[loadUserProfile]
);
const register = useCallback(async (userData) => {
const response = await authAPI.signup(userData);
return response.data;
}, []);
const logout = useCallback(() => {
window.localStorage.removeItem(AUTH_TOKEN_KEY);
setUser(null);
}, []);
const value = useMemo(
() => ({
user,
login,
register,
logout,
loading,
isAuthenticated: Boolean(user),
}),
[loading, login, logout, register, user]
);
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
};