@rest-api/react-models
Version:
[](https://www.npmjs.com/package/@rest-api/react-models) [](https://codecov.io/gh/hector7/rest-
141 lines (140 loc) • 6.82 kB
JavaScript
;
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;