UNPKG

@taraai/read-write

Version:

Synchronous NoSQL/Firestore for React

60 lines (47 loc) 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useRead; var _filter = _interopRequireDefault(require("lodash/filter")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _some = _interopRequireDefault(require("lodash/some")); var _react = require("react"); var _useFirestore = _interopRequireDefault(require("../redux-firebase/useFirestore")); var _query = require("../utils/query"); var _useCache = _interopRequireDefault(require("./useCache")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const getChanges = function () { let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; let prevData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; const result = {}; result.added = (0, _filter.default)(data, d => !(0, _some.default)(prevData, p => (0, _isEqual.default)(d, p))); result.removed = (0, _filter.default)(prevData, p => !(0, _some.default)(data, d => (0, _isEqual.default)(p, d))); return result; }; function useRead(queries) { let selection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; const firestore = (0, _useFirestore.default)(); const firestoreIsEnabled = !!firestore; const queryRef = (0, _react.useRef)(); const aliasRef = (0, _react.useRef)(); (0, _react.useEffect)(() => { const queryArray = Array.isArray(queries) ? queries : [queries]; if (!firestoreIsEnabled || (0, _isEqual.default)(queryArray, queryRef.current)) return; const changes = getChanges(queryArray, queryRef.current); queryRef.current = queryArray; aliasRef.current = queryRef.current.map(_query.getQueryName); firestore.unsetListeners(changes.removed); firestore.setListeners(changes.added); }, [aliasRef.current]); (0, _react.useEffect)(() => () => { if (!firestoreIsEnabled || !queryRef.current) return; queryRef.current = []; aliasRef.current = undefined; firestore.unsetListeners && firestore.unsetListeners(queryRef.current); }, []); if (selection === '::alias') { return Array.isArray(queries) ? queries.map(_query.getQueryName) : (0, _query.getQueryName)(queries); } return (0, _useCache.default)(Array.isArray(queries) ? queries.map(_query.getQueryName) : (0, _query.getQueryName)(queries), selection); }