react-relay 16.2.0 → 18.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. package/ReactRelayContainerUtils.js.flow +2 -2
  2. package/ReactRelayContext.js +1 -1
  3. package/ReactRelayContext.js.flow +1 -1
  4. package/ReactRelayFragmentContainer.js.flow +10 -8
  5. package/ReactRelayLocalQueryRenderer.js.flow +4 -1
  6. package/ReactRelayPaginationContainer.js.flow +4 -2
  7. package/ReactRelayQueryRenderer.js.flow +2 -2
  8. package/ReactRelayQueryRendererContext.js.flow +1 -1
  9. package/ReactRelayRefetchContainer.js.flow +2 -2
  10. package/ReactRelayTypes.js.flow +45 -18
  11. package/__flowtests__/ReactRelayFragmentContainer-flowtest.js.flow +2 -2
  12. package/buildReactRelayContainer.js.flow +10 -8
  13. package/getRootVariablesForFragments.js.flow +1 -0
  14. package/hooks.js +1 -1
  15. package/index.js +1 -1
  16. package/legacy.js +1 -1
  17. package/lib/ReactRelayFragmentContainer.js +2 -2
  18. package/lib/buildReactRelayContainer.js +3 -3
  19. package/lib/relay-hooks/legacy/FragmentResource.js +14 -16
  20. package/lib/relay-hooks/loadEntryPoint.js +8 -5
  21. package/lib/relay-hooks/loadQuery.js +2 -14
  22. package/lib/relay-hooks/{experimental/readFragmentInternal_EXPERIMENTAL.js → readFragmentInternal.js} +7 -5
  23. package/lib/relay-hooks/useEntryPointLoader.js +5 -8
  24. package/lib/relay-hooks/useFragment.js +7 -20
  25. package/lib/relay-hooks/useFragmentInternal.js +13 -0
  26. package/lib/relay-hooks/{experimental/useFragmentInternal_EXPERIMENTAL.js → useFragmentInternal_CURRENT.js} +12 -18
  27. package/lib/relay-hooks/useFragmentInternal_EXPERIMENTAL.js +520 -0
  28. package/lib/relay-hooks/useLazyLoadQuery.js +2 -5
  29. package/lib/relay-hooks/useLazyLoadQueryNode.js +2 -13
  30. package/lib/relay-hooks/usePaginationFragment.js +17 -13
  31. package/lib/relay-hooks/usePreloadedQuery.js +6 -9
  32. package/lib/relay-hooks/useQueryLoader.js +1 -3
  33. package/lib/relay-hooks/useRefetchableFragment.js +3 -12
  34. package/lib/relay-hooks/{experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js → useRefetchableFragmentInternal.js} +7 -7
  35. package/multi-actor/ActorChange.js.flow +1 -1
  36. package/multi-actor/useRelayActorEnvironment.js.flow +1 -1
  37. package/package.json +3 -3
  38. package/react-relay-hooks.js +2 -2
  39. package/react-relay-hooks.min.js +2 -2
  40. package/react-relay-legacy.js +2 -2
  41. package/react-relay-legacy.min.js +2 -2
  42. package/react-relay.js +2 -2
  43. package/react-relay.min.js +2 -2
  44. package/relay-hooks/EntryPointTypes.flow.js.flow +49 -25
  45. package/relay-hooks/LazyLoadEntryPointContainer_DEPRECATED.react.js.flow +22 -5
  46. package/relay-hooks/MatchContainer.js.flow +1 -1
  47. package/relay-hooks/ProfilerContext.js.flow +1 -1
  48. package/relay-hooks/__flowtests__/EntryPointTypes/ExtractQueryTypes-flowtest.js.flow +43 -0
  49. package/relay-hooks/__flowtests__/useBlockingPaginationFragment-flowtest.js.flow +21 -0
  50. package/relay-hooks/__flowtests__/usePaginationFragment-flowtest.js.flow +19 -0
  51. package/relay-hooks/__flowtests__/useRefetchableFragment-flowtest.js.flow +22 -0
  52. package/relay-hooks/legacy/FragmentResource.js.flow +13 -16
  53. package/relay-hooks/legacy/useBlockingPaginationFragment.js.flow +2 -2
  54. package/relay-hooks/legacy/useFragmentNode.js.flow +1 -1
  55. package/relay-hooks/legacy/useRefetchableFragmentNode.js.flow +2 -2
  56. package/relay-hooks/loadEntryPoint.js.flow +10 -4
  57. package/relay-hooks/loadQuery.js.flow +10 -33
  58. package/relay-hooks/prepareEntryPoint_DEPRECATED.js.flow +4 -1
  59. package/relay-hooks/{experimental/readFragmentInternal_EXPERIMENTAL.js.flow → readFragmentInternal.js.flow} +6 -4
  60. package/relay-hooks/useClientQuery.js.flow +1 -1
  61. package/relay-hooks/useEntryPointLoader.js.flow +4 -5
  62. package/relay-hooks/useFetchTrackingRef.js.flow +1 -1
  63. package/relay-hooks/useFragment.js.flow +8 -25
  64. package/relay-hooks/useFragmentInternal.js.flow +45 -0
  65. package/relay-hooks/{experimental/useFragmentInternal_EXPERIMENTAL.js.flow → useFragmentInternal_CURRENT.js.flow} +14 -5
  66. package/relay-hooks/useFragmentInternal_EXPERIMENTAL.js.flow +764 -0
  67. package/relay-hooks/useIsMountedRef.js.flow +1 -1
  68. package/relay-hooks/useIsOperationNodeActive.js.flow +1 -1
  69. package/relay-hooks/useIsParentQueryActive.js.flow +5 -2
  70. package/relay-hooks/useLazyLoadQuery.js.flow +3 -7
  71. package/relay-hooks/useLazyLoadQueryNode.js.flow +3 -19
  72. package/relay-hooks/useLoadMoreFunction.js.flow +1 -1
  73. package/relay-hooks/useMemoOperationDescriptor.js.flow +1 -1
  74. package/relay-hooks/useMemoVariables.js.flow +1 -1
  75. package/relay-hooks/useMutation.js.flow +1 -1
  76. package/relay-hooks/usePaginationFragment.js.flow +62 -50
  77. package/relay-hooks/usePreloadedQuery.js.flow +2 -6
  78. package/relay-hooks/useQueryLoader.js.flow +3 -7
  79. package/relay-hooks/useRefetchableFragment.js.flow +7 -37
  80. package/relay-hooks/{experimental/useRefetchableFragmentInternal_EXPERIMENTAL.js.flow → useRefetchableFragmentInternal.js.flow} +11 -11
  81. package/relay-hooks/useRelayEnvironment.js.flow +1 -1
  82. package/relay-hooks/useStaticFragmentNodeWarning.js.flow +3 -1
  83. package/relay-hooks/useSubscribeToInvalidationState.js.flow +1 -1
  84. package/relay-hooks/useSubscription.js.flow +1 -1
  85. package/relay-hooks/useUnsafeRef_DEPRECATED.js.flow +1 -1
  86. package/lib/relay-hooks/HooksImplementation.js +0 -15
  87. package/lib/relay-hooks/experimental/useFragment_EXPERIMENTAL.js +0 -26
  88. package/lib/relay-hooks/experimental/usePaginationFragment_EXPERIMENTAL.js +0 -127
  89. package/lib/relay-hooks/experimental/useRefetchableFragment_EXPERIMENTAL.js +0 -23
  90. package/relay-hooks/HooksImplementation.js.flow +0 -45
  91. package/relay-hooks/experimental/useFragment_EXPERIMENTAL.js.flow +0 -72
  92. package/relay-hooks/experimental/usePaginationFragment_EXPERIMENTAL.js.flow +0 -161
  93. package/relay-hooks/experimental/useRefetchableFragment_EXPERIMENTAL.js.flow +0 -49
@@ -13,7 +13,7 @@
13
13
 
14
14
  const {useEffect, useRef} = require('react');
15
15
 
16
- function useIsMountedRef(): {current: boolean} {
16
+ hook useIsMountedRef(): {current: boolean} {
17
17
  const isMountedRef = useRef(true);
18
18
 
19
19
  useEffect(() => {
@@ -23,7 +23,7 @@ const {
23
23
 
24
24
  const {useEffect, useState, useMemo} = React;
25
25
 
26
- function useIsOperationNodeActive(
26
+ hook useIsOperationNodeActive(
27
27
  fragmentNode: ReaderFragment,
28
28
  fragmentRef: mixed,
29
29
  ): boolean {
@@ -17,9 +17,12 @@ const useIsOperationNodeActive = require('./useIsOperationNodeActive');
17
17
  const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
18
18
  const {getFragment} = require('relay-runtime');
19
19
 
20
- function useIsParentQueryActive<
20
+ hook useIsParentQueryActive<
21
21
  TKey: ?{+$data?: mixed, +$fragmentSpreads: FragmentType, ...},
22
- >(fragmentInput: GraphQLTaggedNode, fragmentRef: TKey): boolean {
22
+ >(
23
+ fragmentInput: GraphQLTaggedNode,
24
+ fragmentRef: TKey,
25
+ ): boolean {
23
26
  const fragmentNode = getFragment(fragmentInput);
24
27
  useStaticFragmentNodeWarning(
25
28
  fragmentNode,
@@ -19,7 +19,6 @@ import type {
19
19
  Variables,
20
20
  } from 'relay-runtime';
21
21
 
22
- const {useTrackLoadQueryInRender} = require('./loadQuery');
23
22
  const useLazyLoadQueryNode = require('./useLazyLoadQueryNode');
24
23
  const useMemoOperationDescriptor = require('./useMemoOperationDescriptor');
25
24
  const useRelayEnvironment = require('./useRelayEnvironment');
@@ -30,7 +29,7 @@ const {
30
29
  // This separate type export is only needed as long as we are injecting
31
30
  // a separate hooks implementation in ./HooksImplementation -- it can
32
31
  // be removed after we stop doing that.
33
- export type UseLazyLoadQueryHookType = <TVariables: Variables, TData>(
32
+ export type UseLazyLoadQueryHookType = hook <TVariables: Variables, TData>(
34
33
  gqlQuery: Query<TVariables, TData>,
35
34
  variables: TVariables,
36
35
  options?: {
@@ -41,7 +40,7 @@ export type UseLazyLoadQueryHookType = <TVariables: Variables, TData>(
41
40
  },
42
41
  ) => TData;
43
42
 
44
- function useLazyLoadQuery<TVariables: Variables, TData>(
43
+ hook useLazyLoadQuery<TVariables: Variables, TData>(
45
44
  gqlQuery: Query<TVariables, TData>,
46
45
  variables: TVariables,
47
46
  options?: {
@@ -51,10 +50,6 @@ function useLazyLoadQuery<TVariables: Variables, TData>(
51
50
  UNSTABLE_renderPolicy?: RenderPolicy,
52
51
  },
53
52
  ): TData {
54
- // We need to use this hook in order to be able to track if
55
- // loadQuery was called during render
56
- useTrackLoadQueryInRender();
57
-
58
53
  const environment = useRelayEnvironment();
59
54
 
60
55
  const query = useMemoOperationDescriptor(
@@ -75,4 +70,5 @@ function useLazyLoadQuery<TVariables: Variables, TData>(
75
70
  return data;
76
71
  }
77
72
 
73
+ // $FlowFixMe[react-rule-hook-incompatible]
78
74
  module.exports = (useLazyLoadQuery: UseLazyLoadQueryHookType);
@@ -19,22 +19,20 @@ import type {
19
19
  OperationType,
20
20
  RenderPolicy,
21
21
  } from 'relay-runtime';
22
- import type {ReaderFragment} from 'relay-runtime/util/ReaderNode';
23
22
 
24
- const HooksImplementation = require('./HooksImplementation');
25
- const useFragmentNode = require('./legacy/useFragmentNode');
26
23
  const ProfilerContext = require('./ProfilerContext');
27
24
  const {
28
25
  getQueryCacheIdentifier,
29
26
  getQueryResourceForEnvironment,
30
27
  } = require('./QueryResource');
31
28
  const useFetchTrackingRef = require('./useFetchTrackingRef');
29
+ const useFragmentInternal = require('./useFragmentInternal');
32
30
  const useRelayEnvironment = require('./useRelayEnvironment');
33
31
  const React = require('react');
34
32
 
35
33
  const {useContext, useEffect, useState, useRef} = React;
36
34
 
37
- function useLazyLoadQueryNode<TQuery: OperationType>({
35
+ hook useLazyLoadQueryNode<TQuery: OperationType>({
38
36
  query,
39
37
  componentDisplayName,
40
38
  fetchObservable,
@@ -127,7 +125,7 @@ function useLazyLoadQueryNode<TQuery: OperationType>({
127
125
  });
128
126
 
129
127
  const {fragmentNode, fragmentRef} = preparedQueryResult;
130
- const data = useFragmentNodeImpl(
128
+ const data = useFragmentInternal(
131
129
  fragmentNode,
132
130
  fragmentRef,
133
131
  componentDisplayName,
@@ -135,18 +133,4 @@ function useLazyLoadQueryNode<TQuery: OperationType>({
135
133
  return data;
136
134
  }
137
135
 
138
- function useFragmentNodeImpl(
139
- fragment: ReaderFragment,
140
- key: mixed,
141
- componentDisplayName: string,
142
- ): mixed {
143
- const impl = HooksImplementation.get();
144
- if (impl && impl.useFragment__internal) {
145
- return impl.useFragment__internal(fragment, key, componentDisplayName);
146
- } else {
147
- const {data} = useFragmentNode<mixed>(fragment, key, componentDisplayName);
148
- return data;
149
- }
150
- }
151
-
152
136
  module.exports = useLazyLoadQueryNode;
@@ -61,7 +61,7 @@ export type UseLoadMoreFunctionArgs = {
61
61
  onReset: () => void,
62
62
  };
63
63
 
64
- function useLoadMoreFunction<TVariables: Variables>(
64
+ hook useLoadMoreFunction<TVariables: Variables>(
65
65
  args: UseLoadMoreFunctionArgs,
66
66
  ): [LoadMoreFn<TVariables>, boolean, () => void] {
67
67
  const {
@@ -24,7 +24,7 @@ const {createOperationDescriptor, getRequest} = require('relay-runtime');
24
24
 
25
25
  const {useMemo} = React;
26
26
 
27
- function useMemoOperationDescriptor(
27
+ hook useMemoOperationDescriptor(
28
28
  gqlQuery: GraphQLTaggedNode,
29
29
  variables: Variables,
30
30
  cacheConfig?: ?CacheConfig,
@@ -21,7 +21,7 @@ const {useState} = require('react');
21
21
  * This is useful when a `variables` object is used as a value in a depencency
22
22
  * array as it might often be constructed during render.
23
23
  */
24
- function useMemoVariables<TVariables: Variables | null>(
24
+ hook useMemoVariables<TVariables: Variables | null>(
25
25
  variables: TVariables,
26
26
  ): TVariables {
27
27
  const [mirroredVariables, setMirroredVariables] = useState(variables);
@@ -64,7 +64,7 @@ type UseMutationConfigInternal<TVariables, TData, TRawResponse> = {
64
64
  variables: TVariables,
65
65
  };
66
66
 
67
- function useMutation<TVariables: Variables, TData, TRawResponse = {...}>(
67
+ hook useMutation<TVariables: Variables, TData, TRawResponse = {...}>(
68
68
  mutation: Mutation<TVariables, TData, TRawResponse>,
69
69
  commitMutationFn?: (
70
70
  environment: IEnvironment,
@@ -11,10 +11,10 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- import type {Options} from './legacy/useRefetchableFragmentNode';
15
14
  import type {LoadMoreFn, UseLoadMoreFunctionArgs} from './useLoadMoreFunction';
16
- import type {RefetchFn} from './useRefetchableFragment';
15
+ import type {Options} from './useRefetchableFragmentInternal';
17
16
  import type {
17
+ Disposable,
18
18
  FragmentType,
19
19
  GraphQLResponse,
20
20
  Observer,
@@ -22,9 +22,9 @@ import type {
22
22
  Variables,
23
23
  } from 'relay-runtime';
24
24
 
25
- const HooksImplementation = require('./HooksImplementation');
26
- const useRefetchableFragmentNode = require('./legacy/useRefetchableFragmentNode');
27
25
  const useLoadMoreFunction = require('./useLoadMoreFunction');
26
+ const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal');
27
+ const useRelayEnvironment = require('./useRelayEnvironment');
28
28
  const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
29
29
  const {useCallback, useDebugValue, useState} = require('react');
30
30
  const {
@@ -33,6 +33,40 @@ const {
33
33
  getPaginationMetadata,
34
34
  } = require('relay-runtime');
35
35
 
36
+ type RefetchVariables<TVariables, TKey: ?{+$fragmentSpreads: mixed, ...}> =
37
+ // NOTE: This type ensures that the type of the returned variables is either:
38
+ // - nullable if the provided ref type is nullable
39
+ // - non-nullable if the provided ref type is non-nullable
40
+ [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
41
+ ? Partial<TVariables>
42
+ : TVariables;
43
+
44
+ type RefetchFnBase<TVars, TOptions> = (
45
+ vars: TVars,
46
+ options?: TOptions,
47
+ ) => Disposable;
48
+
49
+ export type RefetchFn<TVariables, TKey, TOptions = Options> = RefetchFnBase<
50
+ RefetchVariables<TVariables, TKey>,
51
+ TOptions,
52
+ >;
53
+
54
+ export type ReturnType<TVariables, TData, TKey> = {
55
+ // NOTE: This type ensures that the type of the returned data is either:
56
+ // - nullable if the provided ref type is nullable
57
+ // - non-nullable if the provided ref type is non-nullable
58
+ data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
59
+ ? TData
60
+ : ?TData,
61
+ loadNext: LoadMoreFn<TVariables>,
62
+ loadPrevious: LoadMoreFn<TVariables>,
63
+ hasNext: boolean,
64
+ hasPrevious: boolean,
65
+ isLoadingNext: boolean,
66
+ isLoadingPrevious: boolean,
67
+ refetch: RefetchFn<TVariables, TKey>,
68
+ };
69
+
36
70
  // This separate type export is only needed as long as we are injecting
37
71
  // a separate hooks implementation in ./HooksImplementation -- it can
38
72
  // be removed after we stop doing that.
@@ -46,7 +80,7 @@ export type UsePaginationFragmentType = <
46
80
  parentFragmentRef: TKey,
47
81
  ) => ReturnType<TVariables, TData, TKey>;
48
82
 
49
- function usePaginationFragment_LEGACY<
83
+ hook usePaginationFragment<
50
84
  TFragmentType: FragmentType,
51
85
  TVariables: Variables,
52
86
  TData,
@@ -65,9 +99,9 @@ function usePaginationFragment_LEGACY<
65
99
  const {connectionPathInFragmentData, paginationRequest, paginationMetadata} =
66
100
  getPaginationMetadata(fragmentNode, componentDisplayName);
67
101
 
68
- const {fragmentData, fragmentRef, refetch} = useRefetchableFragmentNode<
69
- $FlowFixMe,
70
- $FlowFixMe,
102
+ const {fragmentData, fragmentRef, refetch} = useRefetchableFragmentInternal<
103
+ {variables: TVariables, response: TData},
104
+ {data?: TData},
71
105
  >(fragmentNode, parentFragmentRef, componentDisplayName);
72
106
  const fragmentIdentifier = getFragmentIdentifier(fragmentNode, fragmentRef);
73
107
 
@@ -99,7 +133,7 @@ function usePaginationFragment_LEGACY<
99
133
  paginationRequest,
100
134
  });
101
135
 
102
- const refetchPagination: RefetchFn<TVariables, TKey> = useCallback(
136
+ const refetchPagination = useCallback(
103
137
  (variables: TVariables, options: void | Options) => {
104
138
  disposeFetchNext();
105
139
  disposeFetchPrevious();
@@ -110,6 +144,7 @@ function usePaginationFragment_LEGACY<
110
144
 
111
145
  if (__DEV__) {
112
146
  // eslint-disable-next-line react-hooks/rules-of-hooks
147
+ // $FlowFixMe[react-rule-hook]
113
148
  useDebugValue({
114
149
  fragment: fragmentNode.name,
115
150
  data: fragmentData,
@@ -120,7 +155,8 @@ function usePaginationFragment_LEGACY<
120
155
  });
121
156
  }
122
157
  return {
123
- data: (fragmentData: $FlowFixMe),
158
+ // $FlowFixMe[incompatible-return]
159
+ data: fragmentData,
124
160
  loadNext,
125
161
  loadPrevious,
126
162
  hasNext,
@@ -131,7 +167,7 @@ function usePaginationFragment_LEGACY<
131
167
  };
132
168
  }
133
169
 
134
- function useLoadMore<TVariables: Variables>(
170
+ hook useLoadMore<TVariables: Variables>(
135
171
  args: $Diff<
136
172
  UseLoadMoreFunctionArgs,
137
173
  {
@@ -141,7 +177,21 @@ function useLoadMore<TVariables: Variables>(
141
177
  },
142
178
  >,
143
179
  ): [LoadMoreFn<TVariables>, boolean, boolean, () => void] {
144
- const [isLoadingMore, setIsLoadingMore] = useState(false);
180
+ const environment = useRelayEnvironment();
181
+ const [isLoadingMore, reallySetIsLoadingMore] = useState(false);
182
+ // Schedule this update since it must be observed by components at the same
183
+ // batch as when hasNext changes. hasNext is read from the store and store
184
+ // updates are scheduled, so this must be scheduled too.
185
+ const setIsLoadingMore = (value: boolean) => {
186
+ const schedule = environment.getScheduler()?.schedule;
187
+ if (schedule) {
188
+ schedule(() => {
189
+ reallySetIsLoadingMore(value);
190
+ });
191
+ } else {
192
+ reallySetIsLoadingMore(value);
193
+ }
194
+ };
145
195
  const observer = {
146
196
  start: () => setIsLoadingMore(true),
147
197
  complete: () => setIsLoadingMore(false),
@@ -156,42 +206,4 @@ function useLoadMore<TVariables: Variables>(
156
206
  return [loadMore, hasMore, isLoadingMore, disposeFetch];
157
207
  }
158
208
 
159
- export type ReturnType<TVariables, TData, TKey> = {
160
- // NOTE: This type ensures that the type of the returned data is either:
161
- // - nullable if the provided ref type is nullable
162
- // - non-nullable if the provided ref type is non-nullable
163
- data: [+key: TKey] extends [+key: {+$fragmentSpreads: mixed, ...}]
164
- ? TData
165
- : ?TData,
166
- loadNext: LoadMoreFn<TVariables>,
167
- loadPrevious: LoadMoreFn<TVariables>,
168
- hasNext: boolean,
169
- hasPrevious: boolean,
170
- isLoadingNext: boolean,
171
- isLoadingPrevious: boolean,
172
- refetch: RefetchFn<TVariables, TKey>,
173
- };
174
-
175
- function usePaginationFragment<
176
- TFragmentType: FragmentType,
177
- TVariables: Variables,
178
- TData,
179
- TKey: ?{+$fragmentSpreads: TFragmentType, ...},
180
- >(
181
- fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
182
- parentFragmentRef: TKey,
183
- ): ReturnType<TVariables, TData, TKey> {
184
- const impl = HooksImplementation.get();
185
- if (impl) {
186
- // $FlowExpectedError[incompatible-return] Flow cannot prove that two conditional type satisfy each other
187
- return impl.usePaginationFragment<TFragmentType, TVariables, TData, TKey>(
188
- fragmentInput,
189
- parentFragmentRef,
190
- );
191
- } else {
192
- // eslint-disable-next-line react-hooks/rules-of-hooks
193
- return usePaginationFragment_LEGACY(fragmentInput, parentFragmentRef);
194
- }
195
- }
196
-
197
209
  module.exports = usePaginationFragment;
@@ -18,7 +18,6 @@ import type {
18
18
  } from './EntryPointTypes.flow';
19
19
  import type {Query, RenderPolicy, Variables} from 'relay-runtime';
20
20
 
21
- const {useTrackLoadQueryInRender} = require('./loadQuery');
22
21
  const useLazyLoadQueryNode = require('./useLazyLoadQueryNode');
23
22
  const useMemoOperationDescriptor = require('./useMemoOperationDescriptor');
24
23
  const useRelayEnvironment = require('./useRelayEnvironment');
@@ -52,7 +51,7 @@ type PreloadedQuery<
52
51
  TEnvironmentProviderOptions,
53
52
  >;
54
53
 
55
- function usePreloadedQuery<
54
+ hook usePreloadedQuery<
56
55
  TVariables: Variables,
57
56
  TData,
58
57
  TRawResponse: ?{...} = void,
@@ -67,10 +66,6 @@ function usePreloadedQuery<
67
66
  UNSTABLE_renderPolicy?: RenderPolicy,
68
67
  },
69
68
  ): TData {
70
- // We need to use this hook in order to be able to track if
71
- // loadQuery was called during render
72
- useTrackLoadQueryInRender();
73
-
74
69
  const environment = useRelayEnvironment();
75
70
  const {fetchKey, fetchPolicy, source, variables, networkCacheConfig} =
76
71
  preloadedQuery;
@@ -164,6 +159,7 @@ function usePreloadedQuery<
164
159
 
165
160
  if (__DEV__) {
166
161
  // eslint-disable-next-line react-hooks/rules-of-hooks
162
+ // $FlowFixMe[react-rule-hook]
167
163
  useDebugValue({
168
164
  query: preloadedQuery.name,
169
165
  variables: preloadedQuery.variables,
@@ -23,7 +23,7 @@ import type {
23
23
  Variables,
24
24
  } from 'relay-runtime';
25
25
 
26
- const {loadQuery, useTrackLoadQueryInRender} = require('./loadQuery');
26
+ const {loadQuery} = require('./loadQuery');
27
27
  const useIsMountedRef = require('./useIsMountedRef');
28
28
  const useRelayEnvironment = require('./useRelayEnvironment');
29
29
  const {useCallback, useEffect, useRef, useState} = require('react');
@@ -108,11 +108,7 @@ declare function useQueryLoader<TQuery: OperationType>(
108
108
  initialQueryReference?: ?PreloadedQuery<TQuery>,
109
109
  ): UseQueryLoaderHookReturnType<TQuery['variables'], TQuery['response']>;
110
110
 
111
- function useQueryLoader<
112
- TVariables: Variables,
113
- TData,
114
- TRawResponse: ?{...} = void,
115
- >(
111
+ hook useQueryLoader<TVariables: Variables, TData, TRawResponse: ?{...} = void>(
116
112
  preloadableRequest: Query<TVariables, TData, TRawResponse>,
117
113
  initialQueryReference?: ?PreloadedQuery<{
118
114
  response: TData,
@@ -150,7 +146,6 @@ function useQueryLoader<
150
146
  initialQueryReference ?? initialNullQueryReferenceState;
151
147
 
152
148
  const environment = useRelayEnvironment();
153
- useTrackLoadQueryInRender();
154
149
 
155
150
  const isMountedRef = useIsMountedRef();
156
151
  const undisposedQueryReferencesRef = useRef<
@@ -172,6 +167,7 @@ function useQueryLoader<
172
167
  // necessary here
173
168
  // TODO(T78446637): Handle disposal of managed query references in
174
169
  // components that were never mounted after rendering
170
+ // $FlowFixMe[react-rule-unsafe-ref]
175
171
  undisposedQueryReferencesRef.current.add(initialQueryReferenceInternal);
176
172
  setPreviousInitialQueryReference(initialQueryReferenceInternal);
177
173
  setQueryReference(initialQueryReferenceInternal);
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- import type {Options} from './legacy/useRefetchableFragmentNode';
14
+ import type {Options} from './useRefetchableFragmentInternal';
15
15
  import type {
16
16
  Disposable,
17
17
  FragmentType,
@@ -19,8 +19,7 @@ import type {
19
19
  Variables,
20
20
  } from 'relay-runtime';
21
21
 
22
- const HooksImplementation = require('./HooksImplementation');
23
- const useRefetchableFragmentNode = require('./legacy/useRefetchableFragmentNode');
22
+ const useRefetchableFragmentInternal = require('./useRefetchableFragmentInternal');
24
23
  const useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
25
24
  const {useDebugValue} = require('react');
26
25
  const {getFragment} = require('relay-runtime');
@@ -65,7 +64,7 @@ export type UseRefetchableFragmentType = <
65
64
  key: TKey,
66
65
  ) => ReturnType<TVariables, TData, TKey>;
67
66
 
68
- function useRefetchableFragment_LEGACY<
67
+ hook useRefetchableFragment<
69
68
  TFragmentType: FragmentType,
70
69
  TVariables: Variables,
71
70
  TData,
@@ -79,47 +78,18 @@ function useRefetchableFragment_LEGACY<
79
78
  fragmentNode,
80
79
  'first argument of useRefetchableFragment()',
81
80
  );
82
- const {fragmentData, refetch} = useRefetchableFragmentNode<
83
- {
84
- response: TData,
85
- variables: TVariables,
86
- },
87
- {
88
- +$data: mixed,
89
- ...
90
- },
81
+ const {fragmentData, refetch} = useRefetchableFragmentInternal<
82
+ {variables: TVariables, response: TData},
83
+ {data?: TData},
91
84
  >(fragmentNode, fragmentRef, 'useRefetchableFragment()');
92
85
  if (__DEV__) {
93
86
  // eslint-disable-next-line react-hooks/rules-of-hooks
87
+ // $FlowFixMe[react-rule-hook]
94
88
  useDebugValue({fragment: fragmentNode.name, data: fragmentData});
95
89
  }
96
-
97
90
  // $FlowFixMe[incompatible-return]
98
91
  // $FlowFixMe[prop-missing]
99
- // $FlowFixMe[incompatible-variance]
100
92
  return [fragmentData, refetch];
101
93
  }
102
94
 
103
- function useRefetchableFragment<
104
- TFragmentType: FragmentType,
105
- TVariables: Variables,
106
- TData,
107
- TKey: ?{+$fragmentSpreads: TFragmentType, ...},
108
- >(
109
- fragmentInput: RefetchableFragment<TFragmentType, TData, TVariables>,
110
- parentFragmentRef: TKey,
111
- ): ReturnType<TVariables, TData, TKey> {
112
- const impl = HooksImplementation.get();
113
- if (impl) {
114
- // $FlowExpectedError[incompatible-return] Flow cannot prove that two conditional type satisfy each other
115
- return impl.useRefetchableFragment<TFragmentType, TVariables, TData, TKey>(
116
- fragmentInput,
117
- parentFragmentRef,
118
- );
119
- } else {
120
- // eslint-disable-next-line react-hooks/rules-of-hooks
121
- return useRefetchableFragment_LEGACY(fragmentInput, parentFragmentRef);
122
- }
123
- }
124
-
125
95
  module.exports = useRefetchableFragment;
@@ -11,8 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- import type {RefetchableIdentifierInfo} from '../../../relay-runtime/util/ReaderNode';
15
- import type {LoaderFn} from '../useQueryLoader';
14
+ import type {LoaderFn} from './useQueryLoader';
16
15
  import type {
17
16
  ConcreteRequest,
18
17
  Disposable,
@@ -21,18 +20,19 @@ import type {
21
20
  OperationDescriptor,
22
21
  OperationType,
23
22
  ReaderFragment,
23
+ RefetchableIdentifierInfo,
24
24
  RenderPolicy,
25
25
  Variables,
26
26
  VariablesOf,
27
27
  } from 'relay-runtime';
28
28
 
29
- const ProfilerContext = require('../ProfilerContext');
30
- const {getQueryResourceForEnvironment} = require('../QueryResource');
31
- const useIsMountedRef = require('../useIsMountedRef');
32
- const useQueryLoader = require('../useQueryLoader');
33
- const useRelayEnvironment = require('../useRelayEnvironment');
34
- const readFragmentInternal = require('./readFragmentInternal_EXPERIMENTAL');
35
- const useFragmentInternal = require('./useFragmentInternal_EXPERIMENTAL');
29
+ const ProfilerContext = require('./ProfilerContext');
30
+ const {getQueryResourceForEnvironment} = require('./QueryResource');
31
+ const readFragmentInternal = require('./readFragmentInternal');
32
+ const useFragmentInternal = require('./useFragmentInternal');
33
+ const useIsMountedRef = require('./useIsMountedRef');
34
+ const useQueryLoader = require('./useQueryLoader');
35
+ const useRelayEnvironment = require('./useRelayEnvironment');
36
36
  const invariant = require('invariant');
37
37
  const {useCallback, useContext, useReducer} = require('react');
38
38
  const {
@@ -160,7 +160,7 @@ function reducer(state: RefetchState, action: Action): RefetchState {
160
160
  }
161
161
  }
162
162
 
163
- function useRefetchableFragmentNode<
163
+ hook useRefetchableFragmentNode<
164
164
  TQuery: OperationType,
165
165
  TKey: ?{+$data?: mixed, ...},
166
166
  >(
@@ -355,7 +355,7 @@ function useRefetchableFragmentNode<
355
355
  };
356
356
  }
357
357
 
358
- function useRefetchFunction<TQuery: OperationType>(
358
+ hook useRefetchFunction<TQuery: OperationType>(
359
359
  componentDisplayName: string,
360
360
  dispatch: (
361
361
  | {
@@ -17,7 +17,7 @@ const ReactRelayContext = require('./../ReactRelayContext');
17
17
  const invariant = require('invariant');
18
18
  const {useContext} = require('react');
19
19
 
20
- function useRelayEnvironment(): IEnvironment {
20
+ hook useRelayEnvironment(): IEnvironment {
21
21
  const context = useContext(ReactRelayContext);
22
22
  invariant(
23
23
  context != null,
@@ -16,7 +16,7 @@ import type {ReaderFragment} from 'relay-runtime';
16
16
  const useUnsafeRef_DEPRECATED = require('./useUnsafeRef_DEPRECATED');
17
17
  const warning = require('warning');
18
18
 
19
- function useStaticFragmentNodeWarning(
19
+ hook useStaticFragmentNodeWarning(
20
20
  fragmentNode: ReaderFragment,
21
21
  warningContext: string,
22
22
  ): void {
@@ -25,8 +25,10 @@ function useStaticFragmentNodeWarning(
25
25
  // __DEV__ setting which shouldn't change. This allows us to only pay the
26
26
  // cost of `useRef` in development mode to produce the warning.
27
27
  // eslint-disable-next-line react-hooks/rules-of-hooks
28
+ // $FlowFixMe[react-rule-hook]
28
29
  const initialPropRef = useUnsafeRef_DEPRECATED(fragmentNode.name);
29
30
  warning(
31
+ // $FlowFixMe[react-rule-unsafe-ref]
30
32
  initialPropRef.current === fragmentNode.name,
31
33
  'Relay: The %s has to remain the same over the lifetime of a component. ' +
32
34
  'Changing it is not supported and will result in unexpected behavior.',
@@ -25,7 +25,7 @@ const {useEffect, useRef} = require('react');
25
25
  * re-established and the previous one will be disposed.
26
26
  * The subscription will automatically be disposed on unmount
27
27
  */
28
- function useSubscribeToInvalidationState(
28
+ hook useSubscribeToInvalidationState(
29
29
  dataIDs: $ReadOnlyArray<DataID>,
30
30
  callback: () => void,
31
31
  ): Disposable {
@@ -26,7 +26,7 @@ type RequestSubscriptionFn<TVariables, TData, TRawResponse> = (
26
26
  config: GraphQLSubscriptionConfig<TVariables, TData, TRawResponse>,
27
27
  ) => Disposable;
28
28
 
29
- function useSubscription<TVariables, TData, TRawResponse>(
29
+ hook useSubscription<TVariables, TData, TRawResponse>(
30
30
  config: GraphQLSubscriptionConfig<TVariables, TData, TRawResponse>,
31
31
  requestSubscriptionFn?: RequestSubscriptionFn<
32
32
  TVariables,
@@ -18,7 +18,7 @@ const {useMemo} = require('react');
18
18
  * pattern to read or write from a ref during render as it does not trigger
19
19
  * a rerender and might result in bugs.
20
20
  */
21
- function useUnsafeRef_DEPRECATED<T>(init: T): {current: T} {
21
+ hook useUnsafeRef_DEPRECATED<T>(init: T): {current: T} {
22
22
  return useMemo<{current: T}>(() => ({current: init}), []);
23
23
  }
24
24
 
@@ -1,15 +0,0 @@
1
- 'use strict';
2
-
3
- var warning = require("fbjs/lib/warning");
4
- var implementation = null;
5
- function inject(impl) {
6
- process.env.NODE_ENV !== "production" ? warning(implementation === null, 'Relay HooksImplementation was injected twice.') : void 0;
7
- implementation = impl;
8
- }
9
- function get() {
10
- return implementation;
11
- }
12
- module.exports = {
13
- inject: inject,
14
- get: get
15
- };
@@ -1,26 +0,0 @@
1
- 'use strict';
2
-
3
- var _require = require('../loadQuery'),
4
- useTrackLoadQueryInRender = _require.useTrackLoadQueryInRender;
5
- var useStaticFragmentNodeWarning = require('../useStaticFragmentNodeWarning');
6
- var useFragmentInternal = require('./useFragmentInternal_EXPERIMENTAL');
7
- var _require2 = require('react'),
8
- useDebugValue = _require2.useDebugValue;
9
- var _require3 = require('relay-runtime'),
10
- getFragment = _require3.getFragment;
11
- function useFragment(fragment, key) {
12
- useTrackLoadQueryInRender();
13
- var fragmentNode = getFragment(fragment);
14
- if (process.env.NODE_ENV !== "production") {
15
- useStaticFragmentNodeWarning(fragmentNode, 'first argument of useFragment()');
16
- }
17
- var data = useFragmentInternal(fragmentNode, key, 'useFragment()');
18
- if (process.env.NODE_ENV !== "production") {
19
- useDebugValue({
20
- fragment: fragmentNode.name,
21
- data: data
22
- });
23
- }
24
- return data;
25
- }
26
- module.exports = useFragment;