import axiosInstance from 'axios'; /** * HTTP错误类 */ class HttpError extends Error { status: number; data?: unknown; constructor(message: string | unknown, status = 500, data?: unknown) { const errorMessage = typeof message === 'string' ? message : 'Error'; super(errorMessage); this.status = status; this.data = data || (typeof message === 'object' ? message : undefined); } } export const createAxios = () => { const axios = axiosInstance.create({ baseURL: '/api', }); axios.interceptors.response.use( (response) => { // Any status code that lie within the range of 2xx cause this function to trigger return response; }, (error) => { // Any status codes that falls outside the range of 2xx cause this function to trigger const { data, status } = error?.response || {}; throw new HttpError(data || error?.message || 'no response from server', status || 500); } ); return axios; }; const axios = createAxios(); /** * Configuration options for the Axios instance. */ export interface IAPIRequestConfig { /** * API endpoint, defaults to 'https://app.teable.io'. */ endpoint?: string; /** * Bearer token for authentication. */ token: string; } /** * Configures the Axios instance with the provided options. * @param config - Configuration options */ export const configApi = (config: IAPIRequestConfig) => { const { token, endpoint = 'https://app.teable.io' } = config; if (!token) { throw new Error( `token is required, visit ${endpoint}/setting/personal-access-token to get one` ); } axios.defaults.baseURL = `${endpoint}/api`; axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; return axios; }; export { axios };