From 2d1cddedb643e89bd83e1156221eaf5cfb59d026 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Mon, 17 Sep 2018 08:32:52 -0700 Subject: [PATCH] Type the Redux store --- js/store.js | 48 --------------------------------------------- js/store.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 48 deletions(-) delete mode 100644 js/store.js create mode 100644 js/store.ts diff --git a/js/store.js b/js/store.js deleted file mode 100644 index 2e51367b..00000000 --- a/js/store.js +++ /dev/null @@ -1,48 +0,0 @@ -import { createStore, applyMiddleware } from "redux"; -import thunk from "redux-thunk"; -import { composeWithDevTools } from "redux-devtools-extension"; -import reducer from "./reducers"; -import mediaMiddleware from "./mediaMiddleware"; -import { merge } from "./utils"; -import { UPDATE_TIME_ELAPSED, STEP_MARQUEE } from "./actionTypes"; - -const compose = composeWithDevTools({ - actionsBlacklist: [UPDATE_TIME_ELAPSED, STEP_MARQUEE] -}); - -export default function( - media, - actionEmitter, - customMiddlewares = [], - stateOverrides, - extras -) { - let initialState; - if (stateOverrides) { - initialState = merge( - reducer(undefined, { type: "@@init" }), - stateOverrides - ); - } - - // eslint-disable-next-line no-unused-vars - const emitterMiddleware = store => next => action => { - actionEmitter.trigger(action.type, action); - return next(action); - }; - - return createStore( - reducer, - initialState, - compose( - applyMiddleware( - ...[ - thunk.withExtraArgument(extras), - mediaMiddleware(media), - emitterMiddleware, - ...customMiddlewares - ].filter(Boolean) - ) - ) - ); -} diff --git a/js/store.ts b/js/store.ts new file mode 100644 index 00000000..050f91de --- /dev/null +++ b/js/store.ts @@ -0,0 +1,56 @@ +import { createStore, applyMiddleware, DeepPartial } from "redux"; +import thunk from "redux-thunk"; +import { composeWithDevTools } from "redux-devtools-extension"; +import reducer from "./reducers"; +import mediaMiddleware from "./mediaMiddleware"; +import { merge } from "./utils"; +import { UPDATE_TIME_ELAPSED, STEP_MARQUEE } from "./actionTypes"; +import Media from "./media"; +import Emitter from "./emitter"; +import { Extras, MiddlewareStore, Dispatch, Action, AppState } from "./types"; + +const compose = composeWithDevTools({ + actionsBlacklist: [UPDATE_TIME_ELAPSED, STEP_MARQUEE] +}); + +export default function( + media: Media, + actionEmitter: Emitter, + customMiddlewares = [], + stateOverrides: DeepPartial, + extras: Extras +) { + let initialState; + if (stateOverrides) { + initialState = merge( + reducer(undefined, { type: "@@init" }), + stateOverrides + ); + } + + // eslint-disable-next-line no-unused-vars + const emitterMiddleware = (store: MiddlewareStore) => (next: Dispatch) => ( + action: Action + ) => { + actionEmitter.trigger(action.type, action); + return next(action); + }; + + const enhancer = compose( + applyMiddleware( + ...[ + thunk.withExtraArgument(extras), + mediaMiddleware(media), + emitterMiddleware, + ...customMiddlewares + ].filter(Boolean) + ) + ); + + // The Redux types are a bit confused, and don't realize that passing an + // undefined initialState is allowed. + const store = initialState + ? createStore(reducer, initialState, enhancer) + : createStore(reducer, enhancer); + return store; +}