@pitifulhawk/flash-up
Version:
Interactive project scaffolder for modern web applications
113 lines (97 loc) • 2.92 kB
text/typescript
import axios from 'axios';
// Create axios instance with default configuration
const api = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL || process.env.REACT_APP_API_URL || 'http://localhost:3000/api',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
});
// Request interceptor
api.interceptors.request.use(
(config) => {
// Add auth token if available
const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null;
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
// Add timestamp to prevent caching
config.params = {
...config.params,
_t: Date.now(),
};
return config;
},
(error) => {
return Promise.reject(error);
}
);
// Response interceptor
api.interceptors.response.use(
(response) => {
return response;
},
(error) => {
// Handle common error scenarios
if (error.response?.status === 401) {
// Handle unauthorized access
if (typeof window !== 'undefined') {
localStorage.removeItem('token');
window.location.href = '/login';
}
} else if (error.response?.status === 403) {
// Handle forbidden access
console.error('Access forbidden:', error.response.data);
} else if (error.response?.status >= 500) {
// Handle server errors
console.error('Server error:', error.response.data);
}
return Promise.reject(error);
}
);
// API helper functions
export const apiHelpers = {
// GET request
get: async <T>(url: string, params?: any): Promise<T> => {
const response = await api.get(url, { params });
return response.data;
},
// POST request
post: async <T>(url: string, data?: any): Promise<T> => {
const response = await api.post(url, data);
return response.data;
},
// PUT request
put: async <T>(url: string, data?: any): Promise<T> => {
const response = await api.put(url, data);
return response.data;
},
// PATCH request
patch: async <T>(url: string, data?: any): Promise<T> => {
const response = await api.patch(url, data);
return response.data;
},
// DELETE request
delete: async <T>(url: string): Promise<T> => {
const response = await api.delete(url);
return response.data;
},
// Upload file
upload: async <T>(url: string, file: File, onProgress?: (progress: number) => void): Promise<T> => {
const formData = new FormData();
formData.append('file', file);
const response = await api.post(url, formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
onUploadProgress: (progressEvent) => {
if (onProgress && progressEvent.total) {
const progress = Math.round((progressEvent.loaded * 100) / progressEvent.total);
onProgress(progress);
}
},
});
return response.data;
},
};
export default api;