import { createAlova, Method } from 'alova'; import adapterFetch from 'alova/fetch'; import VueHook from 'alova/vue'; import pinia, { useAccountStore } from '@/stores'; import router from '@/router'; const PharmacyHttpClient = createAlova({ requestAdapter: adapterFetch(), statesHook: VueHook, baseURL: `${ import.meta.env.SIX_API ?? '' }/manager/yfc-admin/`, async beforeRequest(method) { if (!method.config.meta?.ignoreToken) { method.config.headers.Authorization ??= useAccountStore(pinia).token; } }, responded: { async onSuccess(response, method) { if (response.status === 200) { return analysisResponseBody(response, method); } else { const message = response.statusText; throw method.meta?.exception?.(message, response, method) ?? message; } }, async onError(error, method) {}, async onComplete(method) {}, }, }); export default PharmacyHttpClient; async function analysisResponseBody(response: Response, method: Method) { const body = await response.json(); const { code, msg, data, ...external } = body; if (code === 401) { await nextTick(() => router.replace({ name: 'login' })); } if (code !== 200) throw method.meta?.exception?.(msg, response, method) ?? msg; ['success', 'warn', 'error'].forEach((key) => Reflect.deleteProperty(external, key)); return Array.isArray(data) ? Object.assign(data, external) : Object.assign({}, external, typeof data === 'string' ? { message: data } : data); }