import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError } from 'axios'; import { API_URL } from '../utils/config'; import { getToken, removeToken, removeUser } from '../utils/storage'; export interface ApiError { message: string; status?: number; code?: string; } class ApiService { private axiosInstance: AxiosInstance; constructor() { this.axiosInstance = axios.create({ baseURL: API_URL, timeout: 30000, // 30 seconds timeout headers: { 'Content-Type': 'application/json', }, }); // Request interceptor: Add Authorization header with JWT this.axiosInstance.interceptors.request.use( (config) => { const token = getToken(); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { console.error('Request interceptor error:', error); return Promise.reject(this.handleError(error)); } ); // Response interceptor: Handle errors this.axiosInstance.interceptors.response.use( (response) => response, (error: AxiosError) => { if (error.response?.status === 401) { // Clear tokens and redirect to login console.warn('Unauthorized request, redirecting to login'); removeToken(); removeUser(); window.location.href = '/login'; } return Promise.reject(this.handleError(error)); } ); } private handleError(error: AxiosError): ApiError { if (error.response) { // Server responded with error const message = (error.response.data as any)?.message || (error.response.data as any)?.error || error.message || 'Ein Fehler ist aufgetreten'; return { message, status: error.response.status, code: error.code, }; } else if (error.request) { // Request was made but no response received return { message: 'Keine Antwort vom Server. Bitte überprüfen Sie Ihre Internetverbindung.', code: error.code, }; } else { // Something else happened return { message: error.message || 'Ein unerwarteter Fehler ist aufgetreten', code: error.code, }; } } async get(url: string, config?: AxiosRequestConfig): Promise> { return this.axiosInstance.get(url, config); } async post(url: string, data?: any, config?: AxiosRequestConfig): Promise> { return this.axiosInstance.post(url, data, config); } async put(url: string, data?: any, config?: AxiosRequestConfig): Promise> { return this.axiosInstance.put(url, data, config); } async delete(url: string, config?: AxiosRequestConfig): Promise> { return this.axiosInstance.delete(url, config); } async patch(url: string, data?: any, config?: AxiosRequestConfig): Promise> { return this.axiosInstance.patch(url, data, config); } } export const api = new ApiService();