UNPKG

core-native

Version:

A lightweight framework based on React Native + Redux + Redux Saga, in strict TypeScript.

63 lines (56 loc) 2.3 kB
import {applyMiddleware, compose, createStore, Store, StoreEnhancer} from "redux"; import createSagaMiddleware, {SagaMiddleware} from "redux-saga"; import {takeEvery} from "redux-saga/effects"; import {LoggerImpl, LoggerConfig, Logger} from "./Logger"; import {ActionHandler, ErrorHandler, executeAction} from "./module"; import {Action, LOADING_ACTION, rootReducer, State} from "./reducer"; import {captureError} from "./util/error-util"; declare const window: any; interface App { readonly store: Store<State>; readonly sagaMiddleware: SagaMiddleware<any>; readonly actionHandlers: {[actionType: string]: ActionHandler}; readonly logger: LoggerImpl; loggerConfig: LoggerConfig | null; errorHandler: ErrorHandler; } export const app = createApp(); export const logger: Logger = app.logger; function composeWithDevTools(enhancer: StoreEnhancer): StoreEnhancer { let composeEnhancers = compose; if (process.env.NODE_ENV === "development") { const extension = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__; if (extension) { composeEnhancers = extension({ // Ref: https://github.com/zalmoxisus/redux-devtools-extension/blob/master/docs/API/Arguments.md actionsBlacklist: [LOADING_ACTION], }); } } return composeEnhancers(enhancer); } function createApp(): App { const eventLogger = new LoggerImpl(); const sagaMiddleware = createSagaMiddleware({ onError: (error, info) => captureError(error, "@@framework/detached-saga", {extraStacktrace: info.sagaStack}), }); const store: Store<State> = createStore(rootReducer(), composeWithDevTools(applyMiddleware(sagaMiddleware))); sagaMiddleware.run(function* () { yield takeEvery("*", function* (action: Action<any>) { const handler = app.actionHandlers[action.type]; if (handler) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore yield* executeAction(action.type, handler, ...action.payload); } }); }); return { store, sagaMiddleware, actionHandlers: {}, logger: eventLogger, loggerConfig: null, *errorHandler() {}, }; }