UNPKG

@pitifulhawk/flash-up

Version:

Interactive project scaffolder for modern web applications

113 lines (97 loc) 2.92 kB
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;