UNPKG

react-multi-ref

Version:

Utility for keeping references to multiple React elements.

55 lines (54 loc) 2.69 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); } function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } var _refFns = /*#__PURE__*/new WeakMap(); var MultiRef = exports["default"] = /*#__PURE__*/function () { function MultiRef() { (0, _classCallCheck2["default"])(this, MultiRef); (0, _defineProperty2["default"])(this, "map", new Map()); _classPrivateFieldInitSpec(this, _refFns, new Map()); } return (0, _createClass2["default"])(MultiRef, [{ key: "ref", value: function ref(key) { var _this = this; var refFn = _classPrivateFieldGet(_refFns, this).get(key); if (refFn) { return refFn; } else { var _refFn = function _refFn(value) { if (value == null) { // Support for React <=18, which cleans up ref functions by calling them // with null. _classPrivateFieldGet(_refFns, _this)["delete"](key); _this.map["delete"](key); } else { _classPrivateFieldGet(_refFns, _this).set(key, _refFn); _this.map.set(key, value); // React 19+ cleanup support return function () { _classPrivateFieldGet(_refFns, _this)["delete"](key); _this.map["delete"](key); }; } }; // We don't put `refFn` into `this._refFns` yet, because if the current render // is aborted, then it's possible than `refFn(null)` won't be called later // and its cleanup will never happen. We shouldn't cause any side effects that // need cleaning up later until `refFn` gets called with a non-null value. return _refFn; } } }]); }(); //# sourceMappingURL=index.js.map