react-bootstrap-typeahead
Version:
React typeahead with Bootstrap styling
46 lines (45 loc) • 1.39 kB
JavaScript
import { useEffect, useState } from 'react';
import { usePopper } from 'react-popper';
const setPopperWidth = {
enabled: true,
fn: (data) => {
data.state.styles.popper.width = `${data.state.rects.reference.width}px`;
},
name: 'setPopperWidth',
phase: 'write',
};
export function getModifiers(props) {
const modifiers = [
{
enabled: !!props.flip,
name: 'flip',
},
];
if (props.align !== 'right' && props.align !== 'left') {
modifiers.push(setPopperWidth);
}
return modifiers;
}
export function getPlacement(props) {
const x = props.align === 'right' ? 'end' : 'start';
const y = props.dropup ? 'top' : 'bottom';
return `${y}-${x}`;
}
export function useOverlay(referenceElement, options) {
const [popperElement, attachRef] = useState(null);
const { attributes, styles, forceUpdate } = usePopper(referenceElement, popperElement, {
modifiers: getModifiers(options),
placement: getPlacement(options),
strategy: options.positionFixed ? 'fixed' : 'absolute',
});
const refElementHeight = referenceElement?.offsetHeight;
useEffect(() => {
forceUpdate && forceUpdate();
}, [refElementHeight]);
return {
...attributes.popper,
innerRef: attachRef,
style: styles.popper,
};
}
export default useOverlay;