UNPKG

@rest-api/react-models

Version:

[![npm version](https://img.shields.io/npm/v/@rest-api/react-models)](https://www.npmjs.com/package/@rest-api/react-models) [![codecov](https://codecov.io/gh/hector7/rest-api-react-models/branch/master/graph/badge.svg)](https://codecov.io/gh/hector7/rest-

141 lines (140 loc) 6.82 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.reducers = void 0; const redux_1 = require("redux"); const utils_1 = require("../reducers/utils"); exports.reducers = {}; class ReducerStorage { constructor() { this.reducers = {}; } static getInstance() { if (ReducerStorage.storage === undefined) { ReducerStorage.storage = new ReducerStorage(); } return ReducerStorage.storage; } static getReducerName() { let n_items = Object.keys(ReducerStorage.getInstance()).length; let generated_name = `rd_${++n_items}`; while (ReducerStorage.getInstance().reducers.hasOwnProperty(generated_name)) { generated_name = `rd_${++n_items}`; } return generated_name; } static addBasicIdReducer(modelName, id) { if (!ReducerStorage.getInstance().reducers.hasOwnProperty(modelName)) ReducerStorage.getInstance().reducers[modelName] = { ids: [], subComplexReducerNames: [] }; if (ReducerStorage.getInstance().reducers[modelName].ids.indexOf(id) < 0) ReducerStorage.getInstance().reducers[modelName].ids.push(id); } static addComplexReducer(modelName, reducerName) { if (!ReducerStorage.getInstance().reducers.hasOwnProperty(modelName)) ReducerStorage.getInstance().reducers[modelName] = { ids: [], subComplexReducerNames: [] }; ReducerStorage.getInstance().reducers[modelName].subComplexReducerNames.push(reducerName); } getReducerByModelName(modelName, complexReducers) { return (state = { ids: {}, searchs: {}, derived: {} }, action) => { if (action.reducerName) { if (action.reducerName === modelName) { switch (action.type) { case 'REQUEST': return utils_1.storeRequest(state, action.uri, { isFetching: true, didInvalidate: false, initialized: true }); case 'FAILED': return utils_1.storeRequest(state, action.uri, { isFetching: false, didInvalidate: false, error: action.error }); case 'INVALIDATE_ALL': return utils_1.mapAllRequest(state, req => (Object.assign(Object.assign({}, req), { didInvalidate: true }))); case 'INVALIDATE': return utils_1.storeRequest(state, action.uri, { didInvalidate: true }); case 'RECEIVE': const lastUpdated = new Date(); return Object.assign(utils_1.storeRequest(state, action.uri, { isFetching: false, didInvalidate: false, lastUpdated, result: { ids: action.items.map((i) => i[action.idKey]), metadata: action.metadata }, initialized: true }), { ids: utils_1.storeItems(state, this.reducers[modelName].ids, lastUpdated, action.items) }); case 'REQUEST_ID': return utils_1.storeIdRequest(state, action.idKey, action.id, { isFetching: true, didInvalidate: false, initialized: true }); case 'FAILED_ID': return utils_1.storeIdRequest(state, action.idKey, action.id, { isFetching: false, error: action.error }); case 'INVALIDATE_ID': return utils_1.storeIdRequest(state, action.idKey, action.id, { didInvalidate: true }); case 'REMOVE_ID': const _a = state.ids[action.idKey], _b = action.id, idRemoved = _a[_b], otherIds = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]); return Object.assign({}, state, { ids: Object.assign({}, state.ids, { [action.idKey]: Object.assign({}, otherIds) }) }); case 'RECEIVE_ID': return utils_1.storeItem(state, action.data, this.reducers[modelName].ids, new Date()); } } if (complexReducers.indexOf(action.reducerName)) { return Object.assign({}, state, { derived: Object.assign({}, state.derived, { [action.reducerName]: Object.assign({}, state.derived[action.reducerName], { [action.optKey]: this.getReducerByModelName(modelName, []) }) }) }); } } return state; }; } get reducer() { if (Object.keys(this.reducers).length === 0) { console.warn('@rest-api/react-models without any models. Has imported yet?'); return (state) => state; } return redux_1.combineReducers(Object.keys(this.reducers).map(modelName => ({ modelName, reducer: this.getReducerByModelName(modelName, this.reducers[modelName].subComplexReducerNames) })).reduce((res, next) => { res[next.modelName] = next.reducer; return res; }, {})); } static get generalReducer() { return ReducerStorage.getInstance().reducer; } } exports.default = ReducerStorage;