react-relay 18.0.0 → 18.2.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/ReactRelayContext.js +1 -1
- package/ReactRelayFragmentContainer.js.flow +2 -5
- package/buildReactRelayContainer.js.flow +1 -0
- package/hooks.js +1 -1
- package/index.js +1 -1
- package/index.js.flow +3 -0
- package/legacy.js +1 -1
- package/lib/index.js +2 -0
- package/lib/relay-hooks/getConnectionState.js +47 -0
- package/lib/relay-hooks/legacy/FragmentResource.js +3 -8
- package/lib/relay-hooks/loadQuery.js +5 -14
- package/lib/relay-hooks/readFragmentInternal.js +2 -4
- package/lib/relay-hooks/useFragmentInternal.js +1 -1
- package/lib/relay-hooks/useFragmentInternal_CURRENT.js +3 -10
- package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +6 -28
- package/lib/relay-hooks/useLoadMoreFunction.js +10 -43
- package/lib/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js +130 -0
- package/lib/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js +227 -0
- package/lib/relay-hooks/useQueryLoader.js +8 -0
- package/lib/relay-hooks/useQueryLoader_EXPERIMENTAL.js +120 -0
- 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 +1 -1
- package/react-relay-legacy.min.js +1 -1
- package/react-relay.js +2 -2
- package/react-relay.min.js +2 -2
- package/relay-hooks/EntryPointTypes.flow.js.flow +2 -2
- package/relay-hooks/MatchContainer.js.flow +1 -1
- package/relay-hooks/getConnectionState.js.flow +97 -0
- package/relay-hooks/legacy/FragmentResource.js.flow +4 -16
- package/relay-hooks/loadQuery.js.flow +30 -38
- package/relay-hooks/readFragmentInternal.js.flow +1 -10
- package/relay-hooks/useFragmentInternal.js.flow +1 -1
- package/relay-hooks/useFragmentInternal_CURRENT.js.flow +7 -22
- package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +8 -56
- package/relay-hooks/useLoadMoreFunction.js.flow +14 -80
- package/relay-hooks/useLoadMoreFunction_EXPERIMENTAL.js.flow +280 -0
- package/relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL.js.flow +433 -0
- package/relay-hooks/useQueryLoader.js.flow +27 -3
- package/relay-hooks/useQueryLoader_EXPERIMENTAL.js.flow +253 -0
package/ReactRelayContext.js
CHANGED
@@ -270,14 +270,11 @@ function getRelayProp(environment: IEnvironment) {
|
|
270
270
|
function createContainer<
|
271
271
|
Props: {...},
|
272
272
|
Instance,
|
273
|
-
TComponent: React.
|
273
|
+
TComponent: component(ref: React.RefSetter<Instance>, ...Props),
|
274
274
|
>(
|
275
275
|
Component: TComponent,
|
276
276
|
fragmentSpec: GeneratedNodeMap,
|
277
|
-
): React.
|
278
|
-
$RelayProps<React.ElementConfig<TComponent>, RelayProp>,
|
279
|
-
Instance,
|
280
|
-
> {
|
277
|
+
): component(ref: React.RefSetter<Instance>, ...$RelayProps<Props, RelayProp>) {
|
281
278
|
// $FlowFixMe[incompatible-return]
|
282
279
|
return buildReactRelayContainer(
|
283
280
|
Component,
|
package/hooks.js
CHANGED
package/index.js
CHANGED
package/index.js.flow
CHANGED
@@ -28,6 +28,7 @@ const useFragment = require('./relay-hooks/useFragment');
|
|
28
28
|
const useLazyLoadQuery = require('./relay-hooks/useLazyLoadQuery');
|
29
29
|
const useMutation = require('./relay-hooks/useMutation');
|
30
30
|
const usePaginationFragment = require('./relay-hooks/usePaginationFragment');
|
31
|
+
const usePrefetchableForwardPaginationFragment_EXPERIMENTAL = require('./relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL');
|
31
32
|
const usePreloadedQuery = require('./relay-hooks/usePreloadedQuery');
|
32
33
|
const useQueryLoader = require('./relay-hooks/useQueryLoader');
|
33
34
|
const useRefetchableFragment = require('./relay-hooks/useRefetchableFragment');
|
@@ -125,6 +126,8 @@ module.exports = {
|
|
125
126
|
usePaginationFragment: usePaginationFragment,
|
126
127
|
usePreloadedQuery: usePreloadedQuery,
|
127
128
|
useRefetchableFragment: useRefetchableFragment,
|
129
|
+
usePrefetchableForwardPaginationFragment_EXPERIMENTAL:
|
130
|
+
usePrefetchableForwardPaginationFragment_EXPERIMENTAL,
|
128
131
|
useRelayEnvironment: useRelayEnvironment,
|
129
132
|
useSubscribeToInvalidationState: useSubscribeToInvalidationState,
|
130
133
|
useSubscription: useSubscription,
|
package/legacy.js
CHANGED
package/lib/index.js
CHANGED
@@ -18,6 +18,7 @@ var useFragment = require('./relay-hooks/useFragment');
|
|
18
18
|
var useLazyLoadQuery = require('./relay-hooks/useLazyLoadQuery');
|
19
19
|
var useMutation = require('./relay-hooks/useMutation');
|
20
20
|
var usePaginationFragment = require('./relay-hooks/usePaginationFragment');
|
21
|
+
var usePrefetchableForwardPaginationFragment_EXPERIMENTAL = require('./relay-hooks/usePrefetchableForwardPaginationFragment_EXPERIMENTAL');
|
21
22
|
var usePreloadedQuery = require('./relay-hooks/usePreloadedQuery');
|
22
23
|
var useQueryLoader = require('./relay-hooks/useQueryLoader');
|
23
24
|
var useRefetchableFragment = require('./relay-hooks/useRefetchableFragment');
|
@@ -57,6 +58,7 @@ module.exports = {
|
|
57
58
|
usePaginationFragment: usePaginationFragment,
|
58
59
|
usePreloadedQuery: usePreloadedQuery,
|
59
60
|
useRefetchableFragment: useRefetchableFragment,
|
61
|
+
usePrefetchableForwardPaginationFragment_EXPERIMENTAL: usePrefetchableForwardPaginationFragment_EXPERIMENTAL,
|
60
62
|
useRelayEnvironment: useRelayEnvironment,
|
61
63
|
useSubscribeToInvalidationState: useSubscribeToInvalidationState,
|
62
64
|
useSubscription: useSubscription
|
@@ -0,0 +1,47 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var invariant = require('invariant');
|
4
|
+
var _require = require('relay-runtime'),
|
5
|
+
ConnectionInterface = _require.ConnectionInterface,
|
6
|
+
getValueAtPath = _require.getValueAtPath;
|
7
|
+
function getConnectionState(direction, fragmentNode, fragmentData, connectionPathInFragmentData) {
|
8
|
+
var _pageInfo$END_CURSOR, _pageInfo$START_CURSO;
|
9
|
+
var _ConnectionInterface$ = ConnectionInterface.get(),
|
10
|
+
EDGES = _ConnectionInterface$.EDGES,
|
11
|
+
PAGE_INFO = _ConnectionInterface$.PAGE_INFO,
|
12
|
+
HAS_NEXT_PAGE = _ConnectionInterface$.HAS_NEXT_PAGE,
|
13
|
+
HAS_PREV_PAGE = _ConnectionInterface$.HAS_PREV_PAGE,
|
14
|
+
END_CURSOR = _ConnectionInterface$.END_CURSOR,
|
15
|
+
START_CURSOR = _ConnectionInterface$.START_CURSOR;
|
16
|
+
var connection = getValueAtPath(fragmentData, connectionPathInFragmentData);
|
17
|
+
if (connection == null) {
|
18
|
+
return {
|
19
|
+
cursor: null,
|
20
|
+
hasMore: false
|
21
|
+
};
|
22
|
+
}
|
23
|
+
!(typeof connection === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected connection in fragment `%s` to have been `null`, or ' + 'a plain object with %s and %s properties. Instead got `%s`.', fragmentNode.name, EDGES, PAGE_INFO, connection) : invariant(false) : void 0;
|
24
|
+
var edges = connection[EDGES];
|
25
|
+
var pageInfo = connection[PAGE_INFO];
|
26
|
+
if (edges == null || pageInfo == null) {
|
27
|
+
return {
|
28
|
+
cursor: null,
|
29
|
+
hasMore: false
|
30
|
+
};
|
31
|
+
}
|
32
|
+
!Array.isArray(edges) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected connection in fragment `%s` to have a plural `%s` field. ' + 'Instead got `%s`.', fragmentNode.name, EDGES, edges) : invariant(false) : void 0;
|
33
|
+
!(typeof pageInfo === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected connection in fragment `%s` to have a `%s` field. ' + 'Instead got `%s`.', fragmentNode.name, PAGE_INFO, pageInfo) : invariant(false) : void 0;
|
34
|
+
var cursor = direction === 'forward' ? (_pageInfo$END_CURSOR = pageInfo[END_CURSOR]) !== null && _pageInfo$END_CURSOR !== void 0 ? _pageInfo$END_CURSOR : null : (_pageInfo$START_CURSO = pageInfo[START_CURSOR]) !== null && _pageInfo$START_CURSO !== void 0 ? _pageInfo$START_CURSO : null;
|
35
|
+
!(cursor === null || typeof cursor === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected page info for connection in fragment `%s` to have a ' + 'valid `%s`. Instead got `%s`.', fragmentNode.name, START_CURSOR, cursor) : invariant(false) : void 0;
|
36
|
+
var hasMore;
|
37
|
+
if (direction === 'forward') {
|
38
|
+
hasMore = cursor != null && pageInfo[HAS_NEXT_PAGE] === true;
|
39
|
+
} else {
|
40
|
+
hasMore = cursor != null && pageInfo[HAS_PREV_PAGE] === true;
|
41
|
+
}
|
42
|
+
return {
|
43
|
+
cursor: cursor,
|
44
|
+
hasMore: hasMore
|
45
|
+
};
|
46
|
+
}
|
47
|
+
module.exports = getConnectionState;
|
@@ -243,8 +243,7 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
243
243
|
var fragmentOwner = fragmentSelector.kind === 'PluralReaderSelector' ? fragmentSelector.selectors[0].owner : fragmentSelector.owner;
|
244
244
|
var parentQueryPromiseResult = this._getAndSavePromiseForFragmentRequestInFlight(fragmentIdentifier, fragmentNode, fragmentOwner, fragmentResult);
|
245
245
|
var parentQueryPromiseResultPromise = parentQueryPromiseResult === null || parentQueryPromiseResult === void 0 ? void 0 : parentQueryPromiseResult.promise;
|
246
|
-
var missingResolverFieldPromises = (_missingLiveResolverF2 = (_missingLiveResolverF3 = missingLiveResolverFields(snapshot)) === null || _missingLiveResolverF3 === void 0 ? void 0 : _missingLiveResolverF3.map(function (
|
247
|
-
var liveStateID = _ref2.liveStateID;
|
246
|
+
var missingResolverFieldPromises = (_missingLiveResolverF2 = (_missingLiveResolverF3 = missingLiveResolverFields(snapshot)) === null || _missingLiveResolverF3 === void 0 ? void 0 : _missingLiveResolverF3.map(function (liveStateID) {
|
248
247
|
var store = environment.getStore();
|
249
248
|
return store.getLiveResolverPromise(liveStateID);
|
250
249
|
})) !== null && _missingLiveResolverF2 !== void 0 ? _missingLiveResolverF2 : [];
|
@@ -309,12 +308,10 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
309
308
|
var _this4 = this;
|
310
309
|
if (Array.isArray(snapshot)) {
|
311
310
|
snapshot.forEach(function (s) {
|
312
|
-
|
313
|
-
handlePotentialSnapshotErrors(_this4._environment, s.missingRequiredFields, s.relayResolverErrors, s.errorResponseFields, (_s$selector$node$meta = (_s$selector$node$meta2 = s.selector.node.metadata) === null || _s$selector$node$meta2 === void 0 ? void 0 : _s$selector$node$meta2.throwOnFieldError) !== null && _s$selector$node$meta !== void 0 ? _s$selector$node$meta : false);
|
311
|
+
handlePotentialSnapshotErrors(_this4._environment, s.errorResponseFields);
|
314
312
|
});
|
315
313
|
} else {
|
316
|
-
|
317
|
-
handlePotentialSnapshotErrors(this._environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors, snapshot.errorResponseFields, (_snapshot$selector$no = (_snapshot$selector$no2 = snapshot.selector.node.metadata) === null || _snapshot$selector$no2 === void 0 ? void 0 : _snapshot$selector$no2.throwOnFieldError) !== null && _snapshot$selector$no !== void 0 ? _snapshot$selector$no : false);
|
314
|
+
handlePotentialSnapshotErrors(this._environment, snapshot.errorResponseFields);
|
318
315
|
}
|
319
316
|
};
|
320
317
|
_proto2.readSpec = function readSpec(fragmentNodes, fragmentRefs, componentDisplayName) {
|
@@ -456,8 +453,6 @@ var FragmentResourceImpl = /*#__PURE__*/function () {
|
|
456
453
|
missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
|
457
454
|
seenRecords: currentSnapshot.seenRecords,
|
458
455
|
selector: currentSnapshot.selector,
|
459
|
-
missingRequiredFields: currentSnapshot.missingRequiredFields,
|
460
|
-
relayResolverErrors: currentSnapshot.relayResolverErrors,
|
461
456
|
errorResponseFields: currentSnapshot.errorResponseFields
|
462
457
|
};
|
463
458
|
if (updatedData !== renderData) {
|
@@ -7,7 +7,6 @@ var _require = require('relay-runtime'),
|
|
7
7
|
fetchQueryDeduped = _require.__internal.fetchQueryDeduped,
|
8
8
|
Observable = _require.Observable,
|
9
9
|
PreloadableQueryRegistry = _require.PreloadableQueryRegistry,
|
10
|
-
RelayFeatureFlags = _require.RelayFeatureFlags,
|
11
10
|
ReplaySubject = _require.ReplaySubject,
|
12
11
|
createOperationDescriptor = _require.createOperationDescriptor,
|
13
12
|
getRequest = _require.getRequest,
|
@@ -38,18 +37,12 @@ function loadQuery(environment, preloadableRequest, variables, options, environm
|
|
38
37
|
var didMakeNetworkRequest = false;
|
39
38
|
var makeNetworkRequest = function makeNetworkRequest(params) {
|
40
39
|
didMakeNetworkRequest = true;
|
41
|
-
var observable;
|
42
40
|
var subject = new ReplaySubject();
|
43
|
-
|
44
|
-
|
45
|
-
observable = fetchQueryDeduped(environment, identifier, function () {
|
46
|
-
var network = environment.getNetwork();
|
47
|
-
return network.execute(params, variables, networkCacheConfig);
|
48
|
-
});
|
49
|
-
} else {
|
41
|
+
var identifier = 'raw-network-request-' + getRequestIdentifier(params, variables);
|
42
|
+
var observable = fetchQueryDeduped(environment, identifier, function () {
|
50
43
|
var network = environment.getNetwork();
|
51
|
-
|
52
|
-
}
|
44
|
+
return network.execute(params, variables, networkCacheConfig);
|
45
|
+
});
|
53
46
|
var _observable$subscribe = observable.subscribe({
|
54
47
|
error: function error(err) {
|
55
48
|
networkError = err;
|
@@ -74,9 +67,7 @@ function loadQuery(environment, preloadableRequest, variables, options, environm
|
|
74
67
|
};
|
75
68
|
var unsubscribeFromExecution;
|
76
69
|
var executeDeduped = function executeDeduped(operation, fetchFn) {
|
77
|
-
|
78
|
-
didMakeNetworkRequest = true;
|
79
|
-
}
|
70
|
+
didMakeNetworkRequest = true;
|
80
71
|
var _fetchQueryDeduped$su = fetchQueryDeduped(environment, operation.request.identifier, fetchFn).subscribe({
|
81
72
|
error: function error(err) {
|
82
73
|
executionSubject.error(err);
|
@@ -66,16 +66,14 @@ function getMissingClientEdges(state) {
|
|
66
66
|
}
|
67
67
|
function handlePotentialSnapshotErrorsForState(environment, state) {
|
68
68
|
if (state.kind === 'singular') {
|
69
|
-
|
70
|
-
handlePotentialSnapshotErrors(environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors, state.snapshot.errorResponseFields, (_state$snapshot$selec = (_state$snapshot$selec2 = state.snapshot.selector.node.metadata) === null || _state$snapshot$selec2 === void 0 ? void 0 : _state$snapshot$selec2.throwOnFieldError) !== null && _state$snapshot$selec !== void 0 ? _state$snapshot$selec : false);
|
69
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.errorResponseFields);
|
71
70
|
} else if (state.kind === 'plural') {
|
72
71
|
var _iterator3 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
73
72
|
_step3;
|
74
73
|
try {
|
75
74
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
76
|
-
var _snapshot$selector$no, _snapshot$selector$no2;
|
77
75
|
var snapshot = _step3.value;
|
78
|
-
handlePotentialSnapshotErrors(environment, snapshot.
|
76
|
+
handlePotentialSnapshotErrors(environment, snapshot.errorResponseFields);
|
79
77
|
}
|
80
78
|
} catch (err) {
|
81
79
|
_iterator3.e(err);
|
@@ -5,7 +5,7 @@ var _useFragmentInternal_CURRENT = _interopRequireDefault(require("./useFragment
|
|
5
5
|
var _useFragmentInternal_EXPERIMENTAL = _interopRequireDefault(require("./useFragmentInternal_EXPERIMENTAL"));
|
6
6
|
var _relayRuntime = require("relay-runtime");
|
7
7
|
function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOptions) {
|
8
|
-
if (_relayRuntime.RelayFeatureFlags.
|
8
|
+
if (_relayRuntime.RelayFeatureFlags.ENABLE_ACTIVITY_COMPATIBILITY) {
|
9
9
|
return (0, _useFragmentInternal_EXPERIMENTAL["default"])(fragmentNode, fragmentRef, hookDisplayName, queryOptions);
|
10
10
|
}
|
11
11
|
return (0, _useFragmentInternal_CURRENT["default"])(fragmentNode, fragmentRef, hookDisplayName, queryOptions);
|
@@ -116,16 +116,14 @@ function getSuspendingLiveResolver(state) {
|
|
116
116
|
}
|
117
117
|
function handlePotentialSnapshotErrorsForState(environment, state) {
|
118
118
|
if (state.kind === 'singular') {
|
119
|
-
|
120
|
-
handlePotentialSnapshotErrors(environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors, state.snapshot.errorResponseFields, (_state$snapshot$selec = (_state$snapshot$selec2 = state.snapshot.selector.node.metadata) === null || _state$snapshot$selec2 === void 0 ? void 0 : _state$snapshot$selec2.throwOnFieldError) !== null && _state$snapshot$selec !== void 0 ? _state$snapshot$selec : false);
|
119
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.errorResponseFields);
|
121
120
|
} else if (state.kind === 'plural') {
|
122
121
|
var _iterator5 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
123
122
|
_step5;
|
124
123
|
try {
|
125
124
|
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
126
|
-
var _snapshot$selector$no, _snapshot$selector$no2;
|
127
125
|
var snapshot = _step5.value;
|
128
|
-
handlePotentialSnapshotErrors(environment, snapshot.
|
126
|
+
handlePotentialSnapshotErrors(environment, snapshot.errorResponseFields);
|
129
127
|
}
|
130
128
|
} catch (err) {
|
131
129
|
_iterator5.e(err);
|
@@ -152,8 +150,6 @@ function handleMissedUpdates(environment, state) {
|
|
152
150
|
missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
|
153
151
|
seenRecords: currentSnapshot.seenRecords,
|
154
152
|
selector: currentSnapshot.selector,
|
155
|
-
missingRequiredFields: currentSnapshot.missingRequiredFields,
|
156
|
-
relayResolverErrors: currentSnapshot.relayResolverErrors,
|
157
153
|
errorResponseFields: currentSnapshot.errorResponseFields
|
158
154
|
};
|
159
155
|
return [updatedData !== state.snapshot.data, {
|
@@ -175,8 +171,6 @@ function handleMissedUpdates(environment, state) {
|
|
175
171
|
missingLiveResolverFields: _currentSnapshot.missingLiveResolverFields,
|
176
172
|
seenRecords: _currentSnapshot.seenRecords,
|
177
173
|
selector: _currentSnapshot.selector,
|
178
|
-
missingRequiredFields: _currentSnapshot.missingRequiredFields,
|
179
|
-
relayResolverErrors: _currentSnapshot.relayResolverErrors,
|
180
174
|
errorResponseFields: _currentSnapshot.errorResponseFields
|
181
175
|
};
|
182
176
|
if (_updatedData !== snapshot.data) {
|
@@ -405,8 +399,7 @@ function useFragmentInternal(fragmentNode, fragmentRef, hookDisplayName, queryOp
|
|
405
399
|
if (isMissingData(state)) {
|
406
400
|
var suspendingLiveResolvers = getSuspendingLiveResolver(state);
|
407
401
|
if (suspendingLiveResolvers != null && suspendingLiveResolvers.length > 0) {
|
408
|
-
throw Promise.all(suspendingLiveResolvers.map(function (
|
409
|
-
var liveStateID = _ref.liveStateID;
|
402
|
+
throw Promise.all(suspendingLiveResolvers.map(function (liveStateID) {
|
410
403
|
return environment.getStore().getLiveResolverPromise(liveStateID);
|
411
404
|
}));
|
412
405
|
}
|
@@ -116,16 +116,14 @@ function getSuspendingLiveResolver(state) {
|
|
116
116
|
}
|
117
117
|
function handlePotentialSnapshotErrorsForState(environment, state) {
|
118
118
|
if (state.kind === 'singular') {
|
119
|
-
|
120
|
-
handlePotentialSnapshotErrors(environment, state.snapshot.missingRequiredFields, state.snapshot.relayResolverErrors, state.snapshot.errorResponseFields, (_state$snapshot$selec = (_state$snapshot$selec2 = state.snapshot.selector.node.metadata) === null || _state$snapshot$selec2 === void 0 ? void 0 : _state$snapshot$selec2.throwOnFieldError) !== null && _state$snapshot$selec !== void 0 ? _state$snapshot$selec : false);
|
119
|
+
handlePotentialSnapshotErrors(environment, state.snapshot.errorResponseFields);
|
121
120
|
} else if (state.kind === 'plural') {
|
122
121
|
var _iterator5 = (0, _createForOfIteratorHelper2["default"])(state.snapshots),
|
123
122
|
_step5;
|
124
123
|
try {
|
125
124
|
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
126
|
-
var _snapshot$selector$no, _snapshot$selector$no2;
|
127
125
|
var snapshot = _step5.value;
|
128
|
-
handlePotentialSnapshotErrors(environment, snapshot.
|
126
|
+
handlePotentialSnapshotErrors(environment, snapshot.errorResponseFields);
|
129
127
|
}
|
130
128
|
} catch (err) {
|
131
129
|
_iterator5.e(err);
|
@@ -152,8 +150,6 @@ function handleMissedUpdates(environment, state) {
|
|
152
150
|
missingLiveResolverFields: currentSnapshot.missingLiveResolverFields,
|
153
151
|
seenRecords: currentSnapshot.seenRecords,
|
154
152
|
selector: currentSnapshot.selector,
|
155
|
-
missingRequiredFields: currentSnapshot.missingRequiredFields,
|
156
|
-
relayResolverErrors: currentSnapshot.relayResolverErrors,
|
157
153
|
errorResponseFields: currentSnapshot.errorResponseFields
|
158
154
|
};
|
159
155
|
return [updatedData !== state.snapshot.data, {
|
@@ -177,8 +173,6 @@ function handleMissedUpdates(environment, state) {
|
|
177
173
|
missingLiveResolverFields: _currentSnapshot.missingLiveResolverFields,
|
178
174
|
seenRecords: _currentSnapshot.seenRecords,
|
179
175
|
selector: _currentSnapshot.selector,
|
180
|
-
missingRequiredFields: _currentSnapshot.missingRequiredFields,
|
181
|
-
relayResolverErrors: _currentSnapshot.relayResolverErrors,
|
182
176
|
errorResponseFields: _currentSnapshot.errorResponseFields
|
183
177
|
};
|
184
178
|
if (_updatedData !== snapshot.data) {
|
@@ -206,7 +200,7 @@ function handleMissingClientEdge(environment, parentFragmentNode, parentFragment
|
|
206
200
|
var queryResult = QueryResource.prepare(queryOperationDescriptor, fetchQueryInternal(environment, queryOperationDescriptor), queryOptions === null || queryOptions === void 0 ? void 0 : queryOptions.fetchPolicy);
|
207
201
|
return [queryResult, getPromiseForActiveRequest(environment, queryOperationDescriptor.request)];
|
208
202
|
}
|
209
|
-
function subscribeToSnapshot(environment, state, setState
|
203
|
+
function subscribeToSnapshot(environment, state, setState) {
|
210
204
|
if (state.kind === 'bailout') {
|
211
205
|
return function () {};
|
212
206
|
} else if (state.kind === 'singular') {
|
@@ -235,7 +229,6 @@ function subscribeToSnapshot(environment, state, setState, pendingStateRef) {
|
|
235
229
|
environment: state.environment
|
236
230
|
};
|
237
231
|
}
|
238
|
-
pendingStateRef.current = nextState.kind === 'singular' ? nextState.epoch : null;
|
239
232
|
return nextState;
|
240
233
|
});
|
241
234
|
});
|
@@ -272,7 +265,6 @@ function subscribeToSnapshot(environment, state, setState, pendingStateRef) {
|
|
272
265
|
environment: state.environment
|
273
266
|
};
|
274
267
|
}
|
275
|
-
pendingStateRef.current = nextState.kind === 'plural' ? nextState.epoch : null;
|
276
268
|
return nextState;
|
277
269
|
});
|
278
270
|
});
|
@@ -409,8 +401,7 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
409
401
|
if (isMissingData(state)) {
|
410
402
|
var suspendingLiveResolvers = getSuspendingLiveResolver(state);
|
411
403
|
if (suspendingLiveResolvers != null && suspendingLiveResolvers.length > 0) {
|
412
|
-
throw Promise.all(suspendingLiveResolvers.map(function (
|
413
|
-
var liveStateID = _ref.liveStateID;
|
404
|
+
throw Promise.all(suspendingLiveResolvers.map(function (liveStateID) {
|
414
405
|
return environment.getStore().getLiveResolverPromise(liveStateID);
|
415
406
|
}));
|
416
407
|
}
|
@@ -424,7 +415,6 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
424
415
|
}
|
425
416
|
}
|
426
417
|
handlePotentialSnapshotErrorsForState(environment, state);
|
427
|
-
var pendingStateEpochRef = useRef(null);
|
428
418
|
var storeSubscriptionRef = useRef(null);
|
429
419
|
useEffect(function () {
|
430
420
|
var storeSubscription = storeSubscriptionRef.current;
|
@@ -449,7 +439,7 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
449
439
|
}
|
450
440
|
stateForSubscription = updatedState;
|
451
441
|
}
|
452
|
-
var dispose = subscribeToSnapshot(state.environment, stateForSubscription, setState
|
442
|
+
var dispose = subscribeToSnapshot(state.environment, stateForSubscription, setState);
|
453
443
|
storeSubscriptionRef.current = {
|
454
444
|
dispose: dispose,
|
455
445
|
selector: state.selector,
|
@@ -458,7 +448,7 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
458
448
|
}, [state]);
|
459
449
|
useEffect(function () {
|
460
450
|
if (storeSubscriptionRef.current == null && state.kind !== 'bailout') {
|
461
|
-
var dispose = subscribeToSnapshot(state.environment, state, setState
|
451
|
+
var dispose = subscribeToSnapshot(state.environment, state, setState);
|
462
452
|
storeSubscriptionRef.current = {
|
463
453
|
dispose: dispose,
|
464
454
|
selector: state.selector,
|
@@ -471,18 +461,6 @@ function useFragmentInternal_EXPERIMENTAL(fragmentNode, fragmentRef, hookDisplay
|
|
471
461
|
storeSubscriptionRef.current = null;
|
472
462
|
};
|
473
463
|
}, []);
|
474
|
-
if (pendingStateEpochRef.current !== null && pendingStateEpochRef.current !== state.epoch) {
|
475
|
-
var updates = handleMissedUpdates(environment, state);
|
476
|
-
if (updates != null) {
|
477
|
-
var hasStateUpdates = updates[0],
|
478
|
-
updatedState = updates[1];
|
479
|
-
if (hasStateUpdates) {
|
480
|
-
setState(updatedState);
|
481
|
-
state = updatedState;
|
482
|
-
}
|
483
|
-
}
|
484
|
-
}
|
485
|
-
pendingStateEpochRef.current = null;
|
486
464
|
var data;
|
487
465
|
if (isPlural) {
|
488
466
|
var fragmentRefIsNullish = fragmentRef == null;
|
@@ -2,9 +2,11 @@
|
|
2
2
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
4
4
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
5
|
+
var getConnectionState = require('./getConnectionState');
|
5
6
|
var useFetchTrackingRef = require('./useFetchTrackingRef');
|
6
7
|
var useIsMountedRef = require('./useIsMountedRef');
|
7
8
|
var useIsOperationNodeActive = require('./useIsOperationNodeActive');
|
9
|
+
var useLoadMoreFunction_EXPERIMENTAL = require('./useLoadMoreFunction_EXPERIMENTAL');
|
8
10
|
var useRelayEnvironment = require('./useRelayEnvironment');
|
9
11
|
var invariant = require('invariant');
|
10
12
|
var _require = require('react'),
|
@@ -13,14 +15,19 @@ var _require = require('react'),
|
|
13
15
|
useState = _require.useState;
|
14
16
|
var _require2 = require('relay-runtime'),
|
15
17
|
fetchQuery = _require2.__internal.fetchQuery,
|
16
|
-
|
18
|
+
RelayFeatureFlags = _require2.RelayFeatureFlags,
|
17
19
|
createOperationDescriptor = _require2.createOperationDescriptor,
|
18
20
|
getPaginationVariables = _require2.getPaginationVariables,
|
19
21
|
getRefetchMetadata = _require2.getRefetchMetadata,
|
20
|
-
getSelector = _require2.getSelector
|
21
|
-
getValueAtPath = _require2.getValueAtPath;
|
22
|
+
getSelector = _require2.getSelector;
|
22
23
|
var warning = require("fbjs/lib/warning");
|
23
24
|
function useLoadMoreFunction(args) {
|
25
|
+
if (RelayFeatureFlags.ENABLE_ACTIVITY_COMPATIBILITY) {
|
26
|
+
return useLoadMoreFunction_EXPERIMENTAL(args);
|
27
|
+
}
|
28
|
+
return useLoadMoreFunction_CURRENT(args);
|
29
|
+
}
|
30
|
+
function useLoadMoreFunction_CURRENT(args) {
|
24
31
|
var direction = args.direction,
|
25
32
|
fragmentNode = args.fragmentNode,
|
26
33
|
fragmentRef = args.fragmentRef,
|
@@ -121,44 +128,4 @@ function useLoadMoreFunction(args) {
|
|
121
128
|
}, [environment, identifierValue, direction, cursor, startFetch, disposeFetch, completeFetch, isFetchingRef, isParentQueryActive, fragmentData, fragmentNode.name, fragmentRef, componentDisplayName]);
|
122
129
|
return [loadMore, hasMore, disposeFetch];
|
123
130
|
}
|
124
|
-
function getConnectionState(direction, fragmentNode, fragmentData, connectionPathInFragmentData) {
|
125
|
-
var _pageInfo$END_CURSOR, _pageInfo$START_CURSO;
|
126
|
-
var _ConnectionInterface$ = ConnectionInterface.get(),
|
127
|
-
EDGES = _ConnectionInterface$.EDGES,
|
128
|
-
PAGE_INFO = _ConnectionInterface$.PAGE_INFO,
|
129
|
-
HAS_NEXT_PAGE = _ConnectionInterface$.HAS_NEXT_PAGE,
|
130
|
-
HAS_PREV_PAGE = _ConnectionInterface$.HAS_PREV_PAGE,
|
131
|
-
END_CURSOR = _ConnectionInterface$.END_CURSOR,
|
132
|
-
START_CURSOR = _ConnectionInterface$.START_CURSOR;
|
133
|
-
var connection = getValueAtPath(fragmentData, connectionPathInFragmentData);
|
134
|
-
if (connection == null) {
|
135
|
-
return {
|
136
|
-
cursor: null,
|
137
|
-
hasMore: false
|
138
|
-
};
|
139
|
-
}
|
140
|
-
!(typeof connection === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected connection in fragment `%s` to have been `null`, or ' + 'a plain object with %s and %s properties. Instead got `%s`.', fragmentNode.name, EDGES, PAGE_INFO, connection) : invariant(false) : void 0;
|
141
|
-
var edges = connection[EDGES];
|
142
|
-
var pageInfo = connection[PAGE_INFO];
|
143
|
-
if (edges == null || pageInfo == null) {
|
144
|
-
return {
|
145
|
-
cursor: null,
|
146
|
-
hasMore: false
|
147
|
-
};
|
148
|
-
}
|
149
|
-
!Array.isArray(edges) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected connection in fragment `%s` to have a plural `%s` field. ' + 'Instead got `%s`.', fragmentNode.name, EDGES, edges) : invariant(false) : void 0;
|
150
|
-
!(typeof pageInfo === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected connection in fragment `%s` to have a `%s` field. ' + 'Instead got `%s`.', fragmentNode.name, PAGE_INFO, pageInfo) : invariant(false) : void 0;
|
151
|
-
var cursor = direction === 'forward' ? (_pageInfo$END_CURSOR = pageInfo[END_CURSOR]) !== null && _pageInfo$END_CURSOR !== void 0 ? _pageInfo$END_CURSOR : null : (_pageInfo$START_CURSO = pageInfo[START_CURSOR]) !== null && _pageInfo$START_CURSO !== void 0 ? _pageInfo$START_CURSO : null;
|
152
|
-
!(cursor === null || typeof cursor === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected page info for connection in fragment `%s` to have a ' + 'valid `%s`. Instead got `%s`.', fragmentNode.name, START_CURSOR, cursor) : invariant(false) : void 0;
|
153
|
-
var hasMore;
|
154
|
-
if (direction === 'forward') {
|
155
|
-
hasMore = cursor != null && pageInfo[HAS_NEXT_PAGE] === true;
|
156
|
-
} else {
|
157
|
-
hasMore = cursor != null && pageInfo[HAS_PREV_PAGE] === true;
|
158
|
-
}
|
159
|
-
return {
|
160
|
-
cursor: cursor,
|
161
|
-
hasMore: hasMore
|
162
|
-
};
|
163
|
-
}
|
164
131
|
module.exports = useLoadMoreFunction;
|
@@ -0,0 +1,130 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
4
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
5
|
+
var getConnectionState = require('./getConnectionState');
|
6
|
+
var useIsMountedRef = require('./useIsMountedRef');
|
7
|
+
var useIsOperationNodeActive = require('./useIsOperationNodeActive');
|
8
|
+
var useRelayEnvironment = require('./useRelayEnvironment');
|
9
|
+
var invariant = require('invariant');
|
10
|
+
var _require = require('react'),
|
11
|
+
useCallback = _require.useCallback,
|
12
|
+
useRef = _require.useRef,
|
13
|
+
useState = _require.useState;
|
14
|
+
var _require2 = require('relay-runtime'),
|
15
|
+
fetchQuery = _require2.__internal.fetchQuery,
|
16
|
+
createOperationDescriptor = _require2.createOperationDescriptor,
|
17
|
+
getPaginationVariables = _require2.getPaginationVariables,
|
18
|
+
getRefetchMetadata = _require2.getRefetchMetadata,
|
19
|
+
getSelector = _require2.getSelector;
|
20
|
+
var warning = require("fbjs/lib/warning");
|
21
|
+
function useLoadMoreFunction_EXPERIMENTAL(args) {
|
22
|
+
var direction = args.direction,
|
23
|
+
fragmentNode = args.fragmentNode,
|
24
|
+
fragmentRef = args.fragmentRef,
|
25
|
+
fragmentIdentifier = args.fragmentIdentifier,
|
26
|
+
fragmentData = args.fragmentData,
|
27
|
+
connectionPathInFragmentData = args.connectionPathInFragmentData,
|
28
|
+
paginationRequest = args.paginationRequest,
|
29
|
+
paginationMetadata = args.paginationMetadata,
|
30
|
+
componentDisplayName = args.componentDisplayName,
|
31
|
+
observer = args.observer,
|
32
|
+
onReset = args.onReset;
|
33
|
+
var environment = useRelayEnvironment();
|
34
|
+
var _getRefetchMetadata = getRefetchMetadata(fragmentNode, componentDisplayName),
|
35
|
+
identifierInfo = _getRefetchMetadata.identifierInfo;
|
36
|
+
var identifierValue = (identifierInfo === null || identifierInfo === void 0 ? void 0 : identifierInfo.identifierField) != null && fragmentData != null && typeof fragmentData === 'object' ? fragmentData[identifierInfo.identifierField] : null;
|
37
|
+
var fetchStatusRef = useRef({
|
38
|
+
kind: 'none'
|
39
|
+
});
|
40
|
+
var _useState = useState(environment),
|
41
|
+
mirroredEnvironment = _useState[0],
|
42
|
+
setMirroredEnvironment = _useState[1];
|
43
|
+
var _useState2 = useState(fragmentIdentifier),
|
44
|
+
mirroredFragmentIdentifier = _useState2[0],
|
45
|
+
setMirroredFragmentIdentifier = _useState2[1];
|
46
|
+
var isParentQueryActive = useIsOperationNodeActive(fragmentNode, fragmentRef);
|
47
|
+
var forceDisposeFn = useCallback(function () {
|
48
|
+
if (fetchStatusRef.current.kind === 'fetching') {
|
49
|
+
fetchStatusRef.current.subscription.unsubscribe();
|
50
|
+
}
|
51
|
+
fetchStatusRef.current = {
|
52
|
+
kind: 'none'
|
53
|
+
};
|
54
|
+
}, []);
|
55
|
+
var shouldReset = environment !== mirroredEnvironment || fragmentIdentifier !== mirroredFragmentIdentifier;
|
56
|
+
if (shouldReset) {
|
57
|
+
forceDisposeFn();
|
58
|
+
onReset();
|
59
|
+
setMirroredEnvironment(environment);
|
60
|
+
setMirroredFragmentIdentifier(fragmentIdentifier);
|
61
|
+
}
|
62
|
+
var _getConnectionState = getConnectionState(direction, fragmentNode, fragmentData, connectionPathInFragmentData),
|
63
|
+
cursor = _getConnectionState.cursor,
|
64
|
+
hasMore = _getConnectionState.hasMore;
|
65
|
+
var isMountedRef = useIsMountedRef();
|
66
|
+
var loadMore = useCallback(function (count, options) {
|
67
|
+
var onComplete = options === null || options === void 0 ? void 0 : options.onComplete;
|
68
|
+
if (isMountedRef.current !== true) {
|
69
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Unexpected fetch on unmounted component for fragment ' + '`%s` in `%s`. It looks like some instances of your component are ' + 'still trying to fetch data but they already unmounted. ' + 'Please make sure you clear all timers, intervals, ' + 'async calls, etc that may trigger a fetch.', fragmentNode.name, componentDisplayName) : void 0;
|
70
|
+
return {
|
71
|
+
dispose: function dispose() {}
|
72
|
+
};
|
73
|
+
}
|
74
|
+
var fragmentSelector = getSelector(fragmentNode, fragmentRef);
|
75
|
+
if (fetchStatusRef.current.kind === 'fetching' || fragmentData == null || isParentQueryActive) {
|
76
|
+
if (fragmentSelector == null) {
|
77
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Unexpected fetch while using a null fragment ref ' + 'for fragment `%s` in `%s`. When fetching more items, we expect ' + "initial fragment data to be non-null. Please make sure you're " + 'passing a valid fragment ref to `%s` before paginating.', fragmentNode.name, componentDisplayName, componentDisplayName) : void 0;
|
78
|
+
}
|
79
|
+
if (onComplete) {
|
80
|
+
onComplete(null);
|
81
|
+
}
|
82
|
+
return {
|
83
|
+
dispose: function dispose() {}
|
84
|
+
};
|
85
|
+
}
|
86
|
+
!(fragmentSelector != null && fragmentSelector.kind !== 'PluralReaderSelector') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: Expected to be able to find a non-plural fragment owner for ' + "fragment `%s` when using `%s`. If you're seeing this, " + 'this is likely a bug in Relay.', fragmentNode.name, componentDisplayName) : invariant(false) : void 0;
|
87
|
+
var parentVariables = fragmentSelector.owner.variables;
|
88
|
+
var fragmentVariables = fragmentSelector.variables;
|
89
|
+
var extraVariables = options === null || options === void 0 ? void 0 : options.UNSTABLE_extraVariables;
|
90
|
+
var baseVariables = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, parentVariables), fragmentVariables);
|
91
|
+
var paginationVariables = getPaginationVariables(direction, count, cursor, baseVariables, (0, _objectSpread2["default"])({}, extraVariables), paginationMetadata);
|
92
|
+
if (identifierInfo != null) {
|
93
|
+
if (typeof identifierValue !== 'string') {
|
94
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Expected result to have a string ' + '`%s` in order to refetch, got `%s`.', identifierInfo.identifierField, identifierValue) : void 0;
|
95
|
+
}
|
96
|
+
paginationVariables[identifierInfo.identifierQueryVariableName] = identifierValue;
|
97
|
+
}
|
98
|
+
var paginationQuery = createOperationDescriptor(paginationRequest, paginationVariables, {
|
99
|
+
force: true
|
100
|
+
});
|
101
|
+
fetchQuery(environment, paginationQuery).subscribe((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, observer), {}, {
|
102
|
+
start: function start(subscription) {
|
103
|
+
fetchStatusRef.current = {
|
104
|
+
kind: 'fetching',
|
105
|
+
subscription: subscription
|
106
|
+
};
|
107
|
+
observer.start && observer.start(subscription);
|
108
|
+
},
|
109
|
+
complete: function complete() {
|
110
|
+
fetchStatusRef.current = {
|
111
|
+
kind: 'none'
|
112
|
+
};
|
113
|
+
observer.complete && observer.complete();
|
114
|
+
onComplete && onComplete(null);
|
115
|
+
},
|
116
|
+
error: function error(_error) {
|
117
|
+
fetchStatusRef.current = {
|
118
|
+
kind: 'none'
|
119
|
+
};
|
120
|
+
observer.complete && observer.complete();
|
121
|
+
onComplete && onComplete(_error);
|
122
|
+
}
|
123
|
+
}));
|
124
|
+
return {
|
125
|
+
dispose: function dispose() {}
|
126
|
+
};
|
127
|
+
}, [environment, identifierValue, direction, cursor, isParentQueryActive, fragmentData, fragmentNode.name, fragmentRef, componentDisplayName]);
|
128
|
+
return [loadMore, hasMore, forceDisposeFn];
|
129
|
+
}
|
130
|
+
module.exports = useLoadMoreFunction_EXPERIMENTAL;
|