import { request as _request } from "../wx/network"; const shareRequestCache = new Map>(); export function createRequest(option: IRequestCreateConfig) { const { baseURL } = option; return async (config: IRequestConfig) => { let { url, data, params, header, meta, transform = (params: any) => params, shareRequest, ..._config } = config; if (config.method === 'GET') { data = params; } else if (params) { const query = Object.entries(params).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) url += `?${query.join('&')}` } const key = url; if (shareRequest && shareRequestCache.has(key)) { return shareRequestCache.get(key) as unknown as PromiseLike>; } header ??= {}; header['Authorization'] = meta?.ignoreToken ? '' : await option.token?.() ?? ''; header['patientId'] = wx.getStorageSync('patientId') ?? ''; header['doctorId'] = wx.getStorageSync('doctorId') ?? ''; const promise = _request>({ url: /https?\:\/\//.test(url) ? url : `${baseURL}${url}`, header, data, ..._config, }).then(response => { if (response.statusCode === 200) { if (response.data.code === 200 && response.data.success !== false) return transform({ data: response.data.data, header: response.header }); throw { errMsg: response.data.msg || `app:${response.data.code}`, errno: `060202${response.data.code}` } } throw { errMsg: `${response.errMsg}:${response.statusCode}`, errno: `060201${response.statusCode}` } }); if (shareRequest) shareRequestCache.set(key, promise); return promise; } }