import type { CreateAxiosDefaults } from 'axios' import type { IAxiosRetryConfig } from 'axios-retry' import type { RequestOption } from './type' import { stringify } from 'qs' import { isHttpSuccess } from './shared' export function createDefaultOptions< ResponseData, ApiData = ResponseData, State extends Record = Record, >(options?: Partial>) { const opts: RequestOption = { defaultState: {} as State, transform: async response => response.data as unknown as ApiData, transformBackendResponse: async response => response.data as unknown as ApiData, onRequest: async config => config, isBackendSuccess: _response => true, onBackendFail: async () => {}, onError: async () => {}, } if (options?.transform) { opts.transform = options.transform } else { opts.transform = options?.transformBackendResponse || opts.transform } Object.assign(opts, options) return opts } export function createRetryOptions(config?: Partial) { const retryConfig: IAxiosRetryConfig = { retries: 0, } Object.assign(retryConfig, config) return retryConfig } export function createAxiosConfig(config?: Partial) { const TEN_SECONDS = 10 * 1000 const axiosConfig: CreateAxiosDefaults = { timeout: TEN_SECONDS, headers: { 'Content-Type': 'application/json', }, validateStatus: isHttpSuccess, paramsSerializer: (params) => { return stringify(params) }, } Object.assign(axiosConfig, config) return axiosConfig }