{"version":3,"file":"useReadAndSubscribe.mjs","names":["componentFunction: IsographComponentFunction"],"sources":["../../src/react/useReadAndSubscribe.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n  type ExtractData,\n  type FragmentReference,\n  stableIdForFragmentReference,\n  type UnknownTReadFromStore,\n} from '../core/FragmentReference';\nimport type { IsographComponentFunction } from '../core/IsographEnvironment';\nimport { logMessage } from '../core/logging';\nimport { readPromise } from '../core/PromiseWrapper';\nimport {\n  type NetworkRequestReaderOptions,\n  readButDoNotEvaluate,\n  type WithEncounteredRecords,\n} from '../core/read';\nimport type { ReaderAst } from '../core/reader';\nimport { subscribe } from '../core/subscribe';\nimport { useIsographEnvironment } from './IsographEnvironmentProvider';\nimport { maybeUnwrapNetworkRequest } from './maybeUnwrapNetworkRequest';\nimport { useRerenderOnChange } from './useRerenderOnChange';\n\n/**\n * Read the data from a fragment reference and subscribe to updates.\n */\nexport function useReadAndSubscribe<\n  TReadFromStore extends UnknownTReadFromStore,\n>(\n  fragmentReference: FragmentReference<TReadFromStore, any>,\n  networkRequestOptions: NetworkRequestReaderOptions,\n  readerAst: ReaderAst<TReadFromStore>,\n): ExtractData<TReadFromStore> {\n  const environment = useIsographEnvironment();\n  const [readOutDataAndRecords, setReadOutDataAndRecords] = useState(() =>\n    readButDoNotEvaluate(environment, fragmentReference, networkRequestOptions),\n  );\n  useRerenderOnChange(\n    readOutDataAndRecords,\n    fragmentReference,\n    setReadOutDataAndRecords,\n    readerAst,\n  );\n  return readOutDataAndRecords.item;\n}\n\nexport function useSubscribeToMultiple<\n  TReadFromStore extends UnknownTReadFromStore,\n>(\n  items: ReadonlyArray<{\n    records: WithEncounteredRecords<TReadFromStore>;\n    callback: (updatedRecords: WithEncounteredRecords<TReadFromStore>) => void;\n    fragmentReference: FragmentReference<TReadFromStore, any>;\n    readerAst: ReaderAst<TReadFromStore>;\n  }>,\n) {\n  const environment = useIsographEnvironment();\n  useEffect(\n    () => {\n      const cleanupFns = items.map(\n        ({ records, callback, fragmentReference, readerAst }) => {\n          return subscribe(\n            environment,\n            records,\n            fragmentReference,\n            callback,\n            readerAst,\n          );\n        },\n      );\n      return () => {\n        cleanupFns.forEach((loader) => {\n          loader();\n        });\n      };\n    },\n    // By analogy to useReadAndSubscribe, we can have an empty dependency array?\n    // Maybe callback has to be depended on. I don't know!\n    // TODO find out\n    [\n      items\n        .map(({ fragmentReference }) => {\n          stableIdForFragmentReference(fragmentReference);\n        })\n        .join('.'),\n    ],\n  );\n}\n\nexport const componentFunction: IsographComponentFunction = (\n  environment,\n  fragmentReference,\n  networkRequestOptions,\n  startUpdate,\n) => {\n  function Component(additionalRuntimeProps: { [key: string]: any }) {\n    maybeUnwrapNetworkRequest(\n      fragmentReference.networkRequest,\n      networkRequestOptions,\n    );\n    const readerWithRefetchQueries = readPromise(\n      fragmentReference.readerWithRefetchQueries,\n    );\n\n    const data = useReadAndSubscribe(\n      fragmentReference,\n      networkRequestOptions,\n      readerWithRefetchQueries.readerArtifact.readerAst,\n    );\n\n    logMessage(environment, () => ({\n      kind: 'ComponentRerendered',\n      componentName: fragmentReference.fieldName,\n      rootLink: fragmentReference.root,\n    }));\n\n    return readerWithRefetchQueries.readerArtifact.resolver(\n      // @ts-expect-error\n      {\n        data,\n        parameters: fragmentReference.variables,\n        startUpdate: readerWithRefetchQueries.readerArtifact.hasUpdatable\n          ? startUpdate\n          : undefined,\n      },\n      additionalRuntimeProps,\n    );\n  }\n  const idString = `(type: ${fragmentReference.root.__typename}, id: ${fragmentReference.root.__link})`;\n  Component.displayName = `${fragmentReference.fieldName} ${idString} @component`;\n  return Component;\n};\n"],"mappings":";;;;;;;;;;;;;;AAwBA,SAAgB,oBAGd,mBACA,uBACA,WAC6B;CAC7B,MAAM,cAAc,wBAAwB;CAC5C,MAAM,CAAC,uBAAuB,4BAA4B,eACxD,qBAAqB,aAAa,mBAAmB,sBAAsB,CAC5E;AACD,qBACE,uBACA,mBACA,0BACA,UACD;AACD,QAAO,sBAAsB;;AAG/B,SAAgB,uBAGd,OAMA;CACA,MAAM,cAAc,wBAAwB;AAC5C,iBACQ;EACJ,MAAM,aAAa,MAAM,KACtB,EAAE,SAAS,UAAU,mBAAmB,gBAAgB;AACvD,UAAO,UACL,aACA,SACA,mBACA,UACA,UACD;IAEJ;AACD,eAAa;AACX,cAAW,SAAS,WAAW;AAC7B,YAAQ;KACR;;IAMN,CACE,MACG,KAAK,EAAE,wBAAwB;AAC9B,+BAA6B,kBAAkB;GAC/C,CACD,KAAK,IAAI,CACb,CACF;;AAGH,MAAaA,qBACX,aACA,mBACA,uBACA,gBACG;CACH,SAAS,UAAU,wBAAgD;AACjE,4BACE,kBAAkB,gBAClB,sBACD;EACD,MAAM,2BAA2B,YAC/B,kBAAkB,yBACnB;EAED,MAAM,OAAO,oBACX,mBACA,uBACA,yBAAyB,eAAe,UACzC;AAED,aAAW,oBAAoB;GAC7B,MAAM;GACN,eAAe,kBAAkB;GACjC,UAAU,kBAAkB;GAC7B,EAAE;AAEH,SAAO,yBAAyB,eAAe,SAE7C;GACE;GACA,YAAY,kBAAkB;GAC9B,aAAa,yBAAyB,eAAe,eACjD,cACA;GACL,EACD,uBACD;;CAEH,MAAM,WAAW,UAAU,kBAAkB,KAAK,WAAW,QAAQ,kBAAkB,KAAK,OAAO;AACnG,WAAU,cAAc,GAAG,kBAAkB,UAAU,GAAG,SAAS;AACnE,QAAO"}