redux-instate
Version:
These are multiple instances of the same component for your applications.
202 lines (167 loc) • 5.81 kB
JavaScript
;
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;
}