From 11b9c93cbcdb35ce6b5c0827ccbe58fd36959b9e Mon Sep 17 00:00:00 2001 From: Robert Jaros Date: Tue, 19 Mar 2019 16:11:24 +0100 Subject: Fix async action handling in ReduxStore --- .../kotlin/pl/treksoft/kvision/redux/ReduxStore.kt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'kvision-modules/kvision-redux/src/main/kotlin') diff --git a/kvision-modules/kvision-redux/src/main/kotlin/pl/treksoft/kvision/redux/ReduxStore.kt b/kvision-modules/kvision-redux/src/main/kotlin/pl/treksoft/kvision/redux/ReduxStore.kt index 4c4f5cc5..47d2c3c8 100644 --- a/kvision-modules/kvision-redux/src/main/kotlin/pl/treksoft/kvision/redux/ReduxStore.kt +++ b/kvision-modules/kvision-redux/src/main/kotlin/pl/treksoft/kvision/redux/ReduxStore.kt @@ -34,12 +34,13 @@ import redux.rEnhancer typealias Dispatch = (A) -> WrapperAction typealias GetState = () -> S +typealias ActionCreator = (Dispatch, GetState) -> Unit /** * An inline helper function for creating Redux store. * * @param reducer a reducer function - * @param state an initial state + * @param initialState an initial state * @param middlewares a list of optional Redux JS middlewares */ @UseExperimental(ImplicitReflectionSerializer::class) @@ -60,7 +61,7 @@ inline fun createReduxStore( * @param S redux state type (@Serializable) * @param A redux action type * @param reducer a reducer function - * @param state an initial state + * @param initialState an initial state * @param stateSerializer a serializer for the state type * @param middlewares a list of optional Redux JS middlewares */ @@ -107,9 +108,17 @@ class ReduxStore( /** * Dispatches an asynchronous action function. */ - fun dispatch(action: (Dispatch, GetState) -> Unit): WrapperAction { - return store.dispatch({ d: Dispatch, g: GetState -> - action(d, { JSON.plain.parse(stateSerializer, g()) }) + fun dispatch(actionCreator: ActionCreator): WrapperAction { + return store.dispatch({ reduxDispatch: Dispatch, reduxGetState: GetState -> + val newDispatch: Dispatch = { elem -> + @Suppress("UnsafeCastFromDynamic") + if (js("typeof elem === 'function'")) { + dispatch(actionCreator = elem) + } else { + reduxDispatch(elem) + } + } + actionCreator(newDispatch, { JSON.plain.parse(stateSerializer, reduxGetState()) }) }) } -- cgit