Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. import { useEffect, useState } from 'react';
  2. import { Subscription } from 'apollo-client/util/Observable';
  3. import client from '../config/apollo';
  4.  
  5. function getQueryName(query: any) {
  6. return query.definitions[0].selectionSet.selections[0].name.value;
  7. }
  8.  
  9. const useGraphQlQuery = <T>(
  10. query: any,
  11. variables?: DictType<string | number>,
  12. subscriptionQuery?: any
  13. ): [T | null, boolean, any | null] => {
  14. const [data, setData] = useState<T | null>(null);
  15. const [error, setError] = useState();
  16. const [loading, setLoading] = useState<boolean>(false);
  17. const [subscription, setSubscription] = useState<Subscription | null>(null);
  18.  
  19. useEffect(() => {
  20. setLoading(true);
  21. client
  22. .query({ query, variables })
  23. .then(res => setData(res.data[getQueryName(query)]))
  24. .catch(err => setError(err))
  25. .finally(() => setLoading(false));
  26.  
  27. if (subscriptionQuery) {
  28. const sub = client.subscribe({ query: subscriptionQuery, variables }).subscribe(res => {
  29. setData((oldstate: any) => {
  30. const x = res.data[getQueryName(subscriptionQuery)];
  31. return { ...oldstate, ...x };
  32. });
  33. });
  34. setSubscription(sub);
  35. }
  36.  
  37. return () => {
  38. if (subscription) {
  39. subscription.unsubscribe();
  40. }
  41. };
  42. }, [query, subscriptionQuery]);
  43.  
  44. return [data, loading, error];
  45. };
  46.  
  47. export default useGraphQlQuery;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement