UNPKG

3.98 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @emails oncall+relay
8 *
9 * @format
10 */
11// flowlint ambiguous-object-type:error
12'use strict';
13
14var ProfilerContext = require('./ProfilerContext');
15
16var React = require('react');
17
18var useFetchTrackingRef = require('./useFetchTrackingRef');
19
20var useFragmentNode = require('./useFragmentNode');
21
22var useRelayEnvironment = require('./useRelayEnvironment');
23
24var _require = require('./QueryResource'),
25 getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
26
27var _require2 = require('relay-runtime'),
28 fetchQuery = _require2.__internal.fetchQuery;
29
30var useContext = React.useContext,
31 useEffect = React.useEffect,
32 useState = React.useState,
33 useRef = React.useRef;
34
35function useLazyLoadQueryNode(args) {
36 var _args$fetchObservable, _args$networkCacheCon;
37
38 var environment = useRelayEnvironment();
39 var profilerContext = useContext(ProfilerContext);
40 var QueryResource = getQueryResourceForEnvironment(environment);
41 var query = args.query,
42 componentDisplayName = args.componentDisplayName,
43 fetchKey = args.fetchKey,
44 fetchPolicy = args.fetchPolicy,
45 renderPolicy = args.renderPolicy;
46 var fetchObservable = (_args$fetchObservable = args.fetchObservable) !== null && _args$fetchObservable !== void 0 ? _args$fetchObservable : fetchQuery(environment, query, {
47 networkCacheConfig: (_args$networkCacheCon = args.networkCacheConfig) !== null && _args$networkCacheCon !== void 0 ? _args$networkCacheCon : {
48 force: true
49 }
50 });
51
52 var _useFetchTrackingRef = useFetchTrackingRef(),
53 startFetch = _useFetchTrackingRef.startFetch,
54 completeFetch = _useFetchTrackingRef.completeFetch;
55
56 var preparedQueryResult = profilerContext.wrapPrepareQueryResource(function () {
57 return QueryResource.prepare(query, fetchObservable, fetchPolicy, renderPolicy, {
58 start: startFetch,
59 complete: completeFetch,
60 error: completeFetch
61 }, fetchKey, profilerContext);
62 });
63
64 var _forceUpdate;
65
66 var _maybeFastRefresh;
67
68 if (process.env.NODE_ENV !== "production") {
69 /* eslint-disable react-hooks/rules-of-hooks */
70 var _useState = useState(0);
71
72 _forceUpdate = _useState[1];
73 _maybeFastRefresh = useRef(false);
74 useEffect(function () {
75 return function () {
76 // Detect fast refresh, only runs multiple times in fast refresh
77 _maybeFastRefresh.current = true;
78 };
79 }, []); // eslint-disable-line react-hooks/exhaustive-deps
80
81 /* eslint-enable react-hooks/rules-of-hooks */
82 }
83
84 useEffect(function () {
85 if (process.env.NODE_ENV !== "production") {
86 if (_maybeFastRefresh && _maybeFastRefresh.current) {
87 /**
88 * This block only runs during fast refresh, the current resource and
89 * it's cache is disposed in the previous cleanup. Stop retaining and
90 * force a re-render to restart fetchObservable and retain correctly.
91 */
92 _maybeFastRefresh.current = false;
93 _forceUpdate && _forceUpdate(function (n) {
94 return n + 1;
95 });
96 return;
97 }
98 }
99
100 var disposable = QueryResource.retain(preparedQueryResult, profilerContext);
101 return function () {
102 disposable.dispose();
103 }; // NOTE: We disable react-hooks-deps warning because the `environment`
104 // and `query` identities are capturing all information about whether
105 // the effect should be re-ran and the query re-retained.
106 // eslint-disable-next-line react-hooks/exhaustive-deps
107 }, [environment, query]);
108 var fragmentNode = preparedQueryResult.fragmentNode,
109 fragmentRef = preparedQueryResult.fragmentRef;
110
111 var _useFragmentNode = useFragmentNode(fragmentNode, fragmentRef, componentDisplayName),
112 data = _useFragmentNode.data;
113
114 return data;
115}
116
117module.exports = useLazyLoadQueryNode;
\No newline at end of file