@taraai/read-write
Version:
Synchronous NoSQL/Firestore for React
60 lines (47 loc) • 2.4 kB
JavaScript
;
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);
}