reactopod
Version:
React Hooks for Typesaurus, type-safe Firestore ODM
55 lines (54 loc) • 1.87 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true })
const cursor_1 = require('typesaurus/cursor')
const limit_1 = require('typesaurus/limit')
const order_1 = require('typesaurus/order')
const query_1 = require('typesaurus/query')
const adaptor_1 = require('../adaptor')
function useInfiniteQuery(collection, queries, options) {
var _a
const [result, setResult] = adaptor_1.useState(undefined)
const [cursor, setCursor] = adaptor_1.useState(undefined)
const [loadedAll, setLoadedAll] = adaptor_1.useState(false)
const cursorsMap = adaptor_1.useRef({})
const cursorId =
((_a = cursor) === null || _a === void 0 ? void 0 : _a.ref.id) || 'initial'
const deps = [JSON.stringify(collection), JSON.stringify(queries), cursorId]
adaptor_1.useEffect(() => {
if (queries) {
if (cursorsMap.current[cursorId] === undefined) {
cursorsMap.current[cursorId] = 'loading'
query_1
.query(
collection,
queries.concat([
order_1.order(
options.field,
options.method || 'asc',
cursor ? [cursor_1.startAfter(cursor)] : []
),
limit_1.limit(options.limit)
])
)
.then(newResult => {
cursorsMap.current[cursorId] = 'loaded'
if (newResult.length === 0 || newResult.length < options.limit)
setLoadedAll(true)
setResult((result || []).concat(newResult))
})
}
} else if (result) {
setResult(undefined)
}
}, deps)
const loadMore = loadedAll
? null
: result && cursorsMap.current[cursorId] === 'loaded'
? () => {
setCursor(result[result.length - 1])
}
: undefined
return [result, loadMore]
}
exports.default = useInfiniteQuery
//# sourceMappingURL=index.js.map