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
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
|