@rest-api/react-models
Version:
[](https://www.npmjs.com/package/@rest-api/react-models) [](https://codecov.io/gh/hector7/rest-
92 lines (91 loc) • 2.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.State = exports.ModelState = void 0;
const INIT_REQUEST = {
didInvalidate: true,
error: null,
isFetching: false,
lastUpdated: null,
result: null,
initialized: false
};
class ModelState {
constructor(r) {
this.observers = [];
this._state = { searchs: {}, ids: {} };
this.model = r.model;
}
get modelName() {
return this.model.name;
}
get state() {
return this._state;
}
addKeyModel(key) {
if (!this._state.ids.hasOwnProperty(key))
this._state.ids[key] = {};
}
attach(observer) {
this.observers.push(observer);
}
detach(observer) {
this.observers = this.observers.splice(this.observers.indexOf(observer), 1);
}
notify() {
this.observers.forEach(o => o.update(this));
}
getRequest(url) {
const request = this._state.searchs[url];
if (request === undefined) {
return INIT_REQUEST;
}
return request;
}
getRequestById(key, id) {
const request = this._state.ids[key][id];
if (request === undefined) {
return INIT_REQUEST;
}
return request;
}
/**
* updateGet for an internal use
*/
updateGet(url, request) {
const modelBranchSearchs = this._state.searchs;
this._state.searchs = Object.assign(Object.assign({}, modelBranchSearchs), { [url]: Object.assign(Object.assign({}, INIT_REQUEST), request) });
}
/**
* updateGetById for an internal use
*/
updateGetById(key, id, request) {
const modelBranchIds = this._state.ids[key];
this._state.ids[key] = Object.assign(Object.assign({}, modelBranchIds), { [id]: Object.assign(Object.assign({}, INIT_REQUEST), request) });
}
}
exports.ModelState = ModelState;
class State {
constructor() {
this.observers = [];
this._state = {};
}
//TODO attach to all modelstates.
get state() {
return this._state;
}
attach(observer) {
this.observers.push(observer);
}
detach(observer) {
this.observers = this.observers.splice(this.observers.indexOf(observer), 1);
}
notify() {
this.observers.forEach(o => o.update(this));
}
update(subject) {
this.state[subject.modelName] = subject.state;
this.notify();
}
}
exports.State = State;
exports.default = new State();