You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.3 KiB

2 months ago
  1. // @flow
  2. import type { ModifierArguments, Modifier } from '../types';
  3. import getWindow from '../dom-utils/getWindow';
  4. // eslint-disable-next-line import/no-unused-modules
  5. export type Options = {
  6. scroll: boolean,
  7. resize: boolean,
  8. };
  9. const passive = { passive: true };
  10. function effect({ state, instance, options }: ModifierArguments<Options>) {
  11. const { scroll = true, resize = true } = options;
  12. const window = getWindow(state.elements.popper);
  13. const scrollParents = [
  14. ...state.scrollParents.reference,
  15. ...state.scrollParents.popper,
  16. ];
  17. if (scroll) {
  18. scrollParents.forEach(scrollParent => {
  19. scrollParent.addEventListener('scroll', instance.update, passive);
  20. });
  21. }
  22. if (resize) {
  23. window.addEventListener('resize', instance.update, passive);
  24. }
  25. return () => {
  26. if (scroll) {
  27. scrollParents.forEach(scrollParent => {
  28. scrollParent.removeEventListener('scroll', instance.update, passive);
  29. });
  30. }
  31. if (resize) {
  32. window.removeEventListener('resize', instance.update, passive);
  33. }
  34. };
  35. }
  36. // eslint-disable-next-line import/no-unused-modules
  37. export type EventListenersModifier = Modifier<'eventListeners', Options>;
  38. export default ({
  39. name: 'eventListeners',
  40. enabled: true,
  41. phase: 'write',
  42. fn: () => {},
  43. effect,
  44. data: {},
  45. }: EventListenersModifier);