UNPKG

react-relay

Version:

A framework for building GraphQL-driven React applications.

136 lines (135 loc) 5.97 kB
'use strict'; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _excluded = ["disableStoreUpdates", "enableStoreUpdates"]; var useLoadMoreFunction = require('../useLoadMoreFunction'); var useStaticFragmentNodeWarning = require('../useStaticFragmentNodeWarning'); var useRefetchableFragmentNode = require('./useRefetchableFragmentNode'); var invariant = require('invariant'); var _require = require('react'), useCallback = _require.useCallback, useEffect = _require.useEffect, useRef = _require.useRef, useState = _require.useState; var _require2 = require('relay-runtime'), getFragment = _require2.getFragment, getFragmentIdentifier = _require2.getFragmentIdentifier, getPaginationMetadata = _require2.getPaginationMetadata; function useBlockingPaginationFragment(fragmentInput, parentFragmentRef) { var componentDisplayName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'useBlockingPaginationFragment()'; var fragmentNode = getFragment(fragmentInput); useStaticFragmentNodeWarning(fragmentNode, "first argument of ".concat(componentDisplayName)); var _getPaginationMetadat = getPaginationMetadata(fragmentNode, componentDisplayName), connectionPathInFragmentData = _getPaginationMetadat.connectionPathInFragmentData, paginationRequest = _getPaginationMetadat.paginationRequest, paginationMetadata = _getPaginationMetadat.paginationMetadata, stream = _getPaginationMetadat.stream; !(stream === false) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Relay: @stream_connection is not compatible with `useBlockingPaginationFragment`. ' + 'Use `useStreamingPaginationFragment` instead.') : invariant(false) : void 0; var _useRefetchableFragme = useRefetchableFragmentNode(fragmentNode, parentFragmentRef, componentDisplayName), fragmentData = _useRefetchableFragme.fragmentData, fragmentRef = _useRefetchableFragme.fragmentRef, refetch = _useRefetchableFragme.refetch, disableStoreUpdates = _useRefetchableFragme.disableStoreUpdates, enableStoreUpdates = _useRefetchableFragme.enableStoreUpdates; var fragmentIdentifier = getFragmentIdentifier(fragmentNode, fragmentRef); var _useLoadMore = useLoadMore({ componentDisplayName: componentDisplayName, connectionPathInFragmentData: connectionPathInFragmentData, direction: 'backward', disableStoreUpdates: disableStoreUpdates, enableStoreUpdates: enableStoreUpdates, fragmentData: fragmentData, fragmentIdentifier: fragmentIdentifier, fragmentNode: fragmentNode, fragmentRef: fragmentRef, paginationMetadata: paginationMetadata, paginationRequest: paginationRequest }), loadPrevious = _useLoadMore[0], hasPrevious = _useLoadMore[1], disposeFetchPrevious = _useLoadMore[2]; var _useLoadMore2 = useLoadMore({ componentDisplayName: componentDisplayName, connectionPathInFragmentData: connectionPathInFragmentData, direction: 'forward', disableStoreUpdates: disableStoreUpdates, enableStoreUpdates: enableStoreUpdates, fragmentData: fragmentData, fragmentIdentifier: fragmentIdentifier, fragmentNode: fragmentNode, fragmentRef: fragmentRef, paginationMetadata: paginationMetadata, paginationRequest: paginationRequest }), loadNext = _useLoadMore2[0], hasNext = _useLoadMore2[1], disposeFetchNext = _useLoadMore2[2]; var refetchPagination = useCallback(function (variables, options) { disposeFetchNext(); disposeFetchPrevious(); return refetch(variables, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, options), {}, { __environment: undefined })); }, [disposeFetchNext, disposeFetchPrevious, refetch]); return { data: fragmentData, loadNext: loadNext, loadPrevious: loadPrevious, hasNext: hasNext, hasPrevious: hasPrevious, refetch: refetchPagination }; } function useLoadMore(args) { var disableStoreUpdates = args.disableStoreUpdates, enableStoreUpdates = args.enableStoreUpdates, loadMoreArgs = (0, _objectWithoutPropertiesLoose2["default"])(args, _excluded); var _useState = useState(null), requestPromise = _useState[0], setRequestPromise = _useState[1]; var requestPromiseRef = useRef(null); var promiseResolveRef = useRef(null); var promiseResolve = function promiseResolve() { if (promiseResolveRef.current != null) { promiseResolveRef.current(); promiseResolveRef.current = null; } }; var handleReset = function handleReset() { promiseResolve(); }; var observer = { complete: promiseResolve, start: function start() { disableStoreUpdates(); var promise = new Promise(function (resolve) { promiseResolveRef.current = function () { requestPromiseRef.current = null; resolve(); }; }); requestPromiseRef.current = promise; setRequestPromise(promise); }, next: promiseResolve, error: promiseResolve }; var _useLoadMoreFunction = useLoadMoreFunction((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, loadMoreArgs), {}, { observer: observer, onReset: handleReset })), loadMore = _useLoadMoreFunction[0], hasMore = _useLoadMoreFunction[1], disposeFetch = _useLoadMoreFunction[2]; if (requestPromise != null && requestPromise === requestPromiseRef.current) { throw requestPromise; } useEffect(function () { if (requestPromise !== requestPromiseRef.current) { enableStoreUpdates(); } }, [requestPromise]); return [loadMore, hasMore, disposeFetch]; } module.exports = useBlockingPaginationFragment;