shoc-frontend-new/src/lib/api/client.js
npalOmega 65bf95b20c refactor: fix compilation errors and centralize constants
- Fixed Redux slice errors
- All query keys now use constants from src/constants/
- Converted LoginPage to CSS Modules
- Consolidated documentation
2026-05-12 20:33:23 -05:00

79 lines
2.3 KiB
JavaScript

import axios from 'axios';
import { API_URL } from '../../constants';
// Create axios instance
const apiClient = axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
});
// Request interceptor - Add auth token
apiClient.interceptors.request.use(
(config) => {
const tokenData = window.localStorage.getItem('token');
if (tokenData) {
try {
const user = JSON.parse(tokenData);
if (user?.token) {
config.headers.Authorization = `Bearer ${user.token}`;
}
} catch (error) {
console.error('Error parsing token:', error);
}
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
// Response interceptor - Handle errors globally
apiClient.interceptors.response.use(
(response) => {
// Handle different response structures from the API
// Some endpoints return { data: [...] }, some return plain arrays
return response;
},
(error) => {
if (error.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
const { status, data } = error.response;
if (status === 401) {
// Unauthorized - redirect to login
window.localStorage.removeItem('token');
window.location.href = '/login';
return Promise.reject(new Error('You are not authorized to access this page.'));
}
if (status === 403) {
return Promise.reject(new Error('You do not have permission to perform this action.'));
}
if (status === 404) {
return Promise.reject(new Error('The requested resource was not found.'));
}
if (status === 500) {
return Promise.reject(new Error('A server error occurred. Please try again later.'));
}
// Extract error message from response
const message = data?.message || data?.Message || data?.error || 'An error occurred';
return Promise.reject(new Error(message));
} else if (error.request) {
// The request was made but no response was received
return Promise.reject(new Error('No response from server. Please check your connection.'));
} else {
// Something happened in setting up the request that triggered an Error
return Promise.reject(error);
}
}
);
export default apiClient;