react-relay
Version:
A framework for building GraphQL-driven React applications.
67 lines (66 loc) • 2.7 kB
JavaScript
;
var ProfilerContext = require('./ProfilerContext');
var _require = require('./QueryResource'),
getQueryCacheIdentifier = _require.getQueryCacheIdentifier,
getQueryResourceForEnvironment = _require.getQueryResourceForEnvironment;
var useFetchTrackingRef = require('./useFetchTrackingRef');
var useFragmentInternal = require('./useFragmentInternal');
var useRelayEnvironment = require('./useRelayEnvironment');
var React = require('react');
var useContext = React.useContext,
useEffect = React.useEffect,
useState = React.useState,
useRef = React.useRef;
function useLazyLoadQueryNode(_ref) {
var query = _ref.query,
componentDisplayName = _ref.componentDisplayName,
fetchObservable = _ref.fetchObservable,
fetchPolicy = _ref.fetchPolicy,
fetchKey = _ref.fetchKey,
renderPolicy = _ref.renderPolicy;
var environment = useRelayEnvironment();
var profilerContext = useContext(ProfilerContext);
var QueryResource = getQueryResourceForEnvironment(environment);
var _useState = useState(0),
forceUpdateKey = _useState[0],
forceUpdate = _useState[1];
var _useFetchTrackingRef = useFetchTrackingRef(),
startFetch = _useFetchTrackingRef.startFetch,
completeFetch = _useFetchTrackingRef.completeFetch;
var cacheBreaker = "".concat(forceUpdateKey, "-").concat(fetchKey !== null && fetchKey !== void 0 ? fetchKey : '');
var cacheIdentifier = getQueryCacheIdentifier(environment, query, fetchPolicy, renderPolicy, cacheBreaker);
var preparedQueryResult = profilerContext.wrapPrepareQueryResource(function () {
return QueryResource.prepareWithIdentifier(cacheIdentifier, query, fetchObservable, fetchPolicy, renderPolicy, {
start: startFetch,
complete: completeFetch,
error: completeFetch
}, profilerContext);
});
var maybeHiddenOrFastRefresh = useRef(false);
useEffect(function () {
return function () {
maybeHiddenOrFastRefresh.current = true;
};
}, []);
useEffect(function () {
if (maybeHiddenOrFastRefresh.current === true) {
maybeHiddenOrFastRefresh.current = false;
forceUpdate(function (n) {
return n + 1;
});
return;
}
var disposable = QueryResource.retain(preparedQueryResult, profilerContext);
return function () {
disposable.dispose();
};
}, [environment, cacheIdentifier]);
useEffect(function () {
QueryResource.releaseTemporaryRetain(preparedQueryResult);
});
var fragmentNode = preparedQueryResult.fragmentNode,
fragmentRef = preparedQueryResult.fragmentRef;
var data = useFragmentInternal(fragmentNode, fragmentRef, componentDisplayName);
return data;
}
module.exports = useLazyLoadQueryNode;