You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
2.5 KiB
48 lines
2.5 KiB
4 months ago
|
import { __assign, __rest } from "tslib";
|
||
|
import * as React from "rehackt";
|
||
|
import { equal } from "@wry/equality";
|
||
|
import { mergeDeepArray } from "../../utilities/index.js";
|
||
|
import { useApolloClient } from "./useApolloClient.js";
|
||
|
import { useSyncExternalStore } from "./useSyncExternalStore.js";
|
||
|
import { useDeepMemo, useLazyRef } from "./internal/index.js";
|
||
|
export function useFragment(options) {
|
||
|
var cache = useApolloClient(options.client).cache;
|
||
|
var diffOptions = useDeepMemo(function () {
|
||
|
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"]);
|
||
|
return __assign(__assign({}, rest), { returnPartialData: true, id: typeof from === "string" ? from : cache.identify(from), query: cache["getFragmentDoc"](fragment, fragmentName), optimistic: optimistic });
|
||
|
}, [options]);
|
||
|
var resultRef = useLazyRef(function () {
|
||
|
return diffToResult(cache.diff(diffOptions));
|
||
|
});
|
||
|
// Used for both getSnapshot and getServerSnapshot
|
||
|
var getSnapshot = React.useCallback(function () { return resultRef.current; }, []);
|
||
|
return useSyncExternalStore(React.useCallback(function (forceUpdate) {
|
||
|
var lastTimeout = 0;
|
||
|
var unsubscribe = cache.watch(__assign(__assign({}, diffOptions), { immediate: true, callback: function (diff) {
|
||
|
if (!equal(diff.result, resultRef.current.data)) {
|
||
|
resultRef.current = diffToResult(diff);
|
||
|
// If we get another update before we've re-rendered, bail out of
|
||
|
// the update and try again. This ensures that the relative timing
|
||
|
// between useQuery and useFragment stays roughly the same as
|
||
|
// fixed in https://github.com/apollographql/apollo-client/pull/11083
|
||
|
clearTimeout(lastTimeout);
|
||
|
lastTimeout = setTimeout(forceUpdate);
|
||
|
}
|
||
|
} }));
|
||
|
return function () {
|
||
|
unsubscribe();
|
||
|
clearTimeout(lastTimeout);
|
||
|
};
|
||
|
}, [cache, diffOptions]), 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
|