@rest-api/react-models
Version:
[](https://www.npmjs.com/package/@rest-api/react-models) [](https://codecov.io/gh/hector7/rest-
106 lines (105 loc) • 4.63 kB
JavaScript
"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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = __importDefault(require("react"));
const __1 = require("..");
const BasicIdReducer_1 = __importDefault(require("../../../reducers/BasicIdReducer"));
const BasicIdActions_1 = __importDefault(require("../../../actions/BasicIdActions"));
const __2 = require("../../../../");
const react_redux_1 = require("react-redux");
class BasicIdRestModel extends __1.RestModel {
constructor(basicRestModel, id, url) {
super(basicRestModel.model, id, url, {
trailingSlash: basicRestModel.trailingSlash,
headers: basicRestModel.headers,
getItems: basicRestModel.getItems,
getMetaData: basicRestModel.getMetaData,
itemStructure: basicRestModel.itemStructure
});
super.addBasicIdReducer(id);
this._actions = new BasicIdActions_1.default(this);
this._reducer = new BasicIdReducer_1.default(this);
}
useInvalidate(id) {
return () => {
const dispatch = __2.useDispatch();
dispatch(this._actions.invalidateById(id));
};
}
useInvalidateAll() {
return () => {
const dispatch = __2.useDispatch();
dispatch(this._actions.invalidateAll());
};
}
useFetchByIdIfNeeded(id) {
const dispatch = __2.useDispatch();
react_1.default.useEffect(() => {
dispatch(this._actions.fetchByIdIfNeeded(id));
});
}
useGetById(id) {
const [result, setResult] = react_1.default.useState({ error: null, initialized: false, invalidated: true, loading: false, item: null });
const redirect = this.useInvalidate(id);
const state = __2.useSelector(state => {
const resultState = {
item: this._reducer.getById(state, id),
loading: this._reducer.isIdFetching(state, id),
initialized: this._reducer.isIdInitialized(state, id),
invalidated: this._reducer.isIdInvalidated(state, id),
error: this._reducer.getIdError(state, id),
};
return resultState;
});
this.useFetchByIdIfNeeded(id);
react_1.default.useEffect(() => {
if (!react_redux_1.shallowEqual(state, result))
setResult(state);
});
return Object.assign(Object.assign({}, result), { redirect });
}
useFetchByIdPopulatedIfNeeded(id) {
const dispatch = __2.useDispatch();
react_1.default.useEffect(() => {
dispatch(this._actions.fetchByIdPopulatedIfNeeded(id));
});
}
useGetByIdPopulated(id) {
const [result, setResult] = react_1.default.useState({ error: null, populated: false, initialized: false, invalidated: true, loading: false, item: null });
const redirect = this.useInvalidate(id);
const state = __2.useSelector(state => {
const resultState = {
item: this._reducer.getByIdPopulated(state, id),
loading: this._reducer.isIdFetching(state, id),
populated: this._reducer.isIdPopulated(state, id),
initialized: this._reducer.isIdInitialized(state, id),
invalidated: this._reducer.isIdInvalidated(state, id),
error: this._reducer.getIdError(state, id),
};
return resultState;
});
this.useFetchByIdPopulatedIfNeeded(id);
react_1.default.useEffect(() => {
const { item: newItem } = state, newOthers = __rest(state, ["item"]);
const { item } = result, others = __rest(result, ["item"]);
if (!react_redux_1.shallowEqual(newOthers, others) || (newItem && !item) || state.populated !== result.populated) {
setResult(state);
}
});
return Object.assign(Object.assign({}, result), { redirect });
}
}
exports.default = BasicIdRestModel;