UNPKG

@talend/react-containers

Version:

Provide connected components aka containers for @talend/react-cmf based on @talend/react-components.

55 lines (53 loc) 1.97 kB
import api from '@talend/react-cmf'; import { delay, call, select, all, take } from 'redux-saga/effects'; import invariant from 'invariant'; export const ACTION_CREATORS = 'actionCreators'; export const SAGAS = 'sagas'; export const WAIT_FOR = 'waitFor'; export const TAKE_ACTION = 'takeAction'; /** * This function wait until a collection is here * @param {string} collectionName the name of the collection * @param {int} interval the interval to check again if the collection is there */ export function* waitFor(collectionName, interval = 10) { // eslint-disable-next-line no-constant-condition while (true) { const collection = yield select(api.selectors.collections.get, collectionName); if (collection !== undefined) { break; } yield delay(interval); } } /** * This function handle a specific step * @param {object} step a bootstrap step that could contain a actionCreator list or a waitList */ export function* handleStep(step) { if (step[SAGAS]) { return yield all(step[SAGAS].map(saga => call(api.sagas.get(saga)))); } if (step[ACTION_CREATORS]) { return yield all(step[ACTION_CREATORS].map(actionCreator => api.sagas.putActionCreator(actionCreator))); } else if (step[WAIT_FOR]) { return yield all(step[WAIT_FOR].map(collectionName => call(waitFor, collectionName))); } else if (step[TAKE_ACTION]) { return yield all(step[TAKE_ACTION].map(actionName => take(actionName, actionName))); } return invariant(process.env.NODE_ENV !== 'production', `Step object must have ${ACTION_CREATORS} or ${WAIT_FOR} attribute`); } /** * This saga load the actionCreator or wait on some steps * @param {object} props the saga props * @param {array} props.steps an array of steps to handle */ export function* appLoaderSaga({ steps }) { // eslint-disable-next-line no-restricted-syntax for (const step of steps) { yield call(handleStep, step); } } //# sourceMappingURL=AppLoader.saga.js.map