UNPKG

6.16 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.useQuery = useQuery;
5
6var _apolloClient = require("apollo-client");
7
8var _react = require("react");
9
10var _ApolloContext = require("./ApolloContext");
11
12var _SSRContext = require("./internal/SSRContext");
13
14var _actHack = _interopRequireDefault(require("./internal/actHack"));
15
16var _queryCache = require("./queryCache");
17
18var _utils = require("./utils");
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
21
22function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
23
24function useQuery(query, _temp) {
25 var _ref = _temp === void 0 ? {} : _temp,
26 _ref$ssr = _ref.ssr,
27 ssr = _ref$ssr === void 0 ? true : _ref$ssr,
28 _ref$skip = _ref.skip,
29 skip = _ref$skip === void 0 ? false : _ref$skip,
30 _ref$suspend = _ref.suspend,
31 suspend = _ref$suspend === void 0 ? false : _ref$suspend,
32 pollInterval = _ref.pollInterval,
33 _ref$notifyOnNetworkS = _ref.notifyOnNetworkStatusChange,
34 notifyOnNetworkStatusChange = _ref$notifyOnNetworkS === void 0 ? false : _ref$notifyOnNetworkS,
35 overrideClient = _ref.client,
36 context = _ref.context,
37 metadata = _ref.metadata,
38 variables = _ref.variables,
39 actualCachePolicy = _ref.fetchPolicy,
40 errorPolicy = _ref.errorPolicy,
41 fetchResults = _ref.fetchResults;
42
43 var client = (0, _ApolloContext.useApolloClient)(overrideClient);
44 var ssrManager = (0, _react.useContext)(_SSRContext.SSRContext);
45 var ssrInUse = ssr && ssrManager; // Skips when `skip: true` or SSRContext passed but `ssr: false`
46
47 var shouldSkip = skip || ssrManager != null && !ssr;
48 var fetchPolicy = ssrInUse && ( // Taken from https://github.com/apollographql/react-apollo/blob/2d7e48b7d0c26e792e1ed26e98bb84d8fba5bb8a/src/Query.tsx#L167-L169
49 actualCachePolicy === 'network-only' || actualCachePolicy === 'cache-and-network') ? 'cache-first' : actualCachePolicy;
50 var watchQueryOptions = (0, _react.useMemo)(function () {
51 return (0, _utils.compact)({
52 context: context,
53 errorPolicy: errorPolicy,
54 fetchPolicy: fetchPolicy,
55 fetchResults: fetchResults,
56 metadata: metadata,
57 notifyOnNetworkStatusChange: notifyOnNetworkStatusChange,
58 pollInterval: pollInterval,
59 query: query,
60 variables: variables
61 });
62 }, [query, pollInterval, notifyOnNetworkStatusChange, context && (0, _utils.objToKey)(context), metadata && (0, _utils.objToKey)(metadata), variables && (0, _utils.objToKey)(variables), fetchPolicy, errorPolicy, fetchResults]);
63 var observableQuery = (0, _react.useMemo)(function () {
64 return (0, _queryCache.getCachedObservableQuery)(client, watchQueryOptions);
65 }, [client, watchQueryOptions]);
66
67 var _useState = (0, _react.useState)(0),
68 responseId = _useState[0],
69 setResponseId = _useState[1];
70
71 var currentResult = (0, _react.useMemo)(function () {
72 var helpers = {
73 fetchMore: observableQuery.fetchMore.bind(observableQuery),
74 refetch: observableQuery.refetch.bind(observableQuery),
75 startPolling: observableQuery.startPolling.bind(observableQuery),
76 stopPolling: observableQuery.stopPolling.bind(observableQuery),
77 updateQuery: observableQuery.updateQuery.bind(observableQuery)
78 };
79 var result = observableQuery.getCurrentResult(); // return the old result data when there is an error
80
81 var data = result.data;
82
83 if (result.error || result.errors) {
84 data = _extends({}, result.data, {}, (observableQuery.getLastResult() || {}).data);
85 }
86
87 if (shouldSkip) {
88 // Taken from https://github.com/apollographql/react-apollo/blob/5cb63b3625ce5e4a3d3e4ba132eaec2a38ef5d90/src/Query.tsx#L376-L381
89 return _extends({}, helpers, {
90 data: undefined,
91 error: undefined,
92 loading: false,
93 networkStatus: undefined
94 });
95 }
96
97 return _extends({}, helpers, {
98 data: data,
99 error: result.errors && result.errors.length > 0 ? new _apolloClient.ApolloError({
100 graphQLErrors: result.errors
101 }) : result.error,
102 errors: result.errors,
103 loading: result.loading,
104 // don't try to return `networkStatus` when suspense it's used
105 // because it's unreliable in that case
106 // https://github.com/trojanowski/react-apollo-hooks/pull/68
107 networkStatus: suspend ? undefined : result.networkStatus,
108 partial: result.partial,
109 stale: result.stale
110 });
111 }, [shouldSkip, responseId, observableQuery]);
112 (0, _react.useEffect)(function () {
113 if (shouldSkip) {
114 return;
115 }
116
117 var invalidateCurrentResult = function invalidateCurrentResult() {
118 // A hack to get rid React warnings during tests. The default
119 // implementation of `actHack` just invokes the callback immediately.
120 // In tests, it's replaced with `act` from react-testing-library.
121 // A better solution welcome.
122 (0, _actHack["default"])(function () {
123 setResponseId(function (x) {
124 return x + 1;
125 });
126 });
127 };
128
129 var subscription = observableQuery.subscribe(invalidateCurrentResult, invalidateCurrentResult);
130 (0, _queryCache.invalidateCachedObservableQuery)(client, watchQueryOptions);
131 return function () {
132 subscription.unsubscribe();
133 };
134 }, [shouldSkip, observableQuery]);
135 ensureSupportedFetchPolicy(suspend, fetchPolicy);
136
137 if (currentResult.partial) {
138 if (suspend) {
139 // throw a promise - use the react suspense to wait until the data is
140 // available
141 throw observableQuery.result();
142 }
143
144 if (ssrInUse) {
145 ssrManager.register(observableQuery.result());
146 }
147 }
148
149 return currentResult;
150}
151
152function ensureSupportedFetchPolicy(suspend, fetchPolicy) {
153 if (suspend && fetchPolicy && fetchPolicy !== 'cache-first') {
154 throw new Error("Fetch policy " + fetchPolicy + " is not supported without 'suspend: false'");
155 }
156}
\No newline at end of file