UNPKG

redux-instate

Version:

These are multiple instances of the same component for your applications.

202 lines (167 loc) 5.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createActions = createActions; exports.stringToAction = stringToAction; exports.actionToString = actionToString; exports.mapState = mapState; exports.getState = getState; exports.updateInitState = updateInitState; exports.multiInitReducer = multiInitReducer; exports.mergeReducer = mergeReducer; exports.componentsState = componentsState; var _merge = _interopRequireDefault(require("lodash/merge")); var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Создаёт Action согласно переданным параметрам * @param {Object} actionTypes * @param {string} componentName * @returns action_types in upper case */ function createActions(actionTypes, componentName) { componentName = stringToAction(componentName); var update = Object.assign({}, actionTypes); for (var key in update) { update[key] = `components_${componentName}_${update[key]}`; } return update; } /** * Строка в camelCase к Action * @param {string} name * @returns LocaleUpperCase */ function stringToAction(name) { var update = ""; for (var index = 0; index < name.length; index++) { var element = name[index]; if (index === 0) { update = update + element; } else if (element == element.toUpperCase()) { update = update + "_" + element; } else { update = update + element; } } return update.toLocaleUpperCase(); } /** * Action написанный заглавными буквами через знак "_" * приводится к виду строки в формате javascript camelCase * @param {string} name */ function actionToString(name) { var update = ""; var array = name.split("_"); for (var index = 0; index < array.length; index++) { if (index === 0) { update = update + array[index].toLocaleLowerCase(); } else { var word = array[index].toLocaleLowerCase(); if (word.length > 1) word = word[0].toLocaleUpperCase() + word.slice(1);else word = word[0].toLocaleUpperCase(); update = update + word; } } return update; } /** * Проброс состояния компонента по параметрам, для контейнера * @param {*} states всё состояние * @param {*} componentName * @param {*} inst */ function mapState(states, componentName, inst) { var state = states["components"][componentName].find(i => i.inst == inst); if (state == undefined) { var newInitState = (0, _cloneDeep.default)(states["components"][componentName].find(i => i.inst == null)); newInitState.inst = inst; states["components"][componentName].push(newInitState); return states["components"][componentName].find(i => i.inst == inst); } else { return state; } } /** * Возвращает функцию для получения данных из текущего состояния * @param {*} componentName * @param {*} initState * @returns {*} getState функцию, использование - getState(states, inst) * @description возвращаемую функцию использовать так - getState(state).count++; */ function getState(componentName, initState) { return (states, inst) => { var state = states[componentName].find(i => i.inst == inst); if (state == undefined) { return states[componentName].push((0, _merge.default)({}, initState, { inst })); } else { return state; } }; } /** * Добавляет информацию об inst в стартовое состояние и может сделать его обновление * @param {*} initState * @param {*} inst * @param {*} updateState */ function updateInitState(initState, inst) { var updateState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return (0, _merge.default)({}, initState, { inst }, updateState); } /** * Выполняет сразу несколько инициализаций - actionTypes, getState * @param {*} actionTypes * @param {*} componentName * @param {*} initState * * @returns actionTypes, getState */ function multiInitReducer(actionTypes, componentName, initState) { return { actionTypes: createActions(actionTypes, componentName), getState: getState(componentName, initState) }; } /** * Объединение редьюсеров * @param {*} baseReducer основной редьюсер в который будут добавляться остальные * @param {...any} otherReducers добавляемые редьюсеры */ function mergeReducer(baseReducer) { for (var _len = arguments.length, otherReducers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { otherReducers[_key - 1] = arguments[_key]; } var reducers = otherReducers.map(i => i[2]); return Object.assign(baseReducer, ...reducers); } /** * Объединение initState всех редьюсеров согласно имен их компонентов * @param {...any} otherReducers */ function componentsState() { var components = {}; for (var _len2 = arguments.length, otherReducers = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { otherReducers[_key2] = arguments[_key2]; } var update = otherReducers.map(i => { var name = i[0]; var init = i[1]; return { name, init }; }); update.forEach(i => { if (!components[i.name]) { components[i.name] = []; } components[i.name].push(i.init); }); return components; }