{
  "version": 3,
  "sources": ["../../../src/storeObservation/compiledHooks/useCompiledPaginationFragment.ts"],
  "sourcesContent": ["import { useState, useCallback, useRef } from \"react\";\nimport { ApolloCache, DataProxy } from \"@apollo/client\";\nimport invariant from \"invariant\";\nimport { useCompiledRefetchableFragment } from \"./useCompiledRefetchableFragment\";\nimport { useOverridenOrDefaultApolloClient } from \"../../useOverridenOrDefaultApolloClient\";\n\nimport type { FragmentReference } from \"./types\";\nimport type {\n  RefetchFn,\n  Disposable,\n  PrivateRefetchOptions,\n  RefetchOptions,\n} from \"./useCompiledRefetchableFragment\";\nimport type {\n  CompiledArtefactModule,\n  Metadata,\n} from \"@graphitation/apollo-react-relay-duct-tape-compiler\";\nimport type { DocumentNode } from \"graphql\";\nimport { Variables } from \"../../types\";\nimport { merge } from \"lodash\";\n\nexport type PaginationFn = (\n  count: number,\n  options?: RefetchOptions,\n) => Disposable;\n\ninterface PaginationParams {\n  fragmentReference: FragmentReference;\n  refetch: RefetchFn;\n  latestVariablesUsedByStandaloneRefetch: Partial<Variables>;\n  metadata: Metadata;\n  executionQueryDocument: DocumentNode;\n  cache: ApolloCache<unknown>;\n  countVariable: string | undefined;\n  cursorVariable: string | undefined;\n  connectionSelectionPath: string[];\n  cursorValue: string | undefined;\n  updater: <T>(existing: T[], incoming: T[]) => T[];\n}\n\nfunction useLoadMore({\n  fragmentReference,\n  refetch,\n  latestVariablesUsedByStandaloneRefetch,\n  metadata,\n  executionQueryDocument,\n  cache,\n  countVariable,\n  cursorVariable,\n  connectionSelectionPath,\n  cursorValue,\n  updater,\n}: PaginationParams): [loadPage: PaginationFn, isLoadingMore: boolean] {\n  const [isLoadingMore, setIsLoadingMore] = useState(false);\n  const loadPage = useCallback<PaginationFn>(\n    (countValue, options) => {\n      invariant(\n        countVariable,\n        \"usePaginationFragment(): Expected a count variable to exist\",\n      );\n      invariant(\n        cursorVariable,\n        \"usePaginationFragment(): Expected a cursor variable to exist\",\n      );\n      invariant(\n        cursorValue,\n        \"usePaginationFragment(): Expected a cursor value to exist\",\n      );\n      const previousVariables = {\n        ...merge(\n          {},\n          metadata.connection?.filterVariableDefaults,\n          latestVariablesUsedByStandaloneRefetch,\n          fragmentReference.__fragments,\n        ),\n        id: fragmentReference.id,\n      };\n      const newVariables = {\n        ...previousVariables,\n        [countVariable]: countValue,\n        [cursorVariable]: cursorValue,\n      };\n      const refetchOptions: PrivateRefetchOptions = {\n        fetchPolicy: \"no-cache\",\n        UNSTABLE_onCompletedWithData: (error, data) => {\n          // NOTE: We can do this now already, because `refetch` wraps the\n          //       onCompleted callback in a batchedUpdates callback.\n          setIsLoadingMore(false);\n\n          if (!error) {\n            invariant(\n              data,\n              \"usePaginationFragment(): Expected to have response data\",\n            );\n            const newData = metadata.rootSelection\n              ? data[metadata.rootSelection]\n              : data;\n            const mainFragment = metadata.mainFragment;\n            invariant(\n              mainFragment,\n              \"usePaginationFragment(): Expected mainFragment metadata\",\n            );\n            const cacheSelector: DataProxy.Fragment<unknown, object> = {\n              // TODO: If we're dropping default Apollo Cache keys, we can probably just do the below\n              id: fragmentReference.id as string,\n              // id: cache.identify({\n              //   __typename: mainFragment.typeCondition,\n              //   id: fragmentReference.id as StoreValue,\n              // }),\n              variables: previousVariables,\n              fragmentName: mainFragment.name,\n              // Create new document with operation filtered out.\n              fragment: {\n                kind: \"Document\",\n                definitions: executionQueryDocument.definitions.filter(\n                  (def) => def.kind === \"FragmentDefinition\",\n                ),\n              },\n            };\n            /**\n             * Note: Even though we already have the latest data from the\n             * useCompiledFragment hook, we can't really use that as it may contain\n             * __fragments fields and we don't want to write those to the cache. If\n             * we figure out a way from a field-policy's merge function to not write\n             * to the cache, then that would be preferable.\n             */\n            const existingData = cache.readFragment(cacheSelector);\n            invariant(existingData, \"Expected existing data\");\n            const newCacheData = mergeEdges(\n              connectionSelectionPath,\n              newData,\n              existingData,\n              updater,\n            );\n            cache.writeFragment({\n              ...cacheSelector,\n              variables: newVariables,\n              data: newCacheData,\n            });\n          }\n\n          (options?.onComplete ?? options?.onCompleted)?.(error);\n        },\n      };\n      // TODO: Measure if invoking `refetch` leads to React updates and if it\n      //       makes sense to wrap it and the following setIsLoadingMore(true)\n      //       call in a batchedUpdates callback.\n      const disposable = refetch(\n        newVariables,\n        refetchOptions as RefetchOptions,\n      );\n      setIsLoadingMore(true);\n      return disposable;\n    },\n    [\n      fragmentReference.id,\n      fragmentReference.__fragments,\n      refetch,\n      latestVariablesUsedByStandaloneRefetch,\n      metadata,\n      executionQueryDocument,\n      cache,\n      countVariable,\n      cursorVariable,\n      connectionSelectionPath,\n      cursorValue,\n    ],\n  );\n  return [loadPage, isLoadingMore];\n}\n\nfunction getValueAtSelectionPath(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  data: Record<string, any>,\n  selectionPath: string[],\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let object: Record<string, any> = data;\n  selectionPath.forEach((field) => {\n    object = object[field];\n    invariant(object, \"Expected path to connection in response to exist\");\n  });\n  return object;\n}\n\nfunction getPageInfo(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  data: Record<string, any>,\n  selectionPath: string[],\n): {\n  startCursor?: string;\n  endCursor?: string;\n  hasPreviousPage?: boolean;\n  hasNextPage?: boolean;\n} {\n  const object = getValueAtSelectionPath(data, selectionPath);\n  const pageInfo = object.pageInfo;\n  invariant(pageInfo, \"Expected to find the connection's page info object\");\n  return pageInfo;\n}\n\nfunction mergeEdges(\n  connectionPath: string[],\n  destination: object,\n  source: object,\n  updater: <T>(existing: T[], incoming: T[]) => T[],\n) {\n  const edgesPath = [...connectionPath, \"edges\"];\n  const existingEdges = getValueAtSelectionPath(source, edgesPath);\n  const newEdges = getValueAtSelectionPath(destination, edgesPath);\n  const allEdges = updater(existingEdges, newEdges);\n\n  const connection = getValueAtSelectionPath(destination, connectionPath);\n  connection[\"edges\"] = allEdges;\n\n  return destination;\n}\n\nexport function useCompiledPaginationFragment(\n  documents: CompiledArtefactModule,\n  fragmentReference: FragmentReference,\n): {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  data: any;\n  loadNext: PaginationFn;\n  loadPrevious: PaginationFn;\n  hasNext: boolean;\n  hasPrevious: boolean;\n  isLoadingNext: boolean;\n  isLoadingPrevious: boolean;\n  refetch: RefetchFn;\n} {\n  const { executionQueryDocument, metadata } = documents;\n  invariant(\n    metadata && metadata.mainFragment,\n    \"usePaginationFragment(): Expected metadata to have been extracted from \" +\n      \"the fragment. Did you forget to invoke the compiler?\",\n  );\n  invariant(\n    executionQueryDocument,\n    \"usePaginationFragment(): Expected fragment `%s` to be refetchable when \" +\n      \"using `usePaginationFragment`. Did you forget to add a @refetchable \" +\n      \"directive to the fragment?\",\n    metadata.mainFragment.name,\n  );\n  const connectionMetadata = metadata.connection;\n  invariant(\n    connectionMetadata,\n    \"usePaginationFragment: Expected fragment `%s` to include a \" +\n      \"connection when using `usePaginationFragment`. Did you forget to add a @connection \" +\n      \"directive to the connection field in the fragment?\",\n    metadata.mainFragment.name,\n  );\n  const [data, refetch] = useCompiledRefetchableFragment(\n    documents,\n    fragmentReference,\n  );\n\n  // Consumers might want to not only use loadNext/loadPrevious with pagination fragment but also standalone refetch,\n  // for example to change the variables that decide on connection filtering. To make sure that loadNext/loadPrevious\n  // respects the variables used by standalone refetch, we store them in a ref and pass them to useLoadMore.\n  const latestVariablesUsedByStandaloneRefetch = useRef({});\n  const storeVariablesAndRefetch = useCallback<RefetchFn>(\n    (variables: Partial<Variables>, options?: RefetchOptions) => {\n      latestVariablesUsedByStandaloneRefetch.current = variables;\n      return refetch(variables, options);\n    },\n    [refetch],\n  );\n\n  const commonPaginationParams = {\n    fragmentReference,\n    refetch,\n    latestVariablesUsedByStandaloneRefetch:\n      latestVariablesUsedByStandaloneRefetch.current,\n    metadata,\n    executionQueryDocument,\n    cache: useOverridenOrDefaultApolloClient().cache,\n    connectionSelectionPath: connectionMetadata.selectionPath,\n  };\n  const pageInfo = getPageInfo(data, connectionMetadata.selectionPath);\n  const [loadNext, isLoadingNext] = useLoadMore({\n    ...commonPaginationParams,\n    countVariable: connectionMetadata.forwardCountVariable,\n    cursorVariable: connectionMetadata.forwardCursorVariable,\n    cursorValue: pageInfo?.endCursor,\n    updater: (existing, incoming) => [...existing, ...incoming],\n  });\n  const [loadPrevious, isLoadingPrevious] = useLoadMore({\n    ...commonPaginationParams,\n    countVariable: connectionMetadata.backwardCountVariable,\n    cursorVariable: connectionMetadata.backwardCursorVariable,\n    cursorValue: pageInfo?.startCursor,\n    updater: (existing, incoming) => [...incoming, ...existing],\n  });\n  return {\n    data,\n    refetch: storeVariablesAndRefetch,\n    hasNext: !!pageInfo?.hasNextPage,\n    hasPrevious: !!pageInfo?.hasPreviousPage,\n    isLoadingNext,\n    isLoadingPrevious,\n    loadNext,\n    loadPrevious,\n  };\n}\n"],
  "mappings": "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",
  "names": ["_a"]
}
