UNPKG

@apollo/client

Version:

A fully-featured caching GraphQL client.

39 lines 1.9 kB
import { __assign, __rest } from "tslib"; import { useRef } from "react"; import { equal } from "@wry/equality"; import { mergeDeepArray } from "../../utilities/index.js"; import { useApolloClient } from "./useApolloClient.js"; import { useSyncExternalStore } from "./useSyncExternalStore.js"; export function useFragment_experimental(options) { var cache = useApolloClient().cache; var fragment = options.fragment, fragmentName = options.fragmentName, from = options.from, _a = options.optimistic, optimistic = _a === void 0 ? true : _a, rest = __rest(options, ["fragment", "fragmentName", "from", "optimistic"]); var diffOptions = __assign(__assign({}, rest), { id: typeof from === "string" ? from : cache.identify(from), query: cache["getFragmentDoc"](fragment, fragmentName), optimistic: optimistic }); var resultRef = useRef(); var latestDiff = cache.diff(diffOptions); var getSnapshot = function () { var latestDiffToResult = diffToResult(latestDiff); return resultRef.current && equal(resultRef.current.data, latestDiffToResult.data) ? resultRef.current : (resultRef.current = latestDiffToResult); }; return useSyncExternalStore(function (forceUpdate) { return cache.watch(__assign(__assign({}, diffOptions), { immediate: true, callback: function (diff) { if (!equal(diff, latestDiff)) { resultRef.current = diffToResult((latestDiff = diff)); forceUpdate(); } } })); }, getSnapshot, getSnapshot); } function diffToResult(diff) { var result = { data: diff.result, complete: !!diff.complete, }; if (diff.missing) { result.missing = mergeDeepArray(diff.missing.map(function (error) { return error.missing; })); } return result; } //# sourceMappingURL=useFragment.js.map