import { interceptorRejected, interceptorsRequestBasePath, interceptorsRequestResponse, interceptorsResponse, } from 'api'; import { ENVIRONMENT } from 'constants/env'; import axios, { AxiosError, AxiosRequestConfig } from 'axios'; // generated API Instance const generatedAPIAxiosInstance = axios.create({ baseURL: ENVIRONMENT.baseURL, }); let generatedAPIQueryKeyHeaderContext: Record | undefined; export const setGeneratedAPIQueryKeyHeaderContext = ( headers?: THeaders, ): void => { generatedAPIQueryKeyHeaderContext = headers ? { ...(headers as Record) } : undefined; }; const hashHeaderValue = (value: string): string => { let hash = 0; for (let index = 0; index < value.length; index += 1) { hash = (hash * 31 + value.charCodeAt(index)) >>> 0; } return hash.toString(16); }; const mergeHeaderRecord = ( target: Record, source: unknown, ): Record => { if (!source || typeof source !== 'object') { return target; } return Object.assign(target, source as Record); }; export const GeneratedAPIInstance = ( config: AxiosRequestConfig, ): Promise => { return generatedAPIAxiosInstance({ ...config }).then(({ data }) => data); }; generatedAPIAxiosInstance.interceptors.request.use(interceptorsRequestBasePath); generatedAPIAxiosInstance.interceptors.request.use(interceptorsRequestResponse); generatedAPIAxiosInstance.interceptors.request.use(interceptorsRequestBasePath); generatedAPIAxiosInstance.interceptors.response.use( interceptorsResponse, interceptorRejected, ); const getDefaultQueryKeyHeaders = (): Record => { const defaults = generatedAPIAxiosInstance.defaults .headers as unknown as Record; const headers: Record = {}; const methodKeys = new Set([ 'common', 'delete', 'get', 'head', 'options', 'patch', 'post', 'put', ]); mergeHeaderRecord(headers, defaults?.common); mergeHeaderRecord(headers, defaults?.get); for (const [key, value] of Object.entries(defaults ?? {})) { if (!methodKeys.has(key)) { headers[key] = value; } } return headers; }; export const getGeneratedAPIQueryKeyHeaders = ( headers?: THeaders, ): [{ headers: Record }] | [] => { const mergedHeaders = { ...getDefaultQueryKeyHeaders(), ...generatedAPIQueryKeyHeaderContext, ...(headers as Record | undefined), }; const queryKeyHeaders = Object.fromEntries( Object.entries(mergedHeaders) .filter(([, value]) => value !== undefined) .sort(([left], [right]) => left.localeCompare(right)) .map(([key, value]) => { if (key.toLowerCase() === 'authorization' && typeof value === 'string') { return [key, hashHeaderValue(value)]; } return [key, value]; }), ); return Object.keys(queryKeyHeaders).length ? [{ headers: queryKeyHeaders }] : []; }; export type ErrorType = AxiosError; export type BodyType = BodyData;