react-relay
Version:
A framework for building GraphQL-driven React applications.
140 lines (139 loc) • 6.21 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
var _require = require('./loadQuery'),
loadQuery = _require.loadQuery;
var useIsMountedRef = require('./useIsMountedRef');
var useQueryLoader_EXPERIMENTAL = require('./useQueryLoader_EXPERIMENTAL');
var useRelayEnvironment = require('./useRelayEnvironment');
var _require2 = require('react'),
useCallback = _require2.useCallback,
useEffect = _require2.useEffect,
useRef = _require2.useRef,
useState = _require2.useState;
var _require3 = require('relay-runtime'),
RelayFeatureFlags = _require3.RelayFeatureFlags,
getRequest = _require3.getRequest;
var initialNullQueryReferenceState = {
kind: 'NullQueryReference'
};
function requestIsLiveQuery(preloadableRequest) {
if (preloadableRequest.kind === 'PreloadableConcreteRequest') {
return preloadableRequest.params.metadata.live !== undefined;
}
var request = getRequest(preloadableRequest);
return request.params.metadata.live !== undefined;
}
function useQueryLoader(preloadableRequest, initialQueryReference) {
if (RelayFeatureFlags.ENABLE_ACTIVITY_COMPATIBILITY) {
return useQueryLoader_EXPERIMENTAL(preloadableRequest, initialQueryReference);
}
return useQueryLoader_CURRENT(preloadableRequest, initialQueryReference);
}
function useQueryLoader_CURRENT(preloadableRequest, initialQueryReference) {
var initialQueryReferenceInternal = initialQueryReference !== null && initialQueryReference !== void 0 ? initialQueryReference : initialNullQueryReferenceState;
var environment = useRelayEnvironment();
var isMountedRef = useIsMountedRef();
var undisposedQueryReferencesRef = useRef(new Set([initialQueryReferenceInternal]));
var _useState = useState(function () {
return initialQueryReferenceInternal;
}),
queryReference = _useState[0],
setQueryReference = _useState[1];
var _useState2 = useState(function () {
return initialQueryReferenceInternal;
}),
previousInitialQueryReference = _useState2[0],
setPreviousInitialQueryReference = _useState2[1];
if (initialQueryReferenceInternal !== previousInitialQueryReference) {
undisposedQueryReferencesRef.current.add(initialQueryReferenceInternal);
setPreviousInitialQueryReference(initialQueryReferenceInternal);
setQueryReference(initialQueryReferenceInternal);
}
var disposeQuery = useCallback(function () {
if (isMountedRef.current) {
undisposedQueryReferencesRef.current.add(initialNullQueryReferenceState);
setQueryReference(initialNullQueryReferenceState);
}
}, [isMountedRef]);
var queryLoaderCallback = useCallback(function (variables, options) {
var mergedOptions = options != null && options.hasOwnProperty('__environment') ? {
fetchPolicy: options.fetchPolicy,
networkCacheConfig: options.networkCacheConfig,
__nameForWarning: options.__nameForWarning
} : options;
if (isMountedRef.current) {
var _options$__environmen;
var updatedQueryReference = loadQuery((_options$__environmen = options === null || options === void 0 ? void 0 : options.__environment) !== null && _options$__environmen !== void 0 ? _options$__environmen : environment, preloadableRequest, variables, mergedOptions);
undisposedQueryReferencesRef.current.add(updatedQueryReference);
setQueryReference(updatedQueryReference);
}
}, [environment, preloadableRequest, setQueryReference, isMountedRef]);
var maybeHiddenOrFastRefresh = useRef(false);
useEffect(function () {
return function () {
maybeHiddenOrFastRefresh.current = true;
};
}, []);
useEffect(function () {
if (maybeHiddenOrFastRefresh.current === true) {
maybeHiddenOrFastRefresh.current = false;
if (queryReference.kind !== 'NullQueryReference') {
queryLoaderCallback(queryReference.variables, {
fetchPolicy: queryReference.fetchPolicy,
networkCacheConfig: queryReference.networkCacheConfig
});
}
return;
}
var undisposedQueryReferences = undisposedQueryReferencesRef.current;
if (isMountedRef.current) {
var _iterator = (0, _createForOfIteratorHelper2["default"])(undisposedQueryReferences),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var undisposedQueryReference = _step.value;
if (undisposedQueryReference === queryReference) {
break;
}
undisposedQueryReferences["delete"](undisposedQueryReference);
if (undisposedQueryReference.kind !== 'NullQueryReference') {
if (requestIsLiveQuery(preloadableRequest)) {
undisposedQueryReference.dispose && undisposedQueryReference.dispose();
} else {
undisposedQueryReference.releaseQuery && undisposedQueryReference.releaseQuery();
}
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
}, [queryReference, isMountedRef, queryLoaderCallback, preloadableRequest]);
useEffect(function () {
return function disposeAllRemainingQueryReferences() {
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(undisposedQueryReferencesRef.current),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var undisposedQueryReference = _step2.value;
if (undisposedQueryReference.kind !== 'NullQueryReference') {
if (requestIsLiveQuery(preloadableRequest)) {
undisposedQueryReference.dispose && undisposedQueryReference.dispose();
} else {
undisposedQueryReference.releaseQuery && undisposedQueryReference.releaseQuery();
}
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
};
}, [preloadableRequest]);
return [queryReference.kind === 'NullQueryReference' ? null : queryReference, queryLoaderCallback, disposeQuery];
}
module.exports = useQueryLoader;