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-

106 lines (105 loc) 4.63 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 __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;