// Port of @reduxjs/toolkit@2.12.0 dynamicMiddleware/react. The middleware core // is reused verbatim; only the dispatch-hook factory swaps react-redux for the // octane binding. import type { DynamicMiddlewareInstance, GetDispatch, GetState, MiddlewareApiConfig, TSHelpersExtractDispatchExtensions, } from '@reduxjs/toolkit'; import { createDynamicMiddleware as createCoreDynamicMiddleware } from '@reduxjs/toolkit'; import type { Context } from 'octane'; import type { ReactReduxContextValue } from '@octanejs/redux'; import { createDispatchHook, ReactReduxContext, useDispatch as useDefaultDispatch, } from '@octanejs/redux'; import type { Action, Dispatch, Middleware, UnknownAction } from 'redux'; export type UseDispatchWithMiddlewareHook< Middlewares extends Middleware[] = [], State = any, DispatchType extends Dispatch = Dispatch, > = () => TSHelpersExtractDispatchExtensions & DispatchType; export type CreateDispatchWithMiddlewareHook< State = any, DispatchType extends Dispatch = Dispatch, > = { < Middlewares extends [ Middleware, ...Middleware[], ], >( ...middlewares: Middlewares ): UseDispatchWithMiddlewareHook; withTypes(): CreateDispatchWithMiddlewareHook< GetState, GetDispatch >; }; type ActionFromDispatch> = DispatchType extends Dispatch ? DispatchedAction : never; type OctaneDynamicMiddlewareInstance< State = any, DispatchType extends Dispatch = Dispatch, > = DynamicMiddlewareInstance & { createDispatchWithMiddlewareHookFactory: ( context?: Context> | null>, ) => CreateDispatchWithMiddlewareHook; createDispatchWithMiddlewareHook: CreateDispatchWithMiddlewareHook; }; export const createDynamicMiddleware = < State = any, DispatchType extends Dispatch = Dispatch, >(): OctaneDynamicMiddlewareInstance => { const instance = createCoreDynamicMiddleware(); const createDispatchWithMiddlewareHookFactory = ( context: Context > | null> = ReactReduxContext as Context > | null>, ) => { const useDispatch = context === ReactReduxContext ? useDefaultDispatch : createDispatchHook>(context as any); function createDispatchWithMiddlewareHook< Middlewares extends Middleware[], >(...middlewares: Middlewares) { instance.addMiddleware(...middlewares); return useDispatch; } createDispatchWithMiddlewareHook.withTypes = () => createDispatchWithMiddlewareHook; return createDispatchWithMiddlewareHook as CreateDispatchWithMiddlewareHook< State, DispatchType >; }; const createDispatchWithMiddlewareHook = createDispatchWithMiddlewareHookFactory(); return { ...instance, createDispatchWithMiddlewareHookFactory, createDispatchWithMiddlewareHook, }; };