fe98dce1abf597f117688416b0357d3e4b49056ab6ce30bd3769beb20f6c8050dbef7a40296b5430653124b81384533ae4d5715b7f3241dcf3871ee41e8b9c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import ResizeObserver from 'resize-observer-polyfill';
  2. import { debounce } from 'throttle-debounce';
  3. const isServer = typeof window === 'undefined';
  4. /* istanbul ignore next */
  5. const resizeHandler = function(entries) {
  6. for (let entry of entries) {
  7. const listeners = entry.target.__resizeListeners__ || [];
  8. if (listeners.length) {
  9. listeners.forEach(fn => {
  10. fn();
  11. });
  12. }
  13. }
  14. };
  15. /* istanbul ignore next */
  16. export const addResizeListener = function(element, fn) {
  17. if (isServer) return;
  18. if (!element.__resizeListeners__) {
  19. element.__resizeListeners__ = [];
  20. element.__ro__ = new ResizeObserver(debounce(16, resizeHandler));
  21. element.__ro__.observe(element);
  22. }
  23. element.__resizeListeners__.push(fn);
  24. };
  25. /* istanbul ignore next */
  26. export const removeResizeListener = function(element, fn) {
  27. if (!element || !element.__resizeListeners__) return;
  28. element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
  29. if (!element.__resizeListeners__.length) {
  30. element.__ro__.disconnect();
  31. }
  32. };