mirror of
https://github.com/perfect-panel/ppanel-web.git
synced 2026-02-06 11:40:28 -05:00
56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
import { getTranslations } from '@/locales/utils';
|
|
import { isBrowser } from '@repo/ui/utils';
|
|
import { toast } from '@shadcn/ui/lib/sonner';
|
|
import axios, { InternalAxiosRequestConfig } from 'axios';
|
|
import { NEXT_PUBLIC_API_URL, NEXT_PUBLIC_SITE_URL } from '../config/constants';
|
|
import { getAuthorization, Logout } from './common';
|
|
|
|
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;
|