react-relay
Version:
A framework for building GraphQL-driven React applications.
67 lines (58 loc) • 1.71 kB
Flow
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall relay
*/
;
import type {ReaderFragment} from 'relay-runtime';
const useRelayEnvironment = require('./useRelayEnvironment');
const invariant = require('invariant');
const React = require('react');
const {
__internal: {getObservableForActiveRequest},
getSelector,
} = require('relay-runtime');
const {useEffect, useState, useMemo} = React;
hook useIsOperationNodeActive(
fragmentNode: ReaderFragment,
fragmentRef: mixed,
): boolean {
const environment = useRelayEnvironment();
const observable = useMemo(() => {
const selector = getSelector(fragmentNode, fragmentRef);
if (selector == null) {
return null;
}
invariant(
selector.kind === 'SingularReaderSelector',
'useIsOperationNodeActive: Plural fragments are not supported.',
);
return getObservableForActiveRequest(environment, selector.owner);
}, [environment, fragmentNode, fragmentRef]);
const [isActive, setIsActive] = useState(observable != null);
useEffect(() => {
let subscription;
setIsActive(observable != null);
if (observable != null) {
const onCompleteOrError = () => {
setIsActive(false);
};
subscription = observable.subscribe({
complete: onCompleteOrError,
error: onCompleteOrError,
});
}
return () => {
if (subscription) {
subscription.unsubscribe();
}
};
}, [observable]);
return isActive;
}
module.exports = useIsOperationNodeActive;