You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
1.0 KiB

// @flow strict
import * as React from 'react';
export const ManagerReferenceNodeContext: React.Context<?Element> = React.createContext();
export const ManagerReferenceNodeSetterContext: React.Context<
void | ((?Element) => void)
> = React.createContext();
export type ManagerProps = $ReadOnly<{
children: React.Node,
}>;
export function Manager({ children }: ManagerProps): React.Node {
const [referenceNode, setReferenceNode] = React.useState<?Element>(null);
const hasUnmounted = React.useRef(false);
React.useEffect(() => {
return () => {
hasUnmounted.current = true;
};
}, []);
const handleSetReferenceNode = React.useCallback((node) => {
if (!hasUnmounted.current) {
setReferenceNode(node);
}
}, []);
return (
<ManagerReferenceNodeContext.Provider value={referenceNode}>
<ManagerReferenceNodeSetterContext.Provider
value={handleSetReferenceNode}
>
{children}
</ManagerReferenceNodeSetterContext.Provider>
</ManagerReferenceNodeContext.Provider>
);
}