UNPKG

react-elegant-ui

Version:

Elegant UI components, made by BEM best practices for react

72 lines 2.13 kB
var __values = this && this.__values || function (o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var getSize = function (node) { return { x: node.scrollWidth - node.clientWidth, y: node.scrollHeight - node.clientHeight }; }; var handleNode = function (node, callback) { var size = getSize(node); if (size.y > 0 && size.x == 0) { requestAnimationFrame(function () { var newSize = getSize(node); if (newSize.x > 0) { callback(newSize); } }); } else { callback(size); } }; /** * Tool for correction a size of elements with `overflow: auto` * * This tool detect resize of element and call user handler with calculated X and Y indents * * WARNING: to avoid memory leaks you must call a clean function when element removed from DOM or when you want stop handling * Return cleanup function that is stop a observing * * Original bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1424328 */ export var overflowAutoFix = function (wrapper, callback) { var observer = new ResizeObserver(function (entries) { var e_1, _a; try { for (var entries_1 = __values(entries), entries_1_1 = entries_1.next(); !entries_1_1.done; entries_1_1 = entries_1.next()) { var entry = entries_1_1.value; var node = entry.target; if (!(node instanceof HTMLElement) || node !== wrapper) continue; handleNode(node, callback); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (entries_1_1 && !entries_1_1.done && (_a = entries_1.return)) _a.call(entries_1); } finally { if (e_1) throw e_1.error; } } }); observer.observe(wrapper); return function () { return observer.disconnect(); }; };