react-relay 14.0.0 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ReactRelayContainerUtils.js.flow +1 -2
- package/ReactRelayContext.js +1 -1
- package/ReactRelayContext.js.flow +1 -2
- package/ReactRelayFragmentContainer.js.flow +6 -4
- package/ReactRelayFragmentMockRenderer.js.flow +1 -2
- package/ReactRelayLocalQueryRenderer.js.flow +5 -5
- package/ReactRelayPaginationContainer.js.flow +21 -14
- package/ReactRelayQueryFetcher.js.flow +28 -16
- package/ReactRelayQueryRenderer.js.flow +42 -13
- package/ReactRelayQueryRendererContext.js.flow +2 -3
- package/ReactRelayRefetchContainer.js.flow +9 -9
- package/ReactRelayTestMocker.js.flow +3 -3
- package/ReactRelayTypes.js.flow +7 -8
- package/RelayContext.js.flow +1 -2
- package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +4 -5
- package/__flowtests__/ReactRelayPaginationContainer-flowtest.js.flow +4 -5
- package/__flowtests__/ReactRelayRefetchContainer-flowtest.js.flow +4 -5
- package/__flowtests__/RelayModern-flowtest.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_badref.graphql.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_notref.graphql.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_user.graphql.js.flow +3 -4
- package/__flowtests__/RelayModernFlowtest_users.graphql.js.flow +3 -4
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/ReactRelayFragmentContainerFlowtest_viewer2.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtestQuery.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/ReactRelayPaginationContainerFlowtest_viewer.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtestQuery.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/ReactRelayRefetchContainerFlowtest_viewer.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/RelayModernFlowtest_badref.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/RelayModernFlowtest_notref.graphql.js.flow +4 -2
- package/__flowtests__/__generated__/RelayModernFlowtest_user.graphql.js.flow +3 -1
- package/__flowtests__/__generated__/RelayModernFlowtest_users.graphql.js.flow +3 -1
- package/assertFragmentMap.js.flow +1 -2
- package/buildReactRelayContainer.js.flow +7 -7
- package/getRootVariablesForFragments.js.flow +1 -3
- package/hooks.js +1 -1
- package/hooks.js.flow +4 -2
- package/index.js +1 -1
- package/index.js.flow +6 -2
- package/isRelayEnvironment.js.flow +1 -2
- package/jest-react/enqueueTask.js.flow +1 -1
- package/jest-react/index.js.flow +1 -1
- package/jest-react/internalAct.js.flow +1 -1
- package/legacy.js +1 -1
- package/legacy.js.flow +1 -2
- package/lib/ReactRelayContainerUtils.js +2 -3
- package/lib/ReactRelayContext.js +3 -4
- package/lib/ReactRelayFragmentContainer.js +47 -73
- package/lib/ReactRelayFragmentMockRenderer.js +2 -4
- package/lib/ReactRelayLocalQueryRenderer.js +18 -31
- package/lib/ReactRelayPaginationContainer.js +74 -164
- package/lib/ReactRelayQueryFetcher.js +49 -76
- package/lib/ReactRelayQueryRenderer.js +63 -84
- package/lib/ReactRelayQueryRendererContext.js +2 -2
- package/lib/ReactRelayRefetchContainer.js +58 -108
- package/lib/ReactRelayTestMocker.js +33 -68
- package/lib/ReactRelayTypes.js +2 -1
- package/lib/RelayContext.js +4 -7
- package/lib/assertFragmentMap.js +3 -5
- package/lib/buildReactRelayContainer.js +11 -27
- package/lib/getRootVariablesForFragments.js +6 -10
- package/lib/hooks.js +5 -18
- package/lib/index.js +7 -24
- package/lib/isRelayEnvironment.js +5 -4
- package/lib/jest-react/enqueueTask.js +5 -9
- package/lib/jest-react/index.js +0 -1
- package/lib/jest-react/internalAct.js +9 -20
- package/lib/legacy.js +2 -8
- package/lib/multi-actor/ActorChange.js +2 -5
- package/lib/multi-actor/index.js +2 -1
- package/lib/multi-actor/useRelayActorEnvironment.js +4 -8
- package/lib/relay-hooks/EntryPointContainer.react.js +9 -15
- package/lib/relay-hooks/EntryPointTypes.flow.js +5 -3
- package/lib/relay-hooks/FragmentResource.js +109 -203
- package/lib/relay-hooks/HooksImplementation.js +3 -6
- package/lib/relay-hooks/InternalLogger.js +2 -3
- package/lib/relay-hooks/LRUCache.js +2 -20
- package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +33 -54
- package/lib/relay-hooks/MatchContainer.js +15 -24
- package/lib/relay-hooks/ProfilerContext.js +3 -3
- package/lib/relay-hooks/QueryResource.js +31 -101
- package/lib/relay-hooks/RelayEnvironmentProvider.js +5 -9
- package/lib/relay-hooks/SuspenseResource.js +9 -33
- package/lib/relay-hooks/loadEntryPoint.js +19 -31
- package/lib/relay-hooks/loadQuery.js +42 -78
- package/lib/relay-hooks/preloadQuery_DEPRECATED.js +11 -37
- package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +9 -15
- package/lib/relay-hooks/react-cache/RelayReactCache.js +7 -12
- package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +27 -81
- package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +206 -0
- package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +195 -215
- package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +5 -15
- package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +17 -24
- package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +149 -0
- package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +24 -39
- package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +325 -0
- package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +37 -0
- package/lib/relay-hooks/useBlockingPaginationFragment.js +73 -93
- package/lib/relay-hooks/useClientQuery.js +30 -0
- package/lib/relay-hooks/useEntryPointLoader.js +18 -38
- package/lib/relay-hooks/useFetchTrackingRef.js +10 -12
- package/lib/relay-hooks/useFragment.js +8 -19
- package/lib/relay-hooks/useFragmentNode.js +20 -32
- package/lib/relay-hooks/useIsMountedRef.js +4 -6
- package/lib/relay-hooks/useIsOperationNodeActive.js +8 -20
- package/lib/relay-hooks/useIsParentQueryActive.js +3 -6
- package/lib/relay-hooks/useLazyLoadQuery.js +7 -24
- package/lib/relay-hooks/useLazyLoadQueryNode.js +23 -34
- package/lib/relay-hooks/useLoadMoreFunction.js +46 -78
- package/lib/relay-hooks/useMemoOperationDescriptor.js +6 -15
- package/lib/relay-hooks/useMemoVariables.js +15 -34
- package/lib/relay-hooks/useMutation.js +9 -27
- package/lib/relay-hooks/usePaginationFragment.js +73 -76
- package/lib/relay-hooks/usePreloadedQuery.js +13 -44
- package/lib/relay-hooks/useQueryLoader.js +24 -49
- package/lib/relay-hooks/useRefetchableFragment.js +19 -17
- package/lib/relay-hooks/useRefetchableFragmentNode.js +65 -109
- package/lib/relay-hooks/useRelayEnvironment.js +4 -8
- package/lib/relay-hooks/useStaticFragmentNodeWarning.js +4 -8
- package/lib/relay-hooks/useSubscribeToInvalidationState.js +8 -9
- package/lib/relay-hooks/useSubscription.js +5 -10
- package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +29 -0
- package/multi-actor/ActorChange.js.flow +1 -1
- package/multi-actor/index.js.flow +1 -1
- package/multi-actor/useRelayActorEnvironment.js.flow +2 -4
- package/package.json +2 -2
- package/react-relay-hooks.js +2 -2
- package/react-relay-hooks.min.js +2 -2
- package/react-relay-legacy.js +2 -2
- package/react-relay-legacy.min.js +2 -2
- package/react-relay.js +2 -2
- package/react-relay.min.js +2 -2
- package/relay-hooks/EntryPointContainer.react.js.flow +3 -5
- package/relay-hooks/EntryPointTypes.flow.js.flow +37 -37
- package/relay-hooks/FragmentResource.js.flow +43 -19
- package/relay-hooks/HooksImplementation.js.flow +7 -9
- package/relay-hooks/InternalLogger.js.flow +1 -3
- package/relay-hooks/LRUCache.js.flow +1 -3
- package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +19 -14
- package/relay-hooks/MatchContainer.js.flow +6 -8
- package/relay-hooks/ProfilerContext.js.flow +1 -3
- package/relay-hooks/QueryResource.js.flow +29 -11
- package/relay-hooks/RelayEnvironmentProvider.js.flow +4 -6
- package/relay-hooks/SuspenseResource.js.flow +1 -3
- package/relay-hooks/__flowtests__/EntryPointTypes/EntryPointElementConfig-flowtest.js.flow +6 -4
- package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +4 -4
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_user.graphql.js.flow +3 -1
- package/relay-hooks/__flowtests__/__generated__/useFragmentFlowtest_users.graphql.js.flow +3 -1
- package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +39 -39
- package/relay-hooks/__flowtests__/useFragment-flowtest.js.flow +1 -3
- package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +37 -38
- package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +18 -20
- package/relay-hooks/__flowtests__/utils.js.flow +21 -12
- package/relay-hooks/loadEntryPoint.js.flow +11 -6
- package/relay-hooks/loadQuery.js.flow +11 -7
- package/relay-hooks/preloadQuery_DEPRECATED.js.flow +9 -12
- package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +13 -10
- package/relay-hooks/react-cache/RelayReactCache.js.flow +1 -3
- package/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js.flow +26 -20
- package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +297 -0
- package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +136 -96
- package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +1 -3
- package/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js.flow +3 -5
- package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +190 -0
- package/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js.flow +3 -6
- package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +601 -0
- package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +65 -0
- package/relay-hooks/useBlockingPaginationFragment.js.flow +86 -59
- package/relay-hooks/useClientQuery.js.flow +39 -0
- package/relay-hooks/useEntryPointLoader.js.flow +16 -14
- package/relay-hooks/useFetchTrackingRef.js.flow +7 -8
- package/relay-hooks/useFragment.js.flow +2 -4
- package/relay-hooks/useFragmentNode.js.flow +7 -8
- package/relay-hooks/useIsMountedRef.js.flow +2 -4
- package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
- package/relay-hooks/useIsParentQueryActive.js.flow +1 -1
- package/relay-hooks/useLazyLoadQuery.js.flow +9 -32
- package/relay-hooks/useLazyLoadQueryNode.js.flow +4 -6
- package/relay-hooks/useLoadMoreFunction.js.flow +20 -17
- package/relay-hooks/useMemoOperationDescriptor.js.flow +3 -5
- package/relay-hooks/useMemoVariables.js.flow +13 -31
- package/relay-hooks/useMutation.js.flow +6 -8
- package/relay-hooks/usePaginationFragment.js.flow +75 -43
- package/relay-hooks/usePreloadedQuery.js.flow +49 -43
- package/relay-hooks/useQueryLoader.js.flow +89 -28
- package/relay-hooks/useRefetchableFragment.js.flow +83 -23
- package/relay-hooks/useRefetchableFragmentNode.js.flow +26 -22
- package/relay-hooks/useRelayEnvironment.js.flow +2 -4
- package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -5
- package/relay-hooks/useSubscribeToInvalidationState.js.flow +2 -4
- package/relay-hooks/useSubscription.js.flow +1 -3
- package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +25 -0
- package/lib/readContext.js +0 -28
- package/readContext.js.flow +0 -31
|
@@ -5,44 +5,36 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
7
|
*
|
|
8
|
-
* @emails oncall+relay
|
|
9
8
|
* @format
|
|
9
|
+
* @oncall relay
|
|
10
10
|
*/
|
|
11
|
-
// flowlint ambiguous-object-type:error
|
|
12
|
-
'use strict';
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
'use strict';
|
|
15
13
|
|
|
14
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
16
15
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
17
|
-
|
|
18
16
|
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
19
|
-
|
|
20
17
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
21
|
-
|
|
18
|
+
var _require = require('../QueryResource'),
|
|
19
|
+
getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
|
|
22
20
|
var useRelayEnvironment = require('../useRelayEnvironment');
|
|
23
|
-
|
|
24
|
-
var getQueryResultOrFetchQuery = require('./getQueryResultOrFetchQuery_REACT_CACHE');
|
|
25
|
-
|
|
26
21
|
var invariant = require('invariant');
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
recycleNodesInto = _require2.recycleNodesInto;
|
|
43
|
-
|
|
22
|
+
var _require2 = require('react'),
|
|
23
|
+
useDebugValue = _require2.useDebugValue,
|
|
24
|
+
useEffect = _require2.useEffect,
|
|
25
|
+
useMemo = _require2.useMemo,
|
|
26
|
+
useRef = _require2.useRef,
|
|
27
|
+
useState = _require2.useState;
|
|
28
|
+
var _require3 = require('relay-runtime'),
|
|
29
|
+
fetchQueryInternal = _require3.__internal.fetchQuery,
|
|
30
|
+
areEqualSelectors = _require3.areEqualSelectors,
|
|
31
|
+
createOperationDescriptor = _require3.createOperationDescriptor,
|
|
32
|
+
getPendingOperationsForFragment = _require3.getPendingOperationsForFragment,
|
|
33
|
+
getSelector = _require3.getSelector,
|
|
34
|
+
getVariablesFromFragment = _require3.getVariablesFromFragment,
|
|
35
|
+
handlePotentialSnapshotErrors = _require3.handlePotentialSnapshotErrors,
|
|
36
|
+
recycleNodesInto = _require3.recycleNodesInto;
|
|
44
37
|
var warning = require("fbjs/lib/warning");
|
|
45
|
-
|
|
46
38
|
function isMissingData(state) {
|
|
47
39
|
if (state.kind === 'bailout') {
|
|
48
40
|
return false;
|
|
@@ -54,32 +46,24 @@ function isMissingData(state) {
|
|
|
54
46
|
});
|
|
55
47
|
}
|
|
56
48
|
}
|
|
57
|
-
|
|
58
49
|
function getMissingClientEdges(state) {
|
|
59
50
|
if (state.kind === 'bailout') {
|
|
60
51
|
return null;
|
|
61
52
|
} else if (state.kind === 'singular') {
|
|
62
53
|
var _state$snapshot$missi;
|
|
63
|
-
|
|
64
54
|
return (_state$snapshot$missi = state.snapshot.missingClientEdges) !== null && _state$snapshot$missi !== void 0 ? _state$snapshot$missi : null;
|
|
65
55
|
} else {
|
|
66
56
|
var edges = null;
|
|
67
|
-
|
|
68
57
|
var _iterator = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
|
69
|
-
|
|
70
|
-
|
|
58
|
+
_step;
|
|
71
59
|
try {
|
|
72
60
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
73
61
|
var snapshot = _step.value;
|
|
74
|
-
|
|
75
62
|
if (snapshot.missingClientEdges) {
|
|
76
63
|
var _edges;
|
|
77
|
-
|
|
78
64
|
edges = (_edges = edges) !== null && _edges !== void 0 ? _edges : [];
|
|
79
|
-
|
|
80
65
|
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(snapshot.missingClientEdges),
|
|
81
|
-
|
|
82
|
-
|
|
66
|
+
_step2;
|
|
83
67
|
try {
|
|
84
68
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
85
69
|
var edge = _step2.value;
|
|
@@ -97,50 +81,81 @@ function getMissingClientEdges(state) {
|
|
|
97
81
|
} finally {
|
|
98
82
|
_iterator.f();
|
|
99
83
|
}
|
|
100
|
-
|
|
101
84
|
return edges;
|
|
102
85
|
}
|
|
103
86
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
87
|
+
function getSuspendingLiveResolver(state) {
|
|
88
|
+
if (state.kind === 'bailout') {
|
|
89
|
+
return null;
|
|
90
|
+
} else if (state.kind === 'singular') {
|
|
91
|
+
var _state$snapshot$missi2;
|
|
92
|
+
return (_state$snapshot$missi2 = state.snapshot.missingLiveResolverFields) !== null && _state$snapshot$missi2 !== void 0 ? _state$snapshot$missi2 : null;
|
|
93
|
+
} else {
|
|
94
|
+
var missingFields = null;
|
|
109
95
|
var _iterator3 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
|
110
|
-
|
|
111
|
-
|
|
96
|
+
_step3;
|
|
112
97
|
try {
|
|
113
98
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
114
99
|
var snapshot = _step3.value;
|
|
115
|
-
|
|
100
|
+
if (snapshot.missingLiveResolverFields) {
|
|
101
|
+
var _missingFields;
|
|
102
|
+
missingFields = (_missingFields = missingFields) !== null && _missingFields !== void 0 ? _missingFields : [];
|
|
103
|
+
var _iterator4 = (0, _createForOfIteratorHelper2["default"])(snapshot.missingLiveResolverFields),
|
|
104
|
+
_step4;
|
|
105
|
+
try {
|
|
106
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
107
|
+
var edge = _step4.value;
|
|
108
|
+
missingFields.push(edge);
|
|
109
|
+
}
|
|
110
|
+
} catch (err) {
|
|
111
|
+
_iterator4.e(err);
|
|
112
|
+
} finally {
|
|
113
|
+
_iterator4.f();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
116
|
}
|
|
117
117
|
} catch (err) {
|
|
118
118
|
_iterator3.e(err);
|
|
119
119
|
} finally {
|
|
120
120
|
_iterator3.f();
|
|
121
121
|
}
|
|
122
|
+
return missingFields;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function handlePotentialSnapshotErrorsForState(environment, state) {
|
|
126
|
+
if (state.kind === 'singular') {
|
|
127
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors);
|
|
128
|
+
} else if (state.kind === 'plural') {
|
|
129
|
+
var _iterator5 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
|
130
|
+
_step5;
|
|
131
|
+
try {
|
|
132
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
133
|
+
var snapshot = _step5.value;
|
|
134
|
+
handlePotentialSnapshotErrors(environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
|
|
135
|
+
}
|
|
136
|
+
} catch (err) {
|
|
137
|
+
_iterator5.e(err);
|
|
138
|
+
} finally {
|
|
139
|
+
_iterator5.f();
|
|
140
|
+
}
|
|
122
141
|
}
|
|
123
142
|
}
|
|
143
|
+
|
|
124
144
|
/**
|
|
125
145
|
* Check for updates to the store that occurred concurrently with rendering the given `state` value,
|
|
126
146
|
* returning a new (updated) state if there were updates or null if there were no changes.
|
|
127
147
|
*/
|
|
128
|
-
|
|
129
|
-
|
|
130
148
|
function handleMissedUpdates(environment, state) {
|
|
131
149
|
if (state.kind === 'bailout') {
|
|
132
150
|
return null;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
151
|
+
}
|
|
152
|
+
// FIXME this is invalid if we've just switched environments.
|
|
136
153
|
var currentEpoch = environment.getStore().getEpoch();
|
|
137
|
-
|
|
138
154
|
if (currentEpoch === state.epoch) {
|
|
139
155
|
return null;
|
|
140
|
-
}
|
|
156
|
+
}
|
|
157
|
+
// The store has updated since we rendered (without us being subscribed yet),
|
|
141
158
|
// so check for any updates to the data we're rendering:
|
|
142
|
-
|
|
143
|
-
|
|
144
159
|
if (state.kind === 'singular') {
|
|
145
160
|
var currentSnapshot = environment.lookup(state.snapshot.selector);
|
|
146
161
|
var updatedData = recycleNodesInto(state.snapshot.data, currentSnapshot.data);
|
|
@@ -162,14 +177,10 @@ function handleMissedUpdates(environment, state) {
|
|
|
162
177
|
} else {
|
|
163
178
|
var didMissUpdates = false;
|
|
164
179
|
var currentSnapshots = [];
|
|
165
|
-
|
|
166
180
|
for (var index = 0; index < state.snapshots.length; index++) {
|
|
167
181
|
var snapshot = state.snapshots[index];
|
|
168
|
-
|
|
169
182
|
var _currentSnapshot = environment.lookup(snapshot.selector);
|
|
170
|
-
|
|
171
183
|
var _updatedData = recycleNodesInto(snapshot.data, _currentSnapshot.data);
|
|
172
|
-
|
|
173
184
|
var _updatedCurrentSnapshot = {
|
|
174
185
|
data: _updatedData,
|
|
175
186
|
isMissingData: _currentSnapshot.isMissingData,
|
|
@@ -180,14 +191,11 @@ function handleMissedUpdates(environment, state) {
|
|
|
180
191
|
missingRequiredFields: _currentSnapshot.missingRequiredFields,
|
|
181
192
|
relayResolverErrors: _currentSnapshot.relayResolverErrors
|
|
182
193
|
};
|
|
183
|
-
|
|
184
194
|
if (_updatedData !== snapshot.data) {
|
|
185
195
|
didMissUpdates = true;
|
|
186
196
|
}
|
|
187
|
-
|
|
188
197
|
currentSnapshots.push(_updatedCurrentSnapshot);
|
|
189
198
|
}
|
|
190
|
-
|
|
191
199
|
!(currentSnapshots.length === state.snapshots.length) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected same number of snapshots') : invariant(false) : void 0;
|
|
192
200
|
return [didMissUpdates, {
|
|
193
201
|
kind: 'plural',
|
|
@@ -196,33 +204,32 @@ function handleMissedUpdates(environment, state) {
|
|
|
196
204
|
}];
|
|
197
205
|
}
|
|
198
206
|
}
|
|
199
|
-
|
|
200
207
|
function handleMissingClientEdge(environment, parentFragmentNode, parentFragmentRef, missingClientEdgeRequestInfo, queryOptions) {
|
|
201
208
|
var originalVariables = getVariablesFromFragment(parentFragmentNode, parentFragmentRef);
|
|
202
209
|
var variables = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, originalVariables), {}, {
|
|
203
210
|
id: missingClientEdgeRequestInfo.clientEdgeDestinationID // TODO should be a reserved name
|
|
204
|
-
|
|
205
211
|
});
|
|
206
|
-
|
|
212
|
+
|
|
213
|
+
var queryOperationDescriptor = createOperationDescriptor(missingClientEdgeRequestInfo.request, variables, queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.networkCacheConfig);
|
|
214
|
+
// This may suspend. We don't need to do anything with the results; all we're
|
|
207
215
|
// doing here is started the query if needed and retaining and releasing it
|
|
208
|
-
// according to the component mount/suspense cycle;
|
|
216
|
+
// according to the component mount/suspense cycle; QueryResource
|
|
209
217
|
// already handles this by itself.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
fetchPolicy: queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.fetchPolicy
|
|
213
|
-
}),
|
|
214
|
-
_ = _getQueryResultOrFetc[0],
|
|
215
|
-
effect = _getQueryResultOrFetc[1];
|
|
216
|
-
|
|
217
|
-
return effect;
|
|
218
|
+
var QueryResource = getQueryResourceForEnvironment(environment);
|
|
219
|
+
return QueryResource.prepare(queryOperationDescriptor, fetchQueryInternal(environment, queryOperationDescriptor), queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.fetchPolicy);
|
|
218
220
|
}
|
|
219
|
-
|
|
220
221
|
function subscribeToSnapshot(environment, state, setState) {
|
|
221
222
|
if (state.kind === 'bailout') {
|
|
222
223
|
return function () {};
|
|
223
224
|
} else if (state.kind === 'singular') {
|
|
224
225
|
var disposable = environment.subscribe(state.snapshot, function (latestSnapshot) {
|
|
225
|
-
setState(function (
|
|
226
|
+
setState(function (prevState) {
|
|
227
|
+
// In theory a setState from a subscription could be batched together
|
|
228
|
+
// with a setState to change the fragment selector. Guard against this
|
|
229
|
+
// by bailing out of the state update if the selector has changed.
|
|
230
|
+
if (prevState.kind !== 'singular' || prevState.snapshot.selector !== latestSnapshot.selector) {
|
|
231
|
+
return prevState;
|
|
232
|
+
}
|
|
226
233
|
return {
|
|
227
234
|
kind: 'singular',
|
|
228
235
|
snapshot: latestSnapshot,
|
|
@@ -236,9 +243,15 @@ function subscribeToSnapshot(environment, state, setState) {
|
|
|
236
243
|
} else {
|
|
237
244
|
var disposables = state.snapshots.map(function (snapshot, index) {
|
|
238
245
|
return environment.subscribe(snapshot, function (latestSnapshot) {
|
|
239
|
-
setState(function (
|
|
240
|
-
|
|
241
|
-
|
|
246
|
+
setState(function (prevState) {
|
|
247
|
+
var _prevState$snapshots$;
|
|
248
|
+
// In theory a setState from a subscription could be batched together
|
|
249
|
+
// with a setState to change the fragment selector. Guard against this
|
|
250
|
+
// by bailing out of the state update if the selector has changed.
|
|
251
|
+
if (prevState.kind !== 'plural' || ((_prevState$snapshots$ = prevState.snapshots[index]) === null || _prevState$snapshots$ === void 0 ? void 0 : _prevState$snapshots$.selector) !== latestSnapshot.selector) {
|
|
252
|
+
return prevState;
|
|
253
|
+
}
|
|
254
|
+
var updated = (0, _toConsumableArray2["default"])(prevState.snapshots);
|
|
242
255
|
updated[index] = latestSnapshot;
|
|
243
256
|
return {
|
|
244
257
|
kind: 'plural',
|
|
@@ -249,29 +262,29 @@ function subscribeToSnapshot(environment, state, setState) {
|
|
|
249
262
|
});
|
|
250
263
|
});
|
|
251
264
|
return function () {
|
|
252
|
-
var
|
|
253
|
-
|
|
254
|
-
|
|
265
|
+
var _iterator6 = (0, _createForOfIteratorHelper2["default"])(disposables),
|
|
266
|
+
_step6;
|
|
255
267
|
try {
|
|
256
|
-
for (
|
|
257
|
-
var d =
|
|
268
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
269
|
+
var d = _step6.value;
|
|
258
270
|
d.dispose();
|
|
259
271
|
}
|
|
260
272
|
} catch (err) {
|
|
261
|
-
|
|
273
|
+
_iterator6.e(err);
|
|
262
274
|
} finally {
|
|
263
|
-
|
|
275
|
+
_iterator6.f();
|
|
264
276
|
}
|
|
265
277
|
};
|
|
266
278
|
}
|
|
267
279
|
}
|
|
268
|
-
|
|
269
|
-
function getFragmentState(environment, fragmentSelector, isPlural) {
|
|
280
|
+
function getFragmentState(environment, fragmentSelector) {
|
|
270
281
|
if (fragmentSelector == null) {
|
|
271
282
|
return {
|
|
272
283
|
kind: 'bailout'
|
|
273
284
|
};
|
|
274
285
|
} else if (fragmentSelector.kind === 'PluralReaderSelector') {
|
|
286
|
+
// Note that if fragmentRef is an empty array, fragmentSelector will be null so we'll hit the above case.
|
|
287
|
+
// Null is returned by getSelector if fragmentRef has no non-null items.
|
|
275
288
|
return {
|
|
276
289
|
kind: 'plural',
|
|
277
290
|
snapshots: fragmentSelector.selectors.map(function (s) {
|
|
@@ -286,229 +299,200 @@ function getFragmentState(environment, fragmentSelector, isPlural) {
|
|
|
286
299
|
epoch: environment.getStore().getEpoch()
|
|
287
300
|
};
|
|
288
301
|
}
|
|
289
|
-
}
|
|
290
|
-
|
|
302
|
+
}
|
|
291
303
|
|
|
304
|
+
// fragmentNode cannot change during the lifetime of the component, though fragmentRef may change.
|
|
292
305
|
function useFragmentInternal_REACT_CACHE(fragmentNode, fragmentRef, hookDisplayName, queryOptions, fragmentKey) {
|
|
293
306
|
var _fragmentNode$metadat, _fragmentNode$metadat2;
|
|
294
|
-
|
|
295
307
|
var fragmentSelector = useMemo(function () {
|
|
296
308
|
return getSelector(fragmentNode, fragmentRef);
|
|
297
309
|
}, [fragmentNode, fragmentRef]);
|
|
298
310
|
var isPlural = (fragmentNode === null || fragmentNode === void 0 ? void 0 : (_fragmentNode$metadat = fragmentNode.metadata) === null || _fragmentNode$metadat === void 0 ? void 0 : _fragmentNode$metadat.plural) === true;
|
|
299
|
-
|
|
300
311
|
if (isPlural) {
|
|
301
312
|
!(fragmentRef == null || Array.isArray(fragmentRef)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected fragment pointer%s for fragment `%s` to be ' + 'an array, instead got `%s`. Remove `@relay(plural: true)` ' + 'from fragment `%s` to allow the prop to be an object.', fragmentKey != null ? " for key `".concat(fragmentKey, "`") : '', fragmentNode.name, typeof fragmentRef, fragmentNode.name) : invariant(false) : void 0;
|
|
302
313
|
} else {
|
|
303
314
|
!!Array.isArray(fragmentRef) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected fragment pointer%s for fragment `%s` not to be ' + 'an array, instead got `%s`. Add `@relay(plural: true)` ' + 'to fragment `%s` to allow the prop to be an array.', fragmentKey != null ? " for key `".concat(fragmentKey, "`") : '', fragmentNode.name, typeof fragmentRef, fragmentNode.name) : invariant(false) : void 0;
|
|
304
315
|
}
|
|
305
|
-
|
|
306
316
|
!(fragmentRef == null || isPlural && Array.isArray(fragmentRef) && fragmentRef.length === 0 || fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to receive an object where `...%s` was spread, ' + 'but the fragment reference was not found`. This is most ' + 'likely the result of:\n' + "- Forgetting to spread `%s` in `%s`'s parent's fragment.\n" + '- Conditionally fetching `%s` but unconditionally passing %s prop ' + 'to `%s`. If the parent fragment only fetches the fragment conditionally ' + '- with e.g. `@include`, `@skip`, or inside a `... on SomeType { }` ' + 'spread - then the fragment reference will not exist. ' + 'In this case, pass `null` if the conditions for evaluating the ' + 'fragment are not met (e.g. if the `@include(if)` value is false.)', fragmentNode.name, fragmentNode.name, hookDisplayName, fragmentNode.name, fragmentKey == null ? 'a fragment reference' : "the `".concat(fragmentKey, "`"), hookDisplayName) : invariant(false) : void 0;
|
|
307
317
|
var environment = useRelayEnvironment();
|
|
308
|
-
|
|
309
318
|
var _useState = useState(function () {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
// fragmentRef goes from non-null to null?
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
var stateFromRawState = function stateFromRawState(state) {
|
|
319
|
-
if (fragmentRef == null) {
|
|
320
|
-
return {
|
|
321
|
-
kind: 'bailout'
|
|
322
|
-
};
|
|
323
|
-
} else if (state.kind === 'plural' && state.snapshots.length === 0) {
|
|
324
|
-
return {
|
|
325
|
-
kind: 'bailout'
|
|
326
|
-
};
|
|
327
|
-
} else {
|
|
328
|
-
return state;
|
|
329
|
-
}
|
|
330
|
-
};
|
|
319
|
+
return getFragmentState(environment, fragmentSelector);
|
|
320
|
+
}),
|
|
321
|
+
_state = _useState[0],
|
|
322
|
+
setState = _useState[1];
|
|
323
|
+
var state = _state;
|
|
331
324
|
|
|
332
|
-
|
|
325
|
+
// This copy of the state we only update when something requires us to
|
|
333
326
|
// unsubscribe and re-subscribe, namely a changed environment or
|
|
334
327
|
// fragment selector.
|
|
335
|
-
|
|
336
328
|
var _useState2 = useState(state),
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
var subscribedState = stateFromRawState(rawSubscribedState);
|
|
342
|
-
|
|
329
|
+
_subscribedState = _useState2[0],
|
|
330
|
+
setSubscribedState = _useState2[1];
|
|
331
|
+
// FIXME since this is used as an effect dependency, it needs to be memoized.
|
|
332
|
+
var subscribedState = _subscribedState;
|
|
343
333
|
var _useState3 = useState(fragmentSelector),
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
334
|
+
previousFragmentSelector = _useState3[0],
|
|
335
|
+
setPreviousFragmentSelector = _useState3[1];
|
|
347
336
|
var _useState4 = useState(environment),
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
337
|
+
previousEnvironment = _useState4[0],
|
|
338
|
+
setPreviousEnvironment = _useState4[1];
|
|
351
339
|
if (!areEqualSelectors(fragmentSelector, previousFragmentSelector) || environment !== previousEnvironment) {
|
|
352
340
|
// Enqueue setState to record the new selector and state
|
|
353
341
|
setPreviousFragmentSelector(fragmentSelector);
|
|
354
342
|
setPreviousEnvironment(environment);
|
|
355
|
-
var newState =
|
|
343
|
+
var newState = getFragmentState(environment, fragmentSelector);
|
|
356
344
|
setState(newState);
|
|
357
345
|
setSubscribedState(newState); // This causes us to form a new subscription
|
|
358
346
|
// But render with the latest state w/o waiting for the setState. Otherwise
|
|
359
347
|
// the component would render the wrong information temporarily (including
|
|
360
348
|
// possibly incorrectly triggering some warnings below).
|
|
361
|
-
|
|
362
349
|
state = newState;
|
|
363
350
|
subscribedState = newState;
|
|
364
|
-
}
|
|
365
|
-
// FIXME handle client edges in parallel.
|
|
351
|
+
}
|
|
366
352
|
|
|
353
|
+
// The purpose of this is to detect whether we have ever committed, because we
|
|
354
|
+
// don't suspend on store updates, only when the component either is first trying
|
|
355
|
+
// to mount or when the our selector changes. The selector change in particular is
|
|
356
|
+
// how we suspend for pagination and refetech. Also, fragment selector can be null
|
|
357
|
+
// or undefined, so we use false as a special value to distinguish from all fragment
|
|
358
|
+
// selectors; false means that the component hasn't mounted yet.
|
|
359
|
+
var committedFragmentSelectorRef = useRef(false);
|
|
360
|
+
useEffect(function () {
|
|
361
|
+
committedFragmentSelectorRef.current = fragmentSelector;
|
|
362
|
+
}, [fragmentSelector]);
|
|
367
363
|
|
|
364
|
+
// Handle the queries for any missing client edges; this may suspend.
|
|
365
|
+
// FIXME handle client edges in parallel.
|
|
368
366
|
if (((_fragmentNode$metadat2 = fragmentNode.metadata) === null || _fragmentNode$metadat2 === void 0 ? void 0 : _fragmentNode$metadat2.hasClientEdges) === true) {
|
|
369
367
|
// The fragment is validated to be static (in useFragment) and hasClientEdges is
|
|
370
368
|
// a static (constant) property of the fragment. In practice, this effect will
|
|
371
369
|
// always or never run for a given invocation of this hook.
|
|
372
370
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
373
|
-
var
|
|
374
|
-
var missingClientEdges = getMissingClientEdges(state);
|
|
375
|
-
|
|
376
|
-
var
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
var _iterator5 = (0, _createForOfIteratorHelper2["default"])(missingClientEdges),
|
|
382
|
-
_step5;
|
|
383
|
-
|
|
371
|
+
var clientEdgeQueries = useMemo(function () {
|
|
372
|
+
var missingClientEdges = getMissingClientEdges(state);
|
|
373
|
+
// eslint-disable-next-line no-shadow
|
|
374
|
+
var clientEdgeQueries;
|
|
375
|
+
if (missingClientEdges !== null && missingClientEdges !== void 0 && missingClientEdges.length) {
|
|
376
|
+
clientEdgeQueries = [];
|
|
377
|
+
var _iterator7 = (0, _createForOfIteratorHelper2["default"])(missingClientEdges),
|
|
378
|
+
_step7;
|
|
384
379
|
try {
|
|
385
|
-
for (
|
|
386
|
-
var edge =
|
|
387
|
-
|
|
380
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
381
|
+
var edge = _step7.value;
|
|
382
|
+
clientEdgeQueries.push(handleMissingClientEdge(environment, fragmentNode, fragmentRef, edge, queryOptions));
|
|
388
383
|
}
|
|
389
384
|
} catch (err) {
|
|
390
|
-
|
|
385
|
+
_iterator7.e(err);
|
|
391
386
|
} finally {
|
|
392
|
-
|
|
387
|
+
_iterator7.f();
|
|
393
388
|
}
|
|
394
389
|
}
|
|
390
|
+
return clientEdgeQueries;
|
|
391
|
+
}, [state, environment, fragmentNode, fragmentRef, queryOptions]);
|
|
395
392
|
|
|
396
|
-
|
|
397
|
-
}, [state, environment, fragmentNode, fragmentRef, queryOptions]); // See above note
|
|
393
|
+
// See above note
|
|
398
394
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
399
|
-
|
|
400
395
|
useEffect(function () {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
var
|
|
405
|
-
|
|
406
|
-
|
|
396
|
+
var QueryResource = getQueryResourceForEnvironment(environment);
|
|
397
|
+
if (clientEdgeQueries !== null && clientEdgeQueries !== void 0 && clientEdgeQueries.length) {
|
|
398
|
+
var disposables = [];
|
|
399
|
+
var _iterator8 = (0, _createForOfIteratorHelper2["default"])(clientEdgeQueries),
|
|
400
|
+
_step8;
|
|
407
401
|
try {
|
|
408
|
-
for (
|
|
409
|
-
var
|
|
410
|
-
|
|
402
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
|
403
|
+
var query = _step8.value;
|
|
404
|
+
disposables.push(QueryResource.retain(query));
|
|
411
405
|
}
|
|
412
406
|
} catch (err) {
|
|
413
|
-
|
|
407
|
+
_iterator8.e(err);
|
|
414
408
|
} finally {
|
|
415
|
-
|
|
409
|
+
_iterator8.f();
|
|
416
410
|
}
|
|
417
|
-
|
|
418
411
|
return function () {
|
|
419
|
-
var
|
|
420
|
-
|
|
421
|
-
|
|
412
|
+
var _iterator9 = (0, _createForOfIteratorHelper2["default"])(disposables),
|
|
413
|
+
_step9;
|
|
422
414
|
try {
|
|
423
|
-
for (
|
|
424
|
-
var
|
|
425
|
-
|
|
415
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
|
416
|
+
var disposable = _step9.value;
|
|
417
|
+
disposable.dispose();
|
|
426
418
|
}
|
|
427
419
|
} catch (err) {
|
|
428
|
-
|
|
420
|
+
_iterator9.e(err);
|
|
429
421
|
} finally {
|
|
430
|
-
|
|
422
|
+
_iterator9.f();
|
|
431
423
|
}
|
|
432
424
|
};
|
|
433
425
|
}
|
|
434
|
-
}, [
|
|
426
|
+
}, [environment, clientEdgeQueries]);
|
|
435
427
|
}
|
|
436
|
-
|
|
437
428
|
if (isMissingData(state)) {
|
|
429
|
+
// Suspend if a Live Resolver within this fragment is in a suspended state:
|
|
430
|
+
var suspendingLiveResolvers = getSuspendingLiveResolver(state);
|
|
431
|
+
if (suspendingLiveResolvers != null && suspendingLiveResolvers.length > 0) {
|
|
432
|
+
throw Promise.all(suspendingLiveResolvers.map(function (_ref) {
|
|
433
|
+
var liveStateID = _ref.liveStateID;
|
|
434
|
+
// $FlowFixMe[prop-missing] This is expected to be a LiveResolverStore
|
|
435
|
+
return environment.getStore().getLiveResolverPromise(liveStateID);
|
|
436
|
+
}));
|
|
437
|
+
}
|
|
438
438
|
// Suspend if an active operation bears on this fragment, either the
|
|
439
|
-
// fragment's owner or some other mutation etc. that could affect it
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
439
|
+
// fragment's owner or some other mutation etc. that could affect it.
|
|
440
|
+
// We only suspend when the component is first trying to mount or changing
|
|
441
|
+
// selectors, not if data becomes missing later:
|
|
442
|
+
if (!committedFragmentSelectorRef.current || !areEqualSelectors(committedFragmentSelectorRef.current, fragmentSelector)) {
|
|
443
|
+
!(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'refinement, see invariants above') : invariant(false) : void 0;
|
|
444
|
+
var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
|
|
445
|
+
var pendingOperationsResult = getPendingOperationsForFragment(environment, fragmentNode, fragmentOwner);
|
|
446
|
+
if (pendingOperationsResult) {
|
|
447
|
+
throw pendingOperationsResult.promise;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// Report required fields only if we're not suspending, since that means
|
|
447
451
|
// they're missing even though we are out of options for possibly fetching them:
|
|
448
|
-
|
|
449
|
-
|
|
450
452
|
handlePotentialSnapshotErrorsForState(environment, state);
|
|
451
453
|
}
|
|
452
|
-
|
|
453
454
|
useEffect(function () {
|
|
454
455
|
// Check for updates since the state was rendered
|
|
455
456
|
var currentState = subscribedState;
|
|
456
457
|
var updates = handleMissedUpdates(environment, subscribedState);
|
|
457
|
-
|
|
458
458
|
if (updates !== null) {
|
|
459
459
|
var didMissUpdates = updates[0],
|
|
460
|
-
|
|
460
|
+
updatedState = updates[1];
|
|
461
|
+
// TODO: didMissUpdates only checks for changes to snapshot data, but it's possible
|
|
461
462
|
// that other snapshot properties may have changed that should also trigger a re-render,
|
|
462
463
|
// such as changed missing resolver fields, missing client edges, etc.
|
|
463
464
|
// A potential alternative is for handleMissedUpdates() to recycle the entire state
|
|
464
465
|
// value, and return the new (recycled) state only if there was some change. In that
|
|
465
466
|
// case the code would always setState if something in the snapshot changed, in addition
|
|
466
467
|
// to using the latest snapshot to subscribe.
|
|
467
|
-
|
|
468
468
|
if (didMissUpdates) {
|
|
469
469
|
setState(updatedState);
|
|
470
470
|
}
|
|
471
|
-
|
|
472
471
|
currentState = updatedState;
|
|
473
472
|
}
|
|
474
|
-
|
|
475
|
-
return subscribeToSnapshot(environment, currentState, function (updater) {
|
|
476
|
-
setState(function (latestState) {
|
|
477
|
-
var _latestState$snapshot, _currentState$snapsho;
|
|
478
|
-
|
|
479
|
-
if (((_latestState$snapshot = latestState.snapshot) === null || _latestState$snapshot === void 0 ? void 0 : _latestState$snapshot.selector) !== ((_currentState$snapsho = currentState.snapshot) === null || _currentState$snapsho === void 0 ? void 0 : _currentState$snapsho.selector)) {
|
|
480
|
-
// Ignore updates to the subscription if it's for a previous fragment selector
|
|
481
|
-
// than the latest one to be rendered. This can happen if the store is updated
|
|
482
|
-
// after we re-render with a new fragmentRef prop but before the effect fires
|
|
483
|
-
// in which we unsubscribe to the old one and subscribe to the new one.
|
|
484
|
-
// (NB: it's safe to compare the selectors by reference because the selector
|
|
485
|
-
// is recycled into new snapshots.)
|
|
486
|
-
return latestState;
|
|
487
|
-
} else {
|
|
488
|
-
return updater(latestState);
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
});
|
|
473
|
+
return subscribeToSnapshot(environment, currentState, setState);
|
|
492
474
|
}, [environment, subscribedState]);
|
|
493
475
|
var data;
|
|
494
|
-
|
|
495
476
|
if (isPlural) {
|
|
496
477
|
// Plural fragments require allocating an array of the snasphot data values,
|
|
497
478
|
// which has to be memoized to avoid triggering downstream re-renders.
|
|
498
479
|
//
|
|
499
480
|
// Note that isPlural is a constant property of the fragment and does not change
|
|
500
481
|
// for a particular useFragment invocation site
|
|
482
|
+
var fragmentRefIsNullish = fragmentRef == null; // for less sensitive memoization
|
|
501
483
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
502
484
|
data = useMemo(function () {
|
|
503
485
|
if (state.kind === 'bailout') {
|
|
504
|
-
|
|
486
|
+
// Bailout state can happen if the fragmentRef is a plural array that is empty or has no
|
|
487
|
+
// non-null entries. In that case, the compatible behavior is to return [] instead of null.
|
|
488
|
+
return fragmentRefIsNullish ? null : [];
|
|
505
489
|
} else {
|
|
506
490
|
!(state.kind === 'plural') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected state to be plural because fragment is plural') : invariant(false) : void 0;
|
|
507
491
|
return state.snapshots.map(function (s) {
|
|
508
492
|
return s.data;
|
|
509
493
|
});
|
|
510
494
|
}
|
|
511
|
-
}, [state]);
|
|
495
|
+
}, [state, fragmentRefIsNullish]);
|
|
512
496
|
} else if (state.kind === 'bailout') {
|
|
513
497
|
// This case doesn't allocate a new object so it doesn't have to be memoized
|
|
514
498
|
data = null;
|
|
@@ -517,7 +501,6 @@ function useFragmentInternal_REACT_CACHE(fragmentNode, fragmentRef, hookDisplayN
|
|
|
517
501
|
!(state.kind === 'singular') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected state to be singular because fragment is singular') : invariant(false) : void 0;
|
|
518
502
|
data = state.snapshot.data;
|
|
519
503
|
}
|
|
520
|
-
|
|
521
504
|
if (process.env.NODE_ENV !== "production") {
|
|
522
505
|
if (fragmentRef != null && (data === undefined || Array.isArray(data) && data.length > 0 && data.every(function (d) {
|
|
523
506
|
return d === undefined;
|
|
@@ -525,7 +508,6 @@ function useFragmentInternal_REACT_CACHE(fragmentNode, fragmentRef, hookDisplayN
|
|
|
525
508
|
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Expected to have been able to read non-null data for ' + 'fragment `%s` declared in ' + '`%s`, since fragment reference was non-null. ' + "Make sure that that `%s`'s parent isn't " + 'holding on to and/or passing a fragment reference for data that ' + 'has been deleted.', fragmentNode.name, hookDisplayName, hookDisplayName) : void 0;
|
|
526
509
|
}
|
|
527
510
|
}
|
|
528
|
-
|
|
529
511
|
if (process.env.NODE_ENV !== "production") {
|
|
530
512
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
531
513
|
useDebugValue({
|
|
@@ -533,8 +515,6 @@ function useFragmentInternal_REACT_CACHE(fragmentNode, fragmentRef, hookDisplayN
|
|
|
533
515
|
data: data
|
|
534
516
|
});
|
|
535
517
|
}
|
|
536
|
-
|
|
537
518
|
return data;
|
|
538
519
|
}
|
|
539
|
-
|
|
540
520
|
module.exports = useFragmentInternal_REACT_CACHE;
|