box-ui-elements-mlh
Version:
49 lines (41 loc) • 1.55 kB
JavaScript
// @flow
import * as React from 'react';
import { Manager, Reference, Popper } from 'react-popper';
import type { Modifiers, Placement } from 'popper.js';
import { PLACEMENT_AUTO } from './constants';
type Props = {
children: React.Node,
isOpen?: boolean,
modifiers?: Modifiers,
placement: Placement,
};
const PopperComponent = (props: Props) => {
const { children, isOpen, modifiers, placement: popperPlacement } = props;
const elements = React.Children.toArray(children);
if (elements.length !== 2) {
throw new Error('PopperComponent must have exactly two children: A reference component and the Popper content');
}
const [reference, popperContent] = elements;
return (
<Manager>
<Reference>{({ ref }) => React.cloneElement(reference, { ref })}</Reference>
{isOpen && (
<Popper placement={popperPlacement} modifiers={modifiers}>
{({ ref, style, placement, scheduleUpdate }) => {
const { style: contentStyles } = popperContent.props;
return React.cloneElement(popperContent, {
ref,
style: { ...contentStyles, ...style },
placement,
scheduleUpdate,
});
}}
</Popper>
)}
</Manager>
);
};
PopperComponent.defaultProps = {
placement: PLACEMENT_AUTO,
};
export default PopperComponent;