react-relay 15.0.0 → 16.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.
Files changed (119) hide show
  1. package/ReactRelayContext.js +1 -1
  2. package/ReactRelayQueryFetcher.js.flow +1 -5
  3. package/ReactRelayQueryRenderer.js.flow +9 -36
  4. package/ReactRelayTypes.js.flow +1 -0
  5. package/buildReactRelayContainer.js.flow +3 -1
  6. package/hooks.js +1 -1
  7. package/index.js +1 -1
  8. package/legacy.js +1 -1
  9. package/lib/ReactRelayContainerUtils.js +0 -11
  10. package/lib/ReactRelayContext.js +0 -11
  11. package/lib/ReactRelayFragmentContainer.js +6 -78
  12. package/lib/ReactRelayFragmentMockRenderer.js +0 -11
  13. package/lib/ReactRelayLocalQueryRenderer.js +0 -17
  14. package/lib/ReactRelayPaginationContainer.js +5 -208
  15. package/lib/ReactRelayQueryFetcher.js +2 -51
  16. package/lib/ReactRelayQueryRenderer.js +6 -94
  17. package/lib/ReactRelayQueryRendererContext.js +0 -11
  18. package/lib/ReactRelayRefetchContainer.js +5 -91
  19. package/lib/ReactRelayTestMocker.js +9 -85
  20. package/lib/ReactRelayTypes.js +0 -11
  21. package/lib/RelayContext.js +0 -21
  22. package/lib/assertFragmentMap.js +0 -15
  23. package/lib/buildReactRelayContainer.js +0 -19
  24. package/lib/getRootVariablesForFragments.js +0 -14
  25. package/lib/hooks.js +0 -15
  26. package/lib/index.js +0 -17
  27. package/lib/isRelayEnvironment.js +1 -18
  28. package/lib/jest-react/enqueueTask.js +0 -20
  29. package/lib/jest-react/internalAct.js +0 -38
  30. package/lib/legacy.js +0 -15
  31. package/lib/multi-actor/ActorChange.js +0 -11
  32. package/lib/multi-actor/index.js +0 -11
  33. package/lib/multi-actor/useRelayActorEnvironment.js +0 -11
  34. package/lib/relay-hooks/EntryPointContainer.react.js +0 -11
  35. package/lib/relay-hooks/EntryPointTypes.flow.js +1 -14
  36. package/lib/relay-hooks/FragmentResource.js +76 -132
  37. package/lib/relay-hooks/HooksImplementation.js +0 -11
  38. package/lib/relay-hooks/InternalLogger.js +0 -11
  39. package/lib/relay-hooks/LRUCache.js +0 -22
  40. package/lib/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js +0 -18
  41. package/lib/relay-hooks/MatchContainer.js +0 -94
  42. package/lib/relay-hooks/NestedRelayEntryPointBuilderUtils.js +9 -0
  43. package/lib/relay-hooks/ProfilerContext.js +0 -15
  44. package/lib/relay-hooks/QueryResource.js +2 -68
  45. package/lib/relay-hooks/RelayEnvironmentProvider.js +0 -11
  46. package/lib/relay-hooks/SuspenseResource.js +0 -34
  47. package/lib/relay-hooks/loadEntryPoint.js +1 -24
  48. package/lib/relay-hooks/loadQuery.js +2 -106
  49. package/lib/relay-hooks/preloadQuery_DEPRECATED.js +2 -27
  50. package/lib/relay-hooks/prepareEntryPoint_DEPRECATED.js +0 -13
  51. package/lib/relay-hooks/react-cache/RelayReactCache.js +0 -12
  52. package/lib/relay-hooks/react-cache/getQueryResultOrFetchQuery_REACT_CACHE.js +1 -36
  53. package/lib/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js +3 -27
  54. package/lib/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js +34 -99
  55. package/lib/relay-hooks/react-cache/useFragment_REACT_CACHE.js +0 -15
  56. package/lib/relay-hooks/react-cache/useLazyLoadQuery_REACT_CACHE.js +0 -16
  57. package/lib/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js +1 -23
  58. package/lib/relay-hooks/react-cache/usePreloadedQuery_REACT_CACHE.js +0 -29
  59. package/lib/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js +12 -96
  60. package/lib/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js +0 -14
  61. package/lib/relay-hooks/useBlockingPaginationFragment.js +0 -42
  62. package/lib/relay-hooks/useClientQuery.js +0 -18
  63. package/lib/relay-hooks/useEntryPointLoader.js +0 -69
  64. package/lib/relay-hooks/useFetchTrackingRef.js +0 -26
  65. package/lib/relay-hooks/useFragment.js +0 -17
  66. package/lib/relay-hooks/useFragmentNode.js +2 -32
  67. package/lib/relay-hooks/useIsMountedRef.js +0 -11
  68. package/lib/relay-hooks/useIsOperationNodeActive.js +0 -11
  69. package/lib/relay-hooks/useIsParentQueryActive.js +0 -11
  70. package/lib/relay-hooks/useLazyLoadQuery.js +0 -18
  71. package/lib/relay-hooks/useLazyLoadQueryNode.js +0 -35
  72. package/lib/relay-hooks/useLoadMoreFunction.js +9 -34
  73. package/lib/relay-hooks/useMemoOperationDescriptor.js +0 -11
  74. package/lib/relay-hooks/useMemoVariables.js +0 -17
  75. package/lib/relay-hooks/useMutation.js +0 -11
  76. package/lib/relay-hooks/usePaginationFragment.js +1 -26
  77. package/lib/relay-hooks/usePreloadedQuery.js +0 -27
  78. package/lib/relay-hooks/useQueryLoader.js +0 -74
  79. package/lib/relay-hooks/useRefetchableFragment.js +0 -16
  80. package/lib/relay-hooks/useRefetchableFragmentNode.js +14 -97
  81. package/lib/relay-hooks/useRelayEnvironment.js +0 -11
  82. package/lib/relay-hooks/useStaticFragmentNodeWarning.js +0 -15
  83. package/lib/relay-hooks/useSubscribeToInvalidationState.js +0 -25
  84. package/lib/relay-hooks/useSubscription.js +0 -15
  85. package/lib/relay-hooks/useUnsafeRef_DEPRECATED.js +0 -17
  86. package/package.json +2 -2
  87. package/react-relay-hooks.js +2 -2
  88. package/react-relay-hooks.min.js +2 -2
  89. package/react-relay-legacy.js +2 -2
  90. package/react-relay-legacy.min.js +2 -2
  91. package/react-relay.js +2 -2
  92. package/react-relay.min.js +2 -2
  93. package/relay-hooks/EntryPointContainer.react.js.flow +5 -0
  94. package/relay-hooks/EntryPointTypes.flow.js.flow +20 -19
  95. package/relay-hooks/FragmentResource.js.flow +114 -26
  96. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +4 -2
  97. package/relay-hooks/NestedRelayEntryPointBuilderUtils.js.flow +51 -0
  98. package/relay-hooks/__flowtests__/EntryPointTypes/NestedEntrypoints-flowtest.js.flow +7 -5
  99. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +5 -0
  100. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +5 -0
  101. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +2 -0
  102. package/relay-hooks/loadEntryPoint.js.flow +4 -2
  103. package/relay-hooks/loadQuery.js.flow +21 -1
  104. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +4 -2
  105. package/relay-hooks/react-cache/readFragmentInternal_REACT_CACHE.js.flow +2 -1
  106. package/relay-hooks/react-cache/useFragmentInternal_REACT_CACHE.js.flow +28 -10
  107. package/relay-hooks/react-cache/useFragment_REACT_CACHE.js.flow +3 -9
  108. package/relay-hooks/react-cache/usePaginationFragment_REACT_CACHE.js.flow +28 -57
  109. package/relay-hooks/react-cache/useRefetchableFragmentInternal_REACT_CACHE.js.flow +19 -12
  110. package/relay-hooks/react-cache/useRefetchableFragment_REACT_CACHE.js.flow +15 -31
  111. package/relay-hooks/useBlockingPaginationFragment.js.flow +2 -4
  112. package/relay-hooks/useClientQuery.js.flow +2 -2
  113. package/relay-hooks/useFragmentNode.js.flow +2 -2
  114. package/relay-hooks/useLoadMoreFunction.js.flow +15 -9
  115. package/relay-hooks/useMutation.js.flow +26 -9
  116. package/relay-hooks/usePaginationFragment.js.flow +2 -8
  117. package/relay-hooks/useQueryLoader.js.flow +2 -8
  118. package/relay-hooks/useRefetchableFragment.js.flow +3 -2
  119. package/relay-hooks/useRefetchableFragmentNode.js.flow +28 -13
@@ -1,14 +1,3 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and 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
- *
8
- * @format
9
- * @oncall relay
10
- */
11
-
12
1
  'use strict';
13
2
 
14
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
@@ -45,138 +34,6 @@ var _require3 = require('relay-runtime'),
45
34
  isScalarAndEqual = _require3.isScalarAndEqual;
46
35
  var warning = require("fbjs/lib/warning");
47
36
  var FORWARD = 'forward';
48
- /**
49
- * Extends the functionality of RelayFragmentContainer by providing a mechanism
50
- * to load more data from a connection.
51
- *
52
- * # Configuring a PaginationContainer
53
- *
54
- * PaginationContainer accepts the standard FragmentContainer arguments and an
55
- * additional `connectionConfig` argument:
56
- *
57
- * - `Component`: the component to be wrapped/rendered.
58
- * - `fragments`: an object whose values are `graphql` fragments. The object
59
- * keys determine the prop names by which fragment data is available.
60
- * - `connectionConfig`: an object that determines how to load more connection
61
- * data. Details below.
62
- *
63
- * # Loading More Data
64
- *
65
- * Use `props.relay.hasMore()` to determine if there are more items to load.
66
- *
67
- * ```
68
- * hasMore(): boolean
69
- * ```
70
- *
71
- * Use `props.relay.isLoading()` to determine if a previous call to `loadMore()`
72
- * is still pending. This is convenient for avoiding duplicate load calls.
73
- *
74
- * ```
75
- * isLoading(): boolean
76
- * ```
77
- *
78
- * Use `props.relay.loadMore()` to load more items. This will return null if
79
- * there are no more items to fetch, otherwise it will fetch more items and
80
- * return a Disposable that can be used to cancel the fetch.
81
- *
82
- * `pageSize` should be the number of *additional* items to fetch (not the
83
- * total).
84
- *
85
- * ```
86
- * loadMore(pageSize: number, callback: ?(error: ?Error) => void): ?Disposable
87
- * ```
88
- *
89
- * A complete example:
90
- *
91
- * ```
92
- * class Foo extends React.Component {
93
- * ...
94
- * _onEndReached() {
95
- * if (!this.props.relay.hasMore() || this.props.relay.isLoading()) {
96
- * return;
97
- * }
98
- * this.props.relay.loadMore(10);
99
- * }
100
- * ...
101
- * }
102
- * ```
103
- *
104
- * # Connection Config
105
- *
106
- * Here's an example, followed by details of each config property:
107
- *
108
- * ```
109
- * ReactRelayPaginationContainer.createContainer(
110
- * Component,
111
- * {
112
- * user: graphql`fragment FriendsFragment on User {
113
- * friends(after: $afterCursor first: $count) @connection {
114
- * edges { ... }
115
- * pageInfo {
116
- * startCursor
117
- * endCursor
118
- * hasNextPage
119
- * hasPreviousPage
120
- * }
121
- * }
122
- * }`,
123
- * },
124
- * {
125
- * direction: 'forward',
126
- * getConnectionFromProps(props) {
127
- * return props.user && props.user.friends;
128
- * },
129
- * getFragmentVariables(vars, totalCount) {
130
- * // The component presumably wants *all* edges, not just those after
131
- * // the cursor, so notice that we don't set $afterCursor here.
132
- * return {
133
- * ...vars,
134
- * count: totalCount,
135
- * };
136
- * },
137
- * getVariables(props, {count, cursor}, fragmentVariables) {
138
- * return {
139
- * id: props.user.id,
140
- * afterCursor: cursor,
141
- * count,
142
- * },
143
- * },
144
- * query: graphql`
145
- * query FriendsQuery($id: ID!, $afterCursor: ID, $count: Int!) {
146
- * node(id: $id) {
147
- * ...FriendsFragment
148
- * }
149
- * }
150
- * `,
151
- * }
152
- * );
153
- * ```
154
- *
155
- * ## Config Properties
156
- *
157
- * - `direction`: Either "forward" to indicate forward pagination using
158
- * after/first, or "backward" to indicate backward pagination using
159
- * before/last.
160
- * - `getConnectionFromProps(props)`: PaginationContainer doesn't magically know
161
- * which connection data you mean to fetch more of (a container might fetch
162
- * multiple connections, but can only paginate one of them). This function is
163
- * given the fragment props only (not full props), and should return the
164
- * connection data. See the above example that returns the friends data via
165
- * `props.user.friends`.
166
- * - `getFragmentVariables(previousVars, totalCount)`: Given the previous variables
167
- * and the new total number of items, get the variables to use when reading
168
- * your fragments. Typically this means setting whatever your local "count"
169
- * variable is to the value of `totalCount`. See the example.
170
- * - `getVariables(props, {count, cursor})`: Get the variables to use when
171
- * fetching the pagination `query`. You may determine the root object id from
172
- * props (see the example that uses `props.user.id`) and may also set whatever
173
- * variables you use for the after/first/before/last calls based on the count
174
- * and cursor.
175
- * - `query`: A query to use when fetching more connection data. This should
176
- * typically reference one of the container's fragment (as in the example)
177
- * to ensure that all the necessary fields for sub-components are fetched.
178
- */
179
-
180
37
  function createGetConnectionFromProps(metadata) {
181
38
  var path = metadata.path;
182
39
  !path ? process.env.NODE_ENV !== "production" ? invariant(false, 'ReactRelayPaginationContainer: Unable to synthesize a ' + 'getConnectionFromProps function.') : invariant(false) : void 0;
@@ -204,9 +61,6 @@ function findConnectionMetadata(fragments) {
204
61
  for (var fragmentName in fragments) {
205
62
  var fragment = fragments[fragmentName];
206
63
  var connectionMetadata = fragment.metadata && fragment.metadata.connection;
207
- // HACK: metadata is always set to `undefined` in classic. In modern, even
208
- // if empty, it is set to null (never undefined). We use that knowlege to
209
- // check if we're dealing with classic or modern
210
64
  if (fragment.metadata !== undefined) {
211
65
  isRelayModern = true;
212
66
  }
@@ -241,8 +95,6 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
241
95
  var getFragmentVariables = connectionConfig.getFragmentVariables || createGetFragmentVariables(metadata);
242
96
  return _class = /*#__PURE__*/function (_React$Component) {
243
97
  (0, _inheritsLoose2["default"])(_class, _React$Component);
244
- // $FlowFixMe[missing-local-annot]
245
-
246
98
  function _class(props) {
247
99
  var _props$__rootIsQueryR, _this;
248
100
  _this = _React$Component.call(this, props) || this;
@@ -346,13 +198,7 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
346
198
  this._rerenderIfStoreHasChanged();
347
199
  }
348
200
  }
349
- }
350
-
351
- /**
352
- * When new props are received, read data for the new props and subscribe
353
- * for updates. Props may be the same in which case previous data and
354
- * subscriptions can be reused.
355
- */;
201
+ };
356
202
  _proto.UNSAFE_componentWillReceiveProps = function UNSAFE_componentWillReceiveProps(nextProps) {
357
203
  var _this2 = this;
358
204
  var _nextProps$__rootIsQu;
@@ -362,15 +208,8 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
362
208
  var nextIDs = getDataIDsFromObject(fragments, nextProps);
363
209
  var prevRootVariables = getRootVariablesForFragments(fragments, this.props);
364
210
  var nextRootVariables = getRootVariablesForFragments(fragments, nextProps);
365
-
366
- // If the environment has changed or props point to new records then
367
- // previously fetched data and any pending fetches no longer apply:
368
- // - Existing references are on the old environment.
369
- // - Existing references are based on old variables.
370
- // - Pending fetches are for the previous records.
371
211
  if (relayContext.environment !== this.state.prevContext.environment || !areEqual(prevRootVariables, nextRootVariables) || !areEqual(prevIDs, nextIDs)) {
372
212
  this._cleanup();
373
- // Child containers rely on context.relay being mutated (for gDSFP).
374
213
  if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
375
214
  this._resolver = createFragmentSpecResolver(relayContext, containerName, fragments, nextProps, rootIsQueryRenderer);
376
215
  } else {
@@ -399,12 +238,9 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
399
238
  this._cleanup();
400
239
  };
401
240
  _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {
402
- // Short-circuit if any Relay-related data has changed
403
241
  if (nextState.data !== this.state.data || nextState.relayProp !== this.state.relayProp || nextState.resolverGeneration !== this.state.resolverGeneration) {
404
242
  return true;
405
243
  }
406
- // Otherwise, for convenience short-circuit if all non-Relay props
407
- // are scalar and equal
408
244
  var keys = Object.keys(nextProps);
409
245
  for (var ii = 0; ii < keys.length; ii++) {
410
246
  var key = keys[ii];
@@ -431,8 +267,6 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
431
267
  };
432
268
  _proto._rerenderIfStoreHasChanged = function _rerenderIfStoreHasChanged() {
433
269
  var data = this.state.data;
434
- // External values could change between render and commit.
435
- // Check for this case, even though it requires an extra store read.
436
270
  var maybeNewData = this._resolver.resolve();
437
271
  if (data !== maybeNewData) {
438
272
  this.setState({
@@ -443,26 +277,14 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
443
277
  _proto._subscribeToNewResolverAndRerenderIfStoreHasChanged = function _subscribeToNewResolverAndRerenderIfStoreHasChanged() {
444
278
  var data = this.state.data;
445
279
  var maybeNewData = this._resolver.resolve();
446
-
447
- // Event listeners are only safe to add during the commit phase,
448
- // So they won't leak if render is interrupted or errors.
449
280
  this._resolver.setCallback(this.props, this._handleFragmentDataUpdate);
450
-
451
- // External values could change between render and commit.
452
- // Check for this case, even though it requires an extra store read.
453
281
  if (data !== maybeNewData) {
454
282
  this.setState({
455
283
  data: maybeNewData
456
284
  });
457
285
  }
458
- }
459
-
460
- /**
461
- * Render new data for the existing props/context.
462
- */;
286
+ };
463
287
  _proto._getConnectionData = function _getConnectionData() {
464
- // Extract connection data and verify there are more edges to fetch
465
- // eslint-disable-next-line no-unused-vars
466
288
  var _this$props = this.props,
467
289
  _ = _this$props.componentRef,
468
290
  restProps = (0, _objectWithoutPropertiesLoose2["default"])(_this$props, _excluded);
@@ -549,16 +371,6 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
549
371
  var prevData = _this3._resolver.resolve();
550
372
  _this3._resolver.setVariables(getFragmentVariables(fragmentVariables, paginatingVariables.totalCount), operation.request.node);
551
373
  var nextData = _this3._resolver.resolve();
552
-
553
- // Workaround slightly different handling for connection in different
554
- // core implementations:
555
- // - Classic core requires the count to be explicitly incremented
556
- // - Modern core automatically appends new items, updating the count
557
- // isn't required to see new data.
558
- //
559
- // `setState` is only required if changing the variables would change the
560
- // resolved data.
561
- // TODO #14894725: remove PaginationContainer equal check
562
374
  if (!areEqual(prevData, nextData)) {
563
375
  _this3.setState({
564
376
  data: nextData,
@@ -584,13 +396,11 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
584
396
  }).mergeMap(function (payload) {
585
397
  return Observable.create(function (sink) {
586
398
  onNext(payload, function () {
587
- sink.next(); // pass void to public observer's `next`
399
+ sink.next();
588
400
  sink.complete();
589
401
  });
590
402
  });
591
- })
592
- // use do instead of finally so that observer's `complete` fires after cleanup
593
- ["do"]({
403
+ })["do"]({
594
404
  error: cleanup,
595
405
  complete: cleanup,
596
406
  unsubscribe: cleanup
@@ -610,12 +420,8 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
610
420
  if (this._queryFetcher) {
611
421
  this._queryFetcher.dispose();
612
422
  }
613
- }
614
-
615
- // $FlowFixMe[missing-local-annot]
616
- ;
423
+ };
617
424
  _proto.render = function render() {
618
- // eslint-disable-next-line no-unused-vars
619
425
  var _this$props3 = this.props,
620
426
  componentRef = _this$props3.componentRef,
621
427
  __relayContext = _this$props3.__relayContext,
@@ -631,16 +437,7 @@ function createContainerWithFragments(Component, fragments, connectionConfig) {
631
437
  return _class;
632
438
  }(React.Component), (0, _defineProperty2["default"])(_class, "displayName", containerName), _class;
633
439
  }
634
-
635
- /**
636
- * Wrap the basic `createContainer()` function with logic to adapt to the
637
- * `context.relay.environment` in which it is rendered. Specifically, the
638
- * extraction of the environment-specific version of fragments in the
639
- * `fragmentSpec` is memoized once per environment, rather than once per
640
- * instance of the container constructed/rendered.
641
- */
642
440
  function createContainer(Component, fragmentSpec, connectionConfig) {
643
- // $FlowFixMe[incompatible-return]
644
441
  return buildReactRelayContainer(Component, fragmentSpec, function (ComponentClass, fragments) {
645
442
  return createContainerWithFragments(ComponentClass, fragments, connectionConfig);
646
443
  });
@@ -1,14 +1,3 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and 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
- *
8
- * @format
9
- * @oncall relay
10
- */
11
-
12
1
  'use strict';
13
2
 
14
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
@@ -45,7 +34,6 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
45
34
  };
46
35
  _proto.getFetchResult = function getFetchResult() {
47
36
  if (this._didFetchFinish) {
48
- // We don't reset '_didFetchFinish' because another callback may be set
49
37
  if (this._error != null) {
50
38
  return {
51
39
  error: this._error
@@ -67,8 +55,6 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
67
55
  preservePreviousReferences = _ref$preservePrevious === void 0 ? false : _ref$preservePrevious;
68
56
  var reference = environment.retain(operation);
69
57
  var error = function error() {
70
- // We may have partially fulfilled the request, so let the next request
71
- // or the unmount dispose of the references.
72
58
  _this._selectionReferences = _this._selectionReferences.concat(reference);
73
59
  };
74
60
  var complete = function complete() {
@@ -78,8 +64,6 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
78
64
  _this._selectionReferences = _this._selectionReferences.concat(reference);
79
65
  };
80
66
  var unsubscribe = function unsubscribe() {
81
- // Let the next request or the unmount code dispose of the references.
82
- // We may have partially fulfilled the request.
83
67
  _this._selectionReferences = _this._selectionReferences.concat(reference);
84
68
  };
85
69
  if (!isRelayModernEnvironment(environment)) {
@@ -100,12 +84,9 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
100
84
  _proto.setOnDataChange = function setOnDataChange(onDataChange) {
101
85
  !this._fetchOptions ? process.env.NODE_ENV !== "production" ? invariant(false, 'ReactRelayQueryFetcher: `setOnDataChange` should have been called after having called `fetch`') : invariant(false) : void 0;
102
86
  if (typeof onDataChange === 'function') {
103
- // Mutate the most recent fetchOptions in place,
104
- // So that in-progress requests can access the updated callback.
105
87
  this._fetchOptions.onDataChangeCallbacks = this._fetchOptions.onDataChangeCallbacks || [];
106
88
  this._fetchOptions.onDataChangeCallbacks.push(onDataChange);
107
89
  if (this._didFetchFinish) {
108
- // We don't reset '_didFetchFinish' because another callback may be set
109
90
  if (this._error != null) {
110
91
  onDataChange({
111
92
  error: this._error
@@ -117,17 +98,7 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
117
98
  }
118
99
  }
119
100
  }
120
- }
121
-
122
- /**
123
- * `fetch` fetches the data for the given operation.
124
- * If a result is immediately available synchronously, it will be synchronously
125
- * returned by this function.
126
- *
127
- * Otherwise, the fetched result will be communicated via the `onDataChange` callback.
128
- * `onDataChange` will be called with the first result (**if it wasn't returned synchronously**),
129
- * and then subsequently whenever the data changes.
130
- */;
101
+ };
131
102
  _proto.fetch = function fetch(fetchOptions, cacheConfigOverride) {
132
103
  var _this2 = this;
133
104
  var environment = fetchOptions.environment,
@@ -143,7 +114,6 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
143
114
  operation: operation
144
115
  };
145
116
  if (onDataChange && this._fetchOptions.onDataChangeCallbacks.indexOf(onDataChange) === -1) {
146
- // $FlowFixMe[incompatible-use]
147
117
  this._fetchOptions.onDataChangeCallbacks.push(onDataChange);
148
118
  }
149
119
  var operationOverride = cacheConfigOverride ? createOperationDescriptor(operation.request.node, operation.request.variables, cacheConfigOverride) : operation;
@@ -154,27 +124,17 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
154
124
  _this2._pendingRequest = null;
155
125
  }).subscribe({
156
126
  next: function next() {
157
- // If we received a response,
158
- // Make a note that to notify the callback when it's later added.
159
127
  _this2._didFetchFinish = true;
160
128
  _this2._error = null;
161
-
162
- // Only notify of the first result if `next` is being called **asynchronously**
163
- // (i.e. after `fetch` has returned).
164
129
  _this2._onQueryDataAvailable({
165
130
  notifyFirstResult: fetchHasReturned
166
131
  });
167
132
  },
168
133
  error: function error(err) {
169
- // If we received a response when we didn't have a change callback,
170
- // Make a note that to notify the callback when it's later added.
171
134
  _this2._didFetchFinish = true;
172
135
  _this2._error = err;
173
136
  _this2._snapshot = null;
174
137
  var onDataChangeCallbacks = _this2._fetchOptions && _this2._fetchOptions.onDataChangeCallbacks;
175
-
176
- // Only notify of error if `error` is being called **asynchronously**
177
- // (i.e. after `fetch` has returned).
178
138
  if (fetchHasReturned) {
179
139
  if (onDataChangeCallbacks) {
180
140
  onDataChangeCallbacks.forEach(function (onDataChange) {
@@ -204,7 +164,7 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
204
164
  return this.fetch({
205
165
  environment: this._fetchOptions.environment,
206
166
  operation: this._fetchOptions.operation,
207
- onDataChange: null // If there are onDataChangeCallbacks they will be reused
167
+ onDataChange: null
208
168
  }, cacheConfigOverride);
209
169
  };
210
170
  _proto.dispose = function dispose() {
@@ -214,8 +174,6 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
214
174
  _proto.disposeRequest = function disposeRequest() {
215
175
  this._error = null;
216
176
  this._snapshot = null;
217
-
218
- // order is important, dispose of pendingFetch before selectionReferences
219
177
  if (this._pendingRequest) {
220
178
  this._pendingRequest.dispose();
221
179
  }
@@ -247,18 +205,11 @@ var ReactRelayQueryFetcher = /*#__PURE__*/function () {
247
205
  environment = _this$_fetchOptions.environment,
248
206
  onDataChangeCallbacks = _this$_fetchOptions.onDataChangeCallbacks,
249
207
  operation = _this$_fetchOptions.operation;
250
-
251
- // `_onQueryDataAvailable` can be called synchronously the first time and can be called
252
- // multiple times by network layers that support data subscriptions.
253
- // Wait until the first payload to call `onDataChange` and subscribe for data updates.
254
208
  if (this._snapshot) {
255
209
  return;
256
210
  }
257
211
  this._snapshot = environment.lookup(operation.fragment);
258
-
259
- // Subscribe to changes in the data of the root fragment
260
212
  this._rootSubscription = environment.subscribe(this._snapshot, function (snapshot) {
261
- // Read from this._fetchOptions in case onDataChange() was lazily added.
262
213
  if (_this3._fetchOptions != null) {
263
214
  var maybeNewOnDataChangeCallbacks = _this3._fetchOptions.onDataChangeCallbacks;
264
215
  if (Array.isArray(maybeNewOnDataChangeCallbacks)) {
@@ -1,14 +1,3 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and 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
- *
8
- * @format
9
- * @oncall relay
10
- */
11
-
12
1
  'use strict';
13
2
 
14
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
@@ -22,42 +11,18 @@ var ReactRelayQueryRendererContext = require('./ReactRelayQueryRendererContext')
22
11
  var areEqual = require("fbjs/lib/areEqual");
23
12
  var React = require('react');
24
13
  var _require = require('relay-runtime'),
25
- RelayFeatureFlags = _require.RelayFeatureFlags;
26
- var _require2 = require('relay-runtime'),
27
- createOperationDescriptor = _require2.createOperationDescriptor,
28
- deepFreeze = _require2.deepFreeze,
29
- getRequest = _require2.getRequest;
30
- /**
31
- * React may double-fire the constructor, and we call 'fetch' in the
32
- * constructor. If a request is already in flight from a previous call to the
33
- * constructor, just reuse the query fetcher and wait for the response.
34
- */
14
+ createOperationDescriptor = _require.createOperationDescriptor,
15
+ deepFreeze = _require.deepFreeze,
16
+ getRequest = _require.getRequest;
35
17
  var requestCache = {};
36
18
  var queryRendererContext = {
37
19
  rootIsQueryRenderer: true
38
20
  };
39
- /**
40
- * @public
41
- *
42
- * Orchestrates fetching and rendering data for a single view or view hierarchy:
43
- * - Fetches the query/variables using the given network implementation.
44
- * - Normalizes the response(s) to that query, publishing them to the given
45
- * store.
46
- * - Renders the pending/fail/success states with the provided render function.
47
- * - Subscribes for updates to the root data and re-renders with any changes.
48
- */
49
21
  var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
50
22
  (0, _inheritsLoose2["default"])(ReactRelayQueryRenderer, _React$Component);
51
23
  function ReactRelayQueryRenderer(props) {
52
24
  var _this;
53
25
  _this = _React$Component.call(this, props) || this;
54
-
55
- // Callbacks are attached to the current instance and shared with static
56
- // lifecyles by bundling with state. This is okay to do because the
57
- // callbacks don't change in reaction to props. However we should not
58
- // "leak" them before mounting (since we would be unable to clean up). For
59
- // that reason, we define them as null initially and fill them in after
60
- // mounting to avoid leaking memory.
61
26
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleDataChange", function (params) {
62
27
  var error = params.error == null ? null : params.error;
63
28
  var snapshot = params.snapshot == null ? null : params.snapshot;
@@ -66,8 +31,6 @@ var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
66
31
  if (prevRequestCacheKey) {
67
32
  delete requestCache[prevRequestCacheKey];
68
33
  }
69
-
70
- // Don't update state if nothing has changed.
71
34
  if (snapshot === prevState.snapshot && error === prevState.error) {
72
35
  return null;
73
36
  }
@@ -112,38 +75,13 @@ var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
112
75
  _proto.componentDidMount = function componentDidMount() {
113
76
  var _this2 = this;
114
77
  if (this._maybeHiddenOrFastRefresh === true) {
115
- // This block only runs if the component has previously "unmounted"
116
- // due to it being hidden by the Offscreen API, or during fast refresh.
117
- // At this point, the current cached resource will have been disposed
118
- // by the previous cleanup, so instead of attempting to
119
- // do our regular commit setup, so that the query is re-evaluated
120
- // (and potentially cause a refetch).
121
78
  this._maybeHiddenOrFastRefresh = false;
122
- // eslint-disable-next-line react/no-did-mount-set-state
123
79
  this.setState(function (prevState) {
124
80
  var newState = resetQueryStateForUpdate(_this2.props, prevState);
125
81
  var requestCacheKey = newState.requestCacheKey,
126
82
  queryFetcher = newState.queryFetcher;
127
83
  if (requestCacheKey != null && requestCache[requestCacheKey] != null) {
128
- if (RelayFeatureFlags.ENABLE_QUERY_RENDERER_SET_STATE_PREVENTION) {
129
- var fetchResult = queryFetcher.getFetchResult();
130
- if (fetchResult != null) {
131
- var _fetchResult$snapshot, _fetchResult$error;
132
- var snapshot = (_fetchResult$snapshot = fetchResult.snapshot) !== null && _fetchResult$snapshot !== void 0 ? _fetchResult$snapshot : null;
133
- var error = (_fetchResult$error = fetchResult.error) !== null && _fetchResult$error !== void 0 ? _fetchResult$error : null;
134
- var prevRequestCacheKey = prevState.requestCacheKey;
135
- if (prevRequestCacheKey != null) {
136
- delete requestCache[prevRequestCacheKey];
137
- }
138
- newState.renderProps = getRenderProps(error, snapshot, queryFetcher, prevState.retryCallbacks);
139
- newState.snapshot = snapshot;
140
- newState.requestCacheKey = null;
141
- } else {
142
- queryFetcher.setOnDataChange(_this2._handleDataChange);
143
- }
144
- } else {
145
- queryFetcher.setOnDataChange(_this2._handleDataChange);
146
- }
84
+ queryFetcher.setOnDataChange(_this2._handleDataChange);
147
85
  }
148
86
  return newState;
149
87
  });
@@ -153,7 +91,6 @@ var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
153
91
  retryCallbacks = _this$state.retryCallbacks,
154
92
  queryFetcher = _this$state.queryFetcher,
155
93
  requestCacheKey = _this$state.requestCacheKey;
156
- // We don't need to cache the request after the component commits
157
94
  if (requestCacheKey) {
158
95
  delete requestCache[requestCacheKey];
159
96
  }
@@ -170,21 +107,16 @@ var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
170
107
  };
171
108
  });
172
109
  };
173
-
174
- // Re-initialize the ReactRelayQueryFetcher with callbacks.
175
- // If data has changed since constructions, this will re-render.
176
110
  if (this.props.query) {
177
111
  queryFetcher.setOnDataChange(this._handleDataChange);
178
112
  }
179
113
  };
180
114
  _proto.componentDidUpdate = function componentDidUpdate(_prevProps, prevState) {
181
- // We don't need to cache the request after the component commits
182
115
  var _this$state2 = this.state,
183
116
  queryFetcher = _this$state2.queryFetcher,
184
117
  requestCacheKey = _this$state2.requestCacheKey;
185
118
  if (requestCacheKey) {
186
119
  delete requestCache[requestCacheKey];
187
- // HACK
188
120
  delete this.state.requestCacheKey;
189
121
  }
190
122
  if (this.props.query && queryFetcher !== prevState.queryFetcher) {
@@ -202,9 +134,6 @@ var ReactRelayQueryRenderer = /*#__PURE__*/function (_React$Component) {
202
134
  var _this$state3 = this.state,
203
135
  renderProps = _this$state3.renderProps,
204
136
  relayContext = _this$state3.relayContext;
205
- // Note that the root fragment results in `renderProps.props` is already
206
- // frozen by the store; this call is to freeze the renderProps object and
207
- // error property if set.
208
137
  if (process.env.NODE_ENV !== "production") {
209
138
  deepFreeze(renderProps);
210
139
  }
@@ -220,7 +149,6 @@ function getLoadingRenderProps() {
220
149
  return {
221
150
  error: null,
222
151
  props: null,
223
- // `props: null` indicates that the data is being fetched (i.e. loading)
224
152
  retry: null
225
153
  };
226
154
  }
@@ -228,7 +156,6 @@ function getEmptyRenderProps() {
228
156
  return {
229
157
  error: null,
230
158
  props: {},
231
- // `props: {}` indicates no data available
232
159
  retry: null
233
160
  };
234
161
  }
@@ -243,8 +170,6 @@ function getRenderProps(error, snapshot, queryFetcher, retryCallbacks) {
243
170
  snapshot: syncSnapshot
244
171
  });
245
172
  } else if (error && typeof retryCallbacks.handleRetryAfterError === 'function') {
246
- // If retrying after an error and no synchronous result available,
247
- // reset the render props
248
173
  retryCallbacks.handleRetryAfterError(error);
249
174
  }
250
175
  }
@@ -273,12 +198,8 @@ function resetQueryStateForUpdate(props, prevState) {
273
198
  prevPropsEnvironment: props.environment,
274
199
  prevPropsVariables: props.variables,
275
200
  queryFetcher: queryFetcher
276
- }, fetchQueryAndComputeStateFromProps(props, queryFetcher, prevState.retryCallbacks
277
- // passing no requestCacheKey will cause it to be recalculated internally
278
- // and we want the updated requestCacheKey, since variables may have changed
279
- ));
201
+ }, fetchQueryAndComputeStateFromProps(props, queryFetcher, prevState.retryCallbacks));
280
202
  }
281
-
282
203
  function fetchQueryAndComputeStateFromProps(props, queryFetcher, retryCallbacks, requestCacheKey) {
283
204
  var environment = props.environment,
284
205
  query = props.query,
@@ -292,11 +213,8 @@ function fetchQueryAndComputeStateFromProps(props, queryFetcher, retryCallbacks,
292
213
  environment: genericEnvironment
293
214
  };
294
215
  if (typeof requestCacheKey === 'string' && requestCache[requestCacheKey]) {
295
- // This same request is already in flight.
296
-
297
216
  var snapshot = requestCache[requestCacheKey].snapshot;
298
217
  if (snapshot) {
299
- // Use the cached response
300
218
  return {
301
219
  error: null,
302
220
  relayContext: relayContext,
@@ -305,7 +223,6 @@ function fetchQueryAndComputeStateFromProps(props, queryFetcher, retryCallbacks,
305
223
  requestCacheKey: requestCacheKey
306
224
  };
307
225
  } else {
308
- // Render loading state
309
226
  return {
310
227
  error: null,
311
228
  relayContext: relayContext,
@@ -322,11 +239,7 @@ function fetchQueryAndComputeStateFromProps(props, queryFetcher, retryCallbacks,
322
239
  onDataChange: null,
323
240
  operation: operation
324
241
  });
325
-
326
- // Use network data first, since it may be fresher
327
242
  var _snapshot = querySnapshot || storeSnapshot;
328
-
329
- // cache the request to avoid duplicate requests
330
243
  requestCacheKey = requestCacheKey || getRequestCacheKey(request.params, props.variables);
331
244
  requestCache[requestCacheKey] = {
332
245
  queryFetcher: queryFetcher,
@@ -366,9 +279,8 @@ function fetchQueryAndComputeStateFromProps(props, queryFetcher, retryCallbacks,
366
279
  error: null,
367
280
  relayContext: _relayContext,
368
281
  renderProps: getEmptyRenderProps(),
369
- requestCacheKey: null // if there is an error, don't cache request
282
+ requestCacheKey: null
370
283
  };
371
284
  }
372
285
  }
373
-
374
286
  module.exports = ReactRelayQueryRenderer;