tandem-front-end
Version:
Visual editor for web components
73 lines (66 loc) • 2.07 kB
text/typescript
import "./scss/all.scss";
import { applyMiddleware, createStore, Reducer, Action } from "redux";
import { default as createSagaMiddleware } from "redux-saga";
import { fork, call } from "redux-saga/effects";
import { rootReducer } from "./reducers";
import { createRootSaga, FrontEndSagaOptions } from "./sagas";
import {
createPaperclipSaga,
PAPERCLIP_MIME_TYPE,
PAPERCLIP_DEFAULT_EXTENSIONS,
PaperclipSagaOptions,
Frame,
DependencyGraph
} from "paperclip";
import { RootState } from "./state";
import { appLoaded } from "./actions";
import {
FSSandboxOptions,
createFSSandboxSaga,
setReaderMimetype
} from "fsbox";
export type FrontEndOptions = FrontEndSagaOptions &
FSSandboxOptions &
PaperclipSagaOptions;
export type SideEffectCreator = () => IterableIterator<FrontEndOptions>;
export const setup = <TState extends RootState>(
createSideEffects: SideEffectCreator,
reducer?: Reducer<TState>,
saga?: () => IterableIterator<any>
) => {
return (initialState: TState) => {
const sagaMiddleware = createSagaMiddleware();
const store = createStore(
(state: TState, event: Action) => {
state = rootReducer(state, event) as TState;
if (reducer) {
state = reducer(state, event);
}
return state;
},
initialState,
applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(function*() {
let { readFile, writeFile, openPreview, getPaperclipUris } = yield call(
createSideEffects
);
readFile = setReaderMimetype(
PAPERCLIP_MIME_TYPE,
PAPERCLIP_DEFAULT_EXTENSIONS
)(readFile);
yield fork(createRootSaga({ openPreview }));
if (saga) {
yield fork(saga);
yield fork(createFSSandboxSaga({ readFile, writeFile }));
yield fork(createPaperclipSaga({ getPaperclipUris }));
}
});
store.dispatch(appLoaded());
};
};
export const init = (initialState: RootState) => {};
export * from "paperclip";
export * from "./state";
export * from "./actions";
export * from "tandem-common";