@apollo/client
Version:
A fully-featured caching GraphQL client.
136 lines (123 loc) • 3.82 kB
JavaScript
import { c as _c } from "@apollo/client/react/internal/compiler-runtime";
import * as React from "react";
import { assertWrappedQueryRef, getWrappedPromise, unwrapQueryRef, updateWrappedQueryRef, } from "@apollo/client/react/internal";
import { __use, wrapHook } from "./internal/index.js";
import { useApolloClient } from "./useApolloClient.js";
import { useSyncExternalStore } from "./useSyncExternalStore.js";
/**
* For a detailed explanation of `useReadQuery`, see the [fetching with Suspense reference](https://www.apollographql.com/docs/react/data/suspense#avoiding-request-waterfalls).
*
* @param queryRef - The `QueryRef` that was generated via `useBackgroundQuery`.
* @returns An object containing the query result data, error, and network status.
*
* @example
*
* ```jsx
* import { Suspense } from "react";
* import { useBackgroundQuery, useReadQuery } from "@apollo/client";
*
* function Parent() {
* const [queryRef] = useBackgroundQuery(query);
*
* return (
* <Suspense fallback={<div>Loading...</div>}>
* <Child queryRef={queryRef} />
* </Suspense>
* );
* }
*
* function Child({ queryRef }) {
* const { data } = useReadQuery(queryRef);
*
* return <div>{data.name}</div>;
* }
* ```
*/
export function useReadQuery(queryRef) {
"use no memo";
const unwrapped = unwrapQueryRef(queryRef);
const clientOrObsQuery = useApolloClient(unwrapped ?
// passing an `ObservableQuery` is not supported by the types, but it will
// return any truthy value that is passed in as an override so we cast the result
unwrapped["observable"]
: undefined);
return wrapHook("useReadQuery", useReadQuery_, clientOrObsQuery)(queryRef);
}
function useReadQuery_(queryRef) {
const $ = _c(17);
assertWrappedQueryRef(queryRef);
let t0;
if ($[0] !== queryRef) {
t0 = unwrapQueryRef(queryRef);
$[0] = queryRef;
$[1] = t0;
} else {
t0 = $[1];
}
const internalQueryRef = t0;
let t1;
if ($[2] !== queryRef) {
t1 = () => getWrappedPromise(queryRef);
$[2] = queryRef;
$[3] = t1;
} else {
t1 = $[3];
}
const getPromise = t1;
if (internalQueryRef.disposed) {
internalQueryRef.reinitialize();
updateWrappedQueryRef(queryRef, internalQueryRef.promise);
}
let t2;
let t3;
if ($[4] !== internalQueryRef) {
t2 = () => internalQueryRef.retain();t3 = [internalQueryRef];
$[4] = internalQueryRef;
$[5] = t2;
$[6] = t3;
} else {
t2 = $[5];
t3 = $[6];
}
React.useEffect(t2, t3);
let t4;
if ($[7] !== internalQueryRef || $[8] !== queryRef) {
t4 = forceUpdate => internalQueryRef.listen(promise => {
updateWrappedQueryRef(queryRef, promise);
forceUpdate();
});
$[7] = internalQueryRef;
$[8] = queryRef;
$[9] = t4;
} else {
t4 = $[9];
}
const promise_0 = useSyncExternalStore(t4, getPromise, getPromise);
let t5;
if ($[10] !== promise_0) {
t5 = __use(promise_0);
$[10] = promise_0;
$[11] = t5;
} else {
t5 = $[11];
}
const result = t5;
let t6;
if ($[12] !== result.data || $[13] !== result.dataState || $[14] !== result.error || $[15] !== result.networkStatus) {
t6 = {
data: result.data,
dataState: result.dataState,
networkStatus: result.networkStatus,
error: result.error
};
$[12] = result.data;
$[13] = result.dataState;
$[14] = result.error;
$[15] = result.networkStatus;
$[16] = t6;
} else {
t6 = $[16];
}
return t6;
}
//# sourceMappingURL=useReadQuery.js.map