import { AnyAction, Dispatch, MiddlewareAPI } from 'redux'; export enum RequestStatus { PREPARING = 'PREPARING', INTENTED = 'INTENTED', PENDING = 'PENDING', SUCCESS = 'SUCCESS', FAILURE = 'FAILURE', ABORTED = 'ABORTED' } export enum RequestMethod { get = 'get', post = 'post', put = 'put', delete = 'delete', patch = 'patch' } export type ReduxAjaxParams = { [key: string]: any; url?: string | null; method?: RequestMethod; headers?: Record; credentials?: 'same-origin' | 'omit' | 'include'; body?: object; signal?: AbortSignal; }; export type ReduxAjaxRequest = ReduxAjaxParams & { abortController?: AbortController; status: RequestStatus; error: object | null; response: object | null; }; export type ReduxAjaxState = { [requestId: string]: ReduxAjaxRequest; }; export type ReduxAjaxGetState = () => { [key: string]: ReduxAjaxState; }; export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise; export type TransformData = (body: object) => BodyInit; export type AjaxMiddlewareConfig = { fetchFn: Fetch }; export type RequestCallbackHandlers = { onRequestSuccess?: (response: object) => void; onRequestFailure?: (error: object) => void; onRequestComplete?: () => void; onRequestAborted?: () => void; }; export type SubmitRequestParams = { isCached?: boolean; transformData?: TransformData; requestContent?: ReduxAjaxParams; }; export type AjaxSubmitRequestData = RequestCallbackHandlers & SubmitRequestParams; export type ReduxAjaxAction = { type: string; data: AjaxSubmitRequestData & { requestId: string }; }; export type MiddlewareHandlersParams = { store: MiddlewareAPI, object>; requestId: string; callback?: (data: object) => void; }; export type PrepareRequest = (params: { store: MiddlewareAPI, object>; action: ReduxAjaxAction; }) => void; export type GetRequestData = (params: { action: ReduxAjaxAction; store: MiddlewareAPI, object>; }) => ReduxAjaxRequest & { url: string; body: BodyInit }; export type GetRequestBody = (params: { method?: string; transformData?: TransformData; body?: object | BodyInit; }) => BodyInit | undefined;