import type { Dispatch, Middleware, MiddlewareAPI, UnknownAction } from 'redux' import type { BaseActionCreator, PayloadAction } from '../createAction' import type { GetState } from '../createAsyncThunk' import type { ExtractDispatchExtensions, FallbackIfUnknown } from '../tsHelpers' export type GetMiddlewareApi = MiddlewareAPI< GetDispatchType, GetState > export type MiddlewareApiConfig = { state?: unknown dispatch?: Dispatch } // TODO: consolidate with cAT helpers? export type GetDispatchType = MiddlewareApiConfig extends { dispatch: infer DispatchType } ? FallbackIfUnknown : Dispatch export type AddMiddleware< State = any, DispatchType extends Dispatch = Dispatch, > = { (...middlewares: Middleware[]): void withTypes(): AddMiddleware< GetState, GetDispatchType > } export type WithMiddleware< State = any, DispatchType extends Dispatch = Dispatch, > = BaseActionCreator< Middleware[], 'dynamicMiddleware/add', { instanceId: string } > & { []>( ...middlewares: Middlewares ): PayloadAction withTypes(): WithMiddleware< GetState, GetDispatchType > } export interface DynamicDispatch { // return a version of dispatch that knows about middleware []>( action: PayloadAction, ): ExtractDispatchExtensions & this } export type MiddlewareEntry< State = unknown, DispatchType extends Dispatch = Dispatch, > = { middleware: Middleware applied: Map< MiddlewareAPI, ReturnType> > } export type DynamicMiddleware< State = unknown, DispatchType extends Dispatch = Dispatch, > = Middleware export type DynamicMiddlewareInstance< State = unknown, DispatchType extends Dispatch = Dispatch, > = { middleware: DynamicMiddleware addMiddleware: AddMiddleware withMiddleware: WithMiddleware instanceId: string }