@rest-api/react-models
Version:
[](https://www.npmjs.com/package/@rest-api/react-models) [](https://codecov.io/gh/hector7/rest-
123 lines (122 loc) • 7.35 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 BasicSearchReducer_1 = __importDefault(require("../../../reducers/BasicSearchReducer"));
const BasicSearchActions_1 = __importDefault(require("../../../actions/BasicSearchActions"));
const index_1 = require("../index");
const __1 = require("../../../../");
const react_redux_1 = require("react-redux");
class BasicSearchRestModel extends index_1.RestModel {
constructor(idModel, url) {
super(idModel.model, idModel._id, url, {
trailingSlash: idModel.trailingSlash,
headers: idModel.headers,
getItems: idModel.getItems,
getMetaData: idModel.getMetaData,
itemStructure: idModel.itemStructure
});
this._reducer = new BasicSearchReducer_1.default(idModel, url);
this._actions = new BasicSearchActions_1.default(idModel, url);
}
useInvalidate(queryString) {
return () => {
const dispatch = __1.useDispatch();
dispatch(this._actions.invalidate(queryString === null || queryString === void 0 ? void 0 : queryString.toString()));
};
}
useFetchIfNeeded(queryString) {
const dispatch = __1.useDispatch();
react_1.default.useEffect(() => {
dispatch(this._actions.fetchIfNeeded(queryString === null || queryString === void 0 ? void 0 : queryString.toString()));
});
}
useGet(queryString) {
const [result, setResult] = react_1.default.useState({ error: null, metadata: null, initialized: false, invalidated: true, loading: false, items: [], state: {} });
const reload = this.useInvalidate(queryString === null || queryString === void 0 ? void 0 : queryString.toString());
const state = __1.useSelector(state => {
const resultState = {
state,
items: this._reducer.get(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
metadata: this._reducer.getMetadata(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
loading: this._reducer.isFetching(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
initialized: this._reducer.isInitialized(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
invalidated: this._reducer.isInvalidated(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
error: this._reducer.getError(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
};
return resultState;
});
this.useFetchIfNeeded(queryString);
react_1.default.useEffect(() => {
const { items: currentItems } = state, currentState = __rest(state, ["items"]);
const { items: prevItems } = result, prevState = __rest(result, ["items"]);
if (!react_redux_1.shallowEqual(prevState, currentState))
setResult(state);
else if (currentItems.length !== prevItems.length)
setResult(state);
else if (currentItems.some((item, key) => {
return item !== this._reducer.get(prevState.state, queryString === null || queryString === void 0 ? void 0 : queryString.toString())[key];
}))
setResult(state);
});
const { state: currentSate } = state, other = __rest(state, ["state"]);
return Object.assign(Object.assign({}, other), { reload });
}
useFetchPopulatedIfNeeded(queryString) {
const dispatch = __1.useDispatch();
react_1.default.useEffect(() => {
dispatch(this._actions.fetchPopulatedIfNeeded(queryString === null || queryString === void 0 ? void 0 : queryString.toString()));
});
}
useGetPopulated(queryString) {
const reload = this.useInvalidate(queryString === null || queryString === void 0 ? void 0 : queryString.toString());
const [result, setResult] = react_1.default.useState({ error: null, initialized: false, metadata: null, populated: false, invalidated: true, loading: false, items: [], state: {} });
const state = __1.useSelector(state => {
const resultState = {
state,
populated: this._reducer.isPopulated(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
items: this._reducer.getPopulated(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
initialized: this._reducer.isInitialized(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
loading: this._reducer.isFetching(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
metadata: this._reducer.getMetadata(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
invalidated: this._reducer.isInvalidated(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
error: this._reducer.getError(state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()),
};
return resultState;
});
this.useFetchPopulatedIfNeeded(queryString);
react_1.default.useEffect(() => {
const { items: currentItems } = state, currentState = __rest(state, ["items"]);
const { items: prevItems } = result, prevState = __rest(result, ["items"]);
if (!react_redux_1.shallowEqual(prevState, currentState))
setResult(state);
else if (currentItems.length !== prevItems.length)
setResult(state);
else if (this._reducer.get(currentState.state, queryString === null || queryString === void 0 ? void 0 : queryString.toString()).some(item => {
let count = 0;
this.model.schema._getModelValuesToPopulate(item, (model, id) => {
if (this._reducer.getById(currentState.state, id) !== this._reducer.getById(prevState.state, id))
count++;
});
return count > 0;
}))
setResult(state);
});
const { state: currentSate } = state, other = __rest(state, ["state"]);
return Object.assign(Object.assign({}, other), { reload });
}
}
exports.default = BasicSearchRestModel;