faithlife-react-popper
Version:
Fork of the react-popper project
37 lines (30 loc) • 1.04 kB
Flow
// @flow
import * as React from 'react';
import warning from 'warning';
import { ManagerReferenceNodeSetterContext } from './Manager';
import { safeInvoke, unwrapArray, setRef } from './utils';
import { type Ref } from './RefTypes';
export type ReferenceChildrenProps = { ref: Ref };
export type ReferenceProps = {|
children: (ReferenceChildrenProps) => React.Node,
innerRef?: Ref,
|};
export function Reference({ children, innerRef }: ReferenceProps) {
const setReferenceNode = React.useContext(ManagerReferenceNodeSetterContext);
const refHandler = React.useCallback(
(node: ?HTMLElement) => {
setRef(innerRef, node);
safeInvoke(setReferenceNode, node);
},
[innerRef, setReferenceNode]
);
// ran on unmount
React.useEffect(() => () => setRef(innerRef, null));
React.useEffect(() => {
warning(
Boolean(setReferenceNode),
'`Reference` should not be used outside of a `Manager` component.'
);
}, [setReferenceNode]);
return unwrapArray(children)({ ref: refHandler });
}