55 lines
1.3 KiB
Plaintext
55 lines
1.3 KiB
Plaintext
// @flow
|
|
import type { ModifierArguments, Modifier } from '../types';
|
|
import getWindow from '../dom-utils/getWindow';
|
|
|
|
// eslint-disable-next-line import/no-unused-modules
|
|
export type Options = {
|
|
scroll: boolean,
|
|
resize: boolean,
|
|
};
|
|
|
|
const passive = { passive: true };
|
|
|
|
function effect({ state, instance, options }: ModifierArguments<Options>) {
|
|
const { scroll = true, resize = true } = options;
|
|
|
|
const window = getWindow(state.elements.popper);
|
|
const scrollParents = [
|
|
...state.scrollParents.reference,
|
|
...state.scrollParents.popper,
|
|
];
|
|
|
|
if (scroll) {
|
|
scrollParents.forEach(scrollParent => {
|
|
scrollParent.addEventListener('scroll', instance.update, passive);
|
|
});
|
|
}
|
|
|
|
if (resize) {
|
|
window.addEventListener('resize', instance.update, passive);
|
|
}
|
|
|
|
return () => {
|
|
if (scroll) {
|
|
scrollParents.forEach(scrollParent => {
|
|
scrollParent.removeEventListener('scroll', instance.update, passive);
|
|
});
|
|
}
|
|
|
|
if (resize) {
|
|
window.removeEventListener('resize', instance.update, passive);
|
|
}
|
|
};
|
|
}
|
|
|
|
// eslint-disable-next-line import/no-unused-modules
|
|
export type EventListenersModifier = Modifier<'eventListeners', Options>;
|
|
export default ({
|
|
name: 'eventListeners',
|
|
enabled: true,
|
|
phase: 'write',
|
|
fn: () => {},
|
|
effect,
|
|
data: {},
|
|
}: EventListenersModifier);
|