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-

123 lines (122 loc) 7.35 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; }; 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;