UNPKG

5.9 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @emails oncall+relay
8 *
9 * @format
10 */
11// flowlint ambiguous-object-type:error
12'use strict';
13
14var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
16var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
18function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
19
20function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
21
22var getPaginationMetadata = require('./getPaginationMetadata');
23
24var useLoadMoreFunction = require('./useLoadMoreFunction');
25
26var useRefetchableFragmentNode = require('./useRefetchableFragmentNode');
27
28var useStaticFragmentNodeWarning = require('./useStaticFragmentNodeWarning');
29
30var _require = require('react'),
31 useCallback = _require.useCallback,
32 useDebugValue = _require.useDebugValue,
33 useState = _require.useState;
34
35var _require2 = require('relay-runtime'),
36 getFragment = _require2.getFragment,
37 getFragmentIdentifier = _require2.getFragmentIdentifier;
38
39function usePaginationFragment(fragmentInput, parentFragmentRef) {
40 var fragmentNode = getFragment(fragmentInput);
41 useStaticFragmentNodeWarning(fragmentNode, 'first argument of usePaginationFragment()');
42 var componentDisplayName = 'usePaginationFragment()';
43
44 var _getPaginationMetadat = getPaginationMetadata(fragmentNode, componentDisplayName),
45 connectionPathInFragmentData = _getPaginationMetadat.connectionPathInFragmentData,
46 paginationRequest = _getPaginationMetadat.paginationRequest,
47 paginationMetadata = _getPaginationMetadat.paginationMetadata,
48 identifierField = _getPaginationMetadat.identifierField;
49
50 var _useRefetchableFragme = useRefetchableFragmentNode(fragmentNode, parentFragmentRef, componentDisplayName),
51 fragmentData = _useRefetchableFragme.fragmentData,
52 fragmentRef = _useRefetchableFragme.fragmentRef,
53 refetch = _useRefetchableFragme.refetch;
54
55 var fragmentIdentifier = getFragmentIdentifier(fragmentNode, fragmentRef); // Backward pagination
56
57 var _useLoadMore = useLoadMore({
58 componentDisplayName: componentDisplayName,
59 connectionPathInFragmentData: connectionPathInFragmentData,
60 direction: 'backward',
61 fragmentData: fragmentData,
62 fragmentIdentifier: fragmentIdentifier,
63 fragmentNode: fragmentNode,
64 fragmentRef: fragmentRef,
65 identifierField: identifierField,
66 paginationMetadata: paginationMetadata,
67 paginationRequest: paginationRequest
68 }),
69 loadPrevious = _useLoadMore[0],
70 hasPrevious = _useLoadMore[1],
71 isLoadingPrevious = _useLoadMore[2],
72 disposeFetchPrevious = _useLoadMore[3]; // Forward pagination
73
74
75 var _useLoadMore2 = useLoadMore({
76 componentDisplayName: componentDisplayName,
77 connectionPathInFragmentData: connectionPathInFragmentData,
78 direction: 'forward',
79 fragmentData: fragmentData,
80 fragmentIdentifier: fragmentIdentifier,
81 fragmentNode: fragmentNode,
82 fragmentRef: fragmentRef,
83 identifierField: identifierField,
84 paginationMetadata: paginationMetadata,
85 paginationRequest: paginationRequest
86 }),
87 loadNext = _useLoadMore2[0],
88 hasNext = _useLoadMore2[1],
89 isLoadingNext = _useLoadMore2[2],
90 disposeFetchNext = _useLoadMore2[3];
91
92 var refetchPagination = useCallback(function (variables, options) {
93 disposeFetchNext();
94 disposeFetchPrevious();
95 return refetch(variables, _objectSpread({}, options, {
96 __environment: undefined
97 }));
98 }, [disposeFetchNext, disposeFetchPrevious, refetch]);
99
100 if (process.env.NODE_ENV !== "production") {
101 // eslint-disable-next-line react-hooks/rules-of-hooks
102 useDebugValue({
103 fragment: fragmentNode.name,
104 data: fragmentData,
105 hasNext: hasNext,
106 isLoadingNext: isLoadingNext,
107 hasPrevious: hasPrevious,
108 isLoadingPrevious: isLoadingPrevious
109 });
110 }
111
112 return {
113 data: fragmentData,
114 loadNext: loadNext,
115 loadPrevious: loadPrevious,
116 hasNext: hasNext,
117 hasPrevious: hasPrevious,
118 isLoadingNext: isLoadingNext,
119 isLoadingPrevious: isLoadingPrevious,
120 refetch: refetchPagination
121 };
122}
123
124function useLoadMore(args) {
125 var _useState = useState(false),
126 isLoadingMore = _useState[0],
127 setIsLoadingMore = _useState[1];
128
129 var observer = {
130 start: function start() {
131 return setIsLoadingMore(true);
132 },
133 complete: function complete() {
134 return setIsLoadingMore(false);
135 },
136 error: function error() {
137 return setIsLoadingMore(false);
138 }
139 };
140
141 var handleReset = function handleReset() {
142 return setIsLoadingMore(false);
143 };
144
145 var _useLoadMoreFunction = useLoadMoreFunction(_objectSpread({}, args, {
146 observer: observer,
147 onReset: handleReset
148 })),
149 loadMore = _useLoadMoreFunction[0],
150 hasMore = _useLoadMoreFunction[1],
151 disposeFetch = _useLoadMoreFunction[2];
152
153 return [loadMore, hasMore, isLoadingMore, disposeFetch];
154}
155
156module.exports = usePaginationFragment;
\No newline at end of file