diff options
Diffstat (limited to 'popperjs/package/lib/modifiers/eventListeners.js.flow')
-rw-r--r-- | popperjs/package/lib/modifiers/eventListeners.js.flow | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/popperjs/package/lib/modifiers/eventListeners.js.flow b/popperjs/package/lib/modifiers/eventListeners.js.flow new file mode 100644 index 0000000..eab18a5 --- /dev/null +++ b/popperjs/package/lib/modifiers/eventListeners.js.flow @@ -0,0 +1,54 @@ +// @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); |