UNPKG

@evolu/react

Version:

Evolu for React

19 lines (18 loc) 905 B
import { constVoid } from "@evolu/common"; import { emptyRows } from "@evolu/common/local-first"; import { useEffect, useMemo, useRef, useSyncExternalStore } from "react"; import { useEvolu } from "./useEvolu.js"; /** Subscribe to {@link Query} {@link QueryRows} changes. */ export const useQuerySubscription = (query, options = {}) => { const evolu = useEvolu(); // useRef to not break "rules-of-hooks" const { once } = useRef(options).current; if (once) { /* eslint-disable react-hooks/rules-of-hooks */ useEffect( // No useSyncExternalStore, no unnecessary updates. () => evolu.subscribeQuery(query)(constVoid), [evolu, query]); return evolu.getQueryRows(query); } return useSyncExternalStore(useMemo(() => evolu.subscribeQuery(query), [evolu, query]), useMemo(() => () => evolu.getQueryRows(query), [evolu, query]), () => emptyRows); };