rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
99 lines (98 loc) • 2.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useRxQuery = useRxQuery;
exports.useRxQueryBase = useRxQueryBase;
var _react = require("react");
var _rxCollection = require("../../../rx-collection.js");
var _useRxCollection = require("./use-rx-collection.js");
var _rxError = require("../../../rx-error.js");
/**
* React hook to query an RxDB collection with Mango queries.
*
* @param {UseRxQueryOptions<RxDocumentType, OrmMethods, StaticMethods, InstanceCreationOptions, Reactivity>} options - Options for the query.
* @param {string|RxCollection} options.collection - The collection name or instance to query.
* @param {MangoQuery<RxDocumentType>} options.query - The Mango query to execute.
* @param {boolean} [options.live] - Whether to subscribe to live query updates.
*
* @returns {UseRxQueryResult<RxDocumentType, OrmMethods>} The query result, loading state, and error.
*/
function useRxQueryBase({
collection,
query,
live
}) {
var [results, setResults] = (0, _react.useState)([]);
var [loading, setLoading] = (0, _react.useState)(false);
var [error, setError] = (0, _react.useState)(null);
var dbCollection;
if (typeof collection === 'string') {
dbCollection = (0, _useRxCollection.useRxCollection)(collection);
} else {
if (!(0, _rxCollection.isRxCollection)(collection)) {
throw (0, _rxError.newRxError)('R3', {
collection
});
}
dbCollection = collection;
}
window.collection = dbCollection;
var emitResults = res => {
setResults(res);
if (loading) {
setLoading(false);
}
};
var emitError = e => {
setError(e.message);
if (loading) {
setLoading(false);
}
};
var runQuery = (0, _react.useCallback)(async () => {
if (dbCollection == null) {
return;
}
setError(null);
setLoading(loading);
var rxQuery = dbCollection.find(query);
if (live) {
var subscription = rxQuery.$.subscribe({
next: res => emitResults(res),
error: err => emitError(err)
});
return () => {
subscription.unsubscribe();
};
} else {
try {
emitResults(await rxQuery.exec());
} catch (e) {
emitError(e);
}
}
}, [dbCollection, query]);
(0, _react.useEffect)(() => {
if (collection == null) {
return;
}
runQuery();
}, [runQuery]);
return {
results,
loading,
error
};
}
function useRxQuery({
collection,
query
}) {
return useRxQueryBase({
collection,
query,
live: false
});
}
//# sourceMappingURL=use-rx-query.js.map