Files
ppanel-admin-web/lib/request.ts
2024-11-03 11:19:09 +07:00

53 lines
1.4 KiB
TypeScript

import { getAuthorization, isBrowser, Logout } from '@/lib';
import { getTranslations } from '@/locales/utils';
import axios, { InternalAxiosRequestConfig } from 'axios';
import { toast } from 'sonner';
import { NEXT_PUBLIC_API_URL, NEXT_PUBLIC_SITE_URL } from './env';
const request = axios.create({
baseURL: NEXT_PUBLIC_API_URL || NEXT_PUBLIC_SITE_URL,
// withCredentials: true,
// withXSRFToken: true,
timeout: 10000,
});
async function handleError(response: any) {
const code = response.data?.code;
if (response?.config?.skipErrorHandler) return;
if (!isBrowser()) return;
if ([40002, 40003, 40004].includes(code)) return Logout()
const t = await getTranslations('common');
const message = t(`request.${code}`) !== `request.${code}`
?
t(`request.${code}`) : response.data?.message || response.message;
toast.error(message);
}
request.interceptors.request.use(
async (config: InternalAxiosRequestConfig & {
Authorization?: string
}) => {
const Authorization = getAuthorization(config.Authorization);
if (Authorization) config.headers.Authorization = Authorization;
return config;
},
(error) => Promise.reject(error)
);
request.interceptors.response.use(
async (response) => {
const { code } = response.data;
if (code !== 200) throw response;
return response;
},
async (error) => {
await handleError(error)
return Promise.reject(error)
}
);
export default request;