Skip to content

Instantly share code, notes, and snippets.

@maraisr
Forked from sibelius/useLocalQuery.tsx
Created December 16, 2019 01:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maraisr/0dae4e89433c9bc27fafcf945d036cee to your computer and use it in GitHub Desktop.
Save maraisr/0dae4e89433c9bc27fafcf945d036cee to your computer and use it in GitHub Desktop.
useLocalQuery hook to consume local data from a GraphQL Query
const useLocalQuery = <TQuery extends {response: any; variables: any}>(
environment: Environment,
query: any,
inVariables: TQuery['variables'] = {}
): TQuery['response'] | null => {
const variables = useDeepEqual(inVariables)
const [dataRef, setData] = useRefState<SelectorData | null>(null)
const disposablesRef = useRef<Disposable[]>([])
useEffect(() => {
const {getRequest, createOperationDescriptor} = environment.unstable_internal
const request = getRequest(query)
const operation = createOperationDescriptor(request, variables)
const res = environment.lookup(operation.fragment, operation)
setData(res.data || null)
disposablesRef.current.push(environment.retain(operation.root))
disposablesRef.current.push(
environment.subscribe(res, (newSnapshot) => {
setData(newSnapshot.data || null)
})
)
const disposables = disposablesRef.current
return () => {
disposables.forEach((disposable) => disposable.dispose())
}
}, [environment, setData, query, variables])
return dataRef.current
}
const data = useLocalQuery<SnackbarQuery>(query)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment