{"version":3,"file":"useFragment.js","sourceRoot":"","sources":["../../../src/react/hooks/useFragment.ts"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"rehackt\";\nimport type { DeepPartial } from \"../../utilities/index.js\";\nimport { mergeDeepArray } from \"../../utilities/index.js\";\nimport type {\n  Cache,\n  Reference,\n  StoreObject,\n  MissingTree,\n} from \"../../cache/index.js\";\n\nimport { useApolloClient } from \"./useApolloClient.js\";\nimport { useSyncExternalStore } from \"./useSyncExternalStore.js\";\nimport type { ApolloClient, OperationVariables } from \"../../core/index.js\";\nimport type { NoInfer } from \"../types/types.js\";\nimport { useDeepMemo, useLazyRef, wrapHook } from \"./internal/index.js\";\nimport equal from \"@wry/equality\";\n\nexport interface UseFragmentOptions<TData, TVars>\n  extends Omit<\n      Cache.DiffOptions<NoInfer<TData>, NoInfer<TVars>>,\n      \"id\" | \"query\" | \"optimistic\" | \"previousResult\" | \"returnPartialData\"\n    >,\n    Omit<\n      Cache.ReadFragmentOptions<TData, TVars>,\n      \"id\" | \"variables\" | \"returnPartialData\"\n    > {\n  from: StoreObject | Reference | string;\n  // Override this field to make it optional (default: true).\n  optimistic?: boolean;\n  /**\n   * The instance of `ApolloClient` to use to look up the fragment.\n   *\n   * By default, the instance that's passed down via context is used, but you\n   * can provide a different instance here.\n   *\n   * @docGroup 1. Operation options\n   */\n  client?: ApolloClient<any>;\n}\n\nexport type UseFragmentResult<TData> =\n  | {\n      data: TData;\n      complete: true;\n      missing?: never;\n    }\n  | {\n      data: DeepPartial<TData>;\n      complete: false;\n      missing?: MissingTree;\n    };\n\nexport function useFragment<TData = any, TVars = OperationVariables>(\n  options: UseFragmentOptions<TData, TVars>\n): UseFragmentResult<TData> {\n  return wrapHook(\n    \"useFragment\",\n    _useFragment,\n    useApolloClient(options.client)\n  )(options);\n}\n\nfunction _useFragment<TData = any, TVars = OperationVariables>(\n  options: UseFragmentOptions<TData, TVars>\n): UseFragmentResult<TData> {\n  const { cache } = useApolloClient(options.client);\n\n  const diffOptions = useDeepMemo<Cache.DiffOptions<TData, TVars>>(() => {\n    const {\n      fragment,\n      fragmentName,\n      from,\n      optimistic = true,\n      ...rest\n    } = options;\n\n    return {\n      ...rest,\n      returnPartialData: true,\n      id: typeof from === \"string\" ? from : cache.identify(from),\n      query: cache[\"getFragmentDoc\"](fragment, fragmentName),\n      optimistic,\n    };\n  }, [options]);\n\n  const resultRef = useLazyRef<UseFragmentResult<TData>>(() =>\n    diffToResult(cache.diff<TData>(diffOptions))\n  );\n\n  const stableOptions = useDeepMemo(() => options, [options]);\n\n  // Since .next is async, we need to make sure that we\n  // get the correct diff on the next render given new diffOptions\n  React.useMemo(() => {\n    resultRef.current = diffToResult(cache.diff<TData>(diffOptions));\n  }, [diffOptions, cache]);\n\n  // Used for both getSnapshot and getServerSnapshot\n  const getSnapshot = React.useCallback(() => resultRef.current, []);\n\n  return useSyncExternalStore(\n    React.useCallback(\n      (forceUpdate) => {\n        let lastTimeout = 0;\n        const subscription = cache.watchFragment(stableOptions).subscribe({\n          next: (result) => {\n            if (equal(result, resultRef.current)) return;\n            resultRef.current = result;\n            // If we get another update before we've re-rendered, bail out of\n            // the update and try again. This ensures that the relative timing\n            // between useQuery and useFragment stays roughly the same as\n            // fixed in https://github.com/apollographql/apollo-client/pull/11083\n            clearTimeout(lastTimeout);\n            lastTimeout = setTimeout(forceUpdate) as any;\n          },\n        });\n        return () => {\n          subscription.unsubscribe();\n          clearTimeout(lastTimeout);\n        };\n      },\n      [cache, stableOptions]\n    ),\n    getSnapshot,\n    getSnapshot\n  );\n}\n\nfunction diffToResult<TData>(\n  diff: Cache.DiffResult<TData>\n): UseFragmentResult<TData> {\n  const result = {\n    data: diff.result!,\n    complete: !!diff.complete,\n  } as UseFragmentResult<TData>;\n\n  if (diff.missing) {\n    result.missing = mergeDeepArray(diff.missing.map((error) => error.missing));\n  }\n\n  return result;\n}\n"]}