UNPKG

matrix-react-sdk

Version:
111 lines (105 loc) 16 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ function isReactElement(c) { return typeof c === "object" && "type" in c; } /** * The NodeAnimator contains components and animates transitions. * It will only pick up direct changes to properties ('left', currently), and so * will not work for animating positional changes where the position is implicit * from DOM order. This makes it a lot simpler and lighter: if you need fully * automatic positional animation, look at react-shuffle or similar libraries. */ class NodeAnimator extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "nodes", {}); (0, _defineProperty2.default)(this, "children", {}); this.updateChildren(this.props.children); } componentDidUpdate() { this.updateChildren(this.props.children); } /** * * @param {HTMLElement} node element to apply styles to * @param {React.CSSProperties} styles a key/value pair of CSS properties * @returns {void} */ applyStyles(node, styles) { Object.entries(styles).forEach(([property, value]) => { node.style[property] = value; }); } updateChildren(newChildren) { const oldChildren = this.children || {}; this.children = {}; _react.default.Children.toArray(newChildren).forEach(c => { if (!isReactElement(c)) return; if (oldChildren[c.key]) { const old = oldChildren[c.key]; const oldNode = _reactDom.default.findDOMNode(this.nodes[old.key]); if (oldNode && oldNode.style.left !== c.props.style.left) { this.applyStyles(oldNode, { left: c.props.style.left }); } // clone the old element with the props (and children) of the new element // so prop updates are still received by the children. this.children[c.key] = /*#__PURE__*/_react.default.cloneElement(old, c.props, c.props.children); } else { // new element. If we have a startStyle, use that as the style and go through // the enter animations const newProps = {}; const restingStyle = c.props.style; const startStyles = this.props.startStyles; if (startStyles.length > 0) { const startStyle = startStyles[0]; newProps.style = startStyle; } newProps.ref = n => this.collectNode(c.key, n, restingStyle); this.children[c.key] = /*#__PURE__*/_react.default.cloneElement(c, newProps); } }); } collectNode(k, node, restingStyle) { if (node && this.nodes[k] === undefined && this.props.startStyles.length > 0) { const startStyles = this.props.startStyles; const domNode = _reactDom.default.findDOMNode(node); // start from startStyle 1: 0 is the one we gave it // to start with, so now we animate 1 etc. for (let i = 1; i < startStyles.length; ++i) { this.applyStyles(domNode, startStyles[i]); } // and then we animate to the resting state window.setTimeout(() => { this.applyStyles(domNode, restingStyle); }, 0); } this.nodes[k] = node; if (this.props.innerRef) { this.props.innerRef.current = node; } } render() { return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, Object.values(this.children)); } } exports.default = NodeAnimator; (0, _defineProperty2.default)(NodeAnimator, "defaultProps", { startStyles: [] }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdERvbSIsImlzUmVhY3RFbGVtZW50IiwiYyIsIk5vZGVBbmltYXRvciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwidXBkYXRlQ2hpbGRyZW4iLCJjaGlsZHJlbiIsImNvbXBvbmVudERpZFVwZGF0ZSIsImFwcGx5U3R5bGVzIiwibm9kZSIsInN0eWxlcyIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwicHJvcGVydHkiLCJ2YWx1ZSIsInN0eWxlIiwibmV3Q2hpbGRyZW4iLCJvbGRDaGlsZHJlbiIsIkNoaWxkcmVuIiwidG9BcnJheSIsImtleSIsIm9sZCIsIm9sZE5vZGUiLCJSZWFjdERvbSIsImZpbmRET01Ob2RlIiwibm9kZXMiLCJsZWZ0IiwiY2xvbmVFbGVtZW50IiwibmV3UHJvcHMiLCJyZXN0aW5nU3R5bGUiLCJzdGFydFN0eWxlcyIsImxlbmd0aCIsInN0YXJ0U3R5bGUiLCJyZWYiLCJuIiwiY29sbGVjdE5vZGUiLCJrIiwidW5kZWZpbmVkIiwiZG9tTm9kZSIsImkiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiaW5uZXJSZWYiLCJjdXJyZW50IiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIkZyYWdtZW50IiwidmFsdWVzIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9Ob2RlQW5pbWF0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBLZXksIE11dGFibGVSZWZPYmplY3QsIFJlYWN0RWxlbWVudCwgUmVhY3RGcmFnbWVudCwgUmVhY3RJbnN0YW5jZSwgUmVhY3RQb3J0YWwgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERvbSBmcm9tIFwicmVhY3QtZG9tXCI7XG5cbmludGVyZmFjZSBJQ2hpbGRQcm9wcyB7XG4gICAgc3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXM7XG4gICAgcmVmOiAobm9kZTogUmVhY3QuUmVhY3RJbnN0YW5jZSkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgLy8gZWl0aGVyIGEgbGlzdCBvZiBjaGlsZCBub2Rlcywgb3IgYSBzaW5nbGUgY2hpbGQuXG4gICAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcblxuICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gaW5mb3JtYXRpb24gZm9yIGNoYW5naW5nIGV4aXN0aW5nIGNoaWxkcmVuXG4gICAgdHJhbnNpdGlvbj86IG9iamVjdDtcblxuICAgIC8vIGEgbGlzdCBvZiBzdGF0ZSBvYmplY3RzIHRvIGFwcGx5IHRvIGVhY2ggY2hpbGQgbm9kZSBpbiB0dXJuXG4gICAgc3RhcnRTdHlsZXM6IFJlYWN0LkNTU1Byb3BlcnRpZXNbXTtcblxuICAgIGlubmVyUmVmPzogTXV0YWJsZVJlZk9iamVjdDxhbnk+O1xufVxuXG5mdW5jdGlvbiBpc1JlYWN0RWxlbWVudChjOiBSZWFjdEVsZW1lbnQgfCBSZWFjdEZyYWdtZW50IHwgUmVhY3RQb3J0YWwpOiBjIGlzIFJlYWN0RWxlbWVudCB7XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSBcIm9iamVjdFwiICYmIFwidHlwZVwiIGluIGM7XG59XG5cbi8qKlxuICogVGhlIE5vZGVBbmltYXRvciBjb250YWlucyBjb21wb25lbnRzIGFuZCBhbmltYXRlcyB0cmFuc2l0aW9ucy5cbiAqIEl0IHdpbGwgb25seSBwaWNrIHVwIGRpcmVjdCBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgKCdsZWZ0JywgY3VycmVudGx5KSwgYW5kIHNvXG4gKiB3aWxsIG5vdCB3b3JrIGZvciBhbmltYXRpbmcgcG9zaXRpb25hbCBjaGFuZ2VzIHdoZXJlIHRoZSBwb3NpdGlvbiBpcyBpbXBsaWNpdFxuICogZnJvbSBET00gb3JkZXIuIFRoaXMgbWFrZXMgaXQgYSBsb3Qgc2ltcGxlciBhbmQgbGlnaHRlcjogaWYgeW91IG5lZWQgZnVsbHlcbiAqIGF1dG9tYXRpYyBwb3NpdGlvbmFsIGFuaW1hdGlvbiwgbG9vayBhdCByZWFjdC1zaHVmZmxlIG9yIHNpbWlsYXIgbGlicmFyaWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb2RlQW5pbWF0b3IgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzPiB7XG4gICAgcHJpdmF0ZSBub2RlczogUmVjb3JkPHN0cmluZywgUmVhY3RJbnN0YW5jZT4gPSB7fTtcbiAgICBwcml2YXRlIGNoaWxkcmVuOiB7IFtrZXk6IHN0cmluZ106IFJlYWN0RWxlbWVudCB9ID0ge307XG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8SVByb3BzPiA9IHtcbiAgICAgICAgc3RhcnRTdHlsZXM6IFtdLFxuICAgIH07XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkVXBkYXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBlbGVtZW50IHRvIGFwcGx5IHN0eWxlcyB0b1xuICAgICAqIEBwYXJhbSB7UmVhY3QuQ1NTUHJvcGVydGllc30gc3R5bGVzIGEga2V5L3ZhbHVlIHBhaXIgb2YgQ1NTIHByb3BlcnRpZXNcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5U3R5bGVzKG5vZGU6IEhUTUxFbGVtZW50LCBzdHlsZXM6IFJlYWN0LkNTU1Byb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc3R5bGVzKS5mb3JFYWNoKChbcHJvcGVydHksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgbm9kZS5zdHlsZVtwcm9wZXJ0eSBhcyBrZXlvZiBPbWl0PENTU1N0eWxlRGVjbGFyYXRpb24sIFwibGVuZ3RoXCIgfCBcInBhcmVudFJ1bGVcIj5dID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2hpbGRyZW4obmV3Q2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBvbGRDaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gfHwge307XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSB7fTtcbiAgICAgICAgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShuZXdDaGlsZHJlbikuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1JlYWN0RWxlbWVudChjKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKG9sZENoaWxkcmVuW2Mua2V5IV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGQgPSBvbGRDaGlsZHJlbltjLmtleSFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE5vZGUgPSBSZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzLm5vZGVzW29sZC5rZXkhXSk7XG5cbiAgICAgICAgICAgICAgICBpZiAob2xkTm9kZSAmJiAob2xkTm9kZSBhcyBIVE1MRWxlbWVudCkuc3R5bGUubGVmdCAhPT0gYy5wcm9wcy5zdHlsZS5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZXMob2xkTm9kZSBhcyBIVE1MRWxlbWVudCwgeyBsZWZ0OiBjLnByb3BzLnN0eWxlLmxlZnQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNsb25lIHRoZSBvbGQgZWxlbWVudCB3aXRoIHRoZSBwcm9wcyAoYW5kIGNoaWxkcmVuKSBvZiB0aGUgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgICAgICAvLyBzbyBwcm9wIHVwZGF0ZXMgYXJlIHN0aWxsIHJlY2VpdmVkIGJ5IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2Mua2V5IV0gPSBSZWFjdC5jbG9uZUVsZW1lbnQob2xkLCBjLnByb3BzLCBjLnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbmV3IGVsZW1lbnQuIElmIHdlIGhhdmUgYSBzdGFydFN0eWxlLCB1c2UgdGhhdCBhcyB0aGUgc3R5bGUgYW5kIGdvIHRocm91Z2hcbiAgICAgICAgICAgICAgICAvLyB0aGUgZW50ZXIgYW5pbWF0aW9uc1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Byb3BzOiBQYXJ0aWFsPElDaGlsZFByb3BzPiA9IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RpbmdTdHlsZSA9IGMucHJvcHMuc3R5bGU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFN0eWxlcyA9IHRoaXMucHJvcHMuc3RhcnRTdHlsZXM7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0U3R5bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRTdHlsZSA9IHN0YXJ0U3R5bGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcy5zdHlsZSA9IHN0YXJ0U3R5bGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3UHJvcHMucmVmID0gKG4pID0+IHRoaXMuY29sbGVjdE5vZGUoYy5rZXkhLCBuLCByZXN0aW5nU3R5bGUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltjLmtleSFdID0gUmVhY3QuY2xvbmVFbGVtZW50KGMsIG5ld1Byb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0Tm9kZShrOiBLZXksIG5vZGU6IFJlYWN0LlJlYWN0SW5zdGFuY2UsIHJlc3RpbmdTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyk6IHZvaWQge1xuICAgICAgICBpZiAobm9kZSAmJiB0aGlzLm5vZGVzW2tdID09PSB1bmRlZmluZWQgJiYgdGhpcy5wcm9wcy5zdGFydFN0eWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFN0eWxlcyA9IHRoaXMucHJvcHMuc3RhcnRTdHlsZXM7XG4gICAgICAgICAgICBjb25zdCBkb21Ob2RlID0gUmVhY3REb20uZmluZERPTU5vZGUobm9kZSk7XG4gICAgICAgICAgICAvLyBzdGFydCBmcm9tIHN0YXJ0U3R5bGUgMTogMCBpcyB0aGUgb25lIHdlIGdhdmUgaXRcbiAgICAgICAgICAgIC8vIHRvIHN0YXJ0IHdpdGgsIHNvIG5vdyB3ZSBhbmltYXRlIDEgZXRjLlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdGFydFN0eWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZXMoZG9tTm9kZSBhcyBIVE1MRWxlbWVudCwgc3RhcnRTdHlsZXNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhbmQgdGhlbiB3ZSBhbmltYXRlIHRvIHRoZSByZXN0aW5nIHN0YXRlXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVN0eWxlcyhkb21Ob2RlIGFzIEhUTUxFbGVtZW50LCByZXN0aW5nU3R5bGUpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2Rlc1trXSA9IG5vZGU7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaW5uZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuaW5uZXJSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiA8PntPYmplY3QudmFsdWVzKHRoaXMuY2hpbGRyZW4pfTwvPjtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBdUJBLFNBQVNFLGNBQWNBLENBQUNDLENBQTZDLEVBQXFCO0VBQ3RGLE9BQU8sT0FBT0EsQ0FBQyxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUlBLENBQUM7QUFDL0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxNQUFNQyxZQUFZLFNBQVNDLGNBQUssQ0FBQ0MsU0FBUyxDQUFTO0VBT3ZEQyxXQUFXQSxDQUFDQyxLQUFhLEVBQUU7SUFDOUIsS0FBSyxDQUFDQSxLQUFLLENBQUM7SUFBQyxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBLGlCQVA4QixDQUFDLENBQUM7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLG9CQUNHLENBQUMsQ0FBQztJQVFsRCxJQUFJLENBQUNDLGNBQWMsQ0FBQyxJQUFJLENBQUNILEtBQUssQ0FBQ0ksUUFBUSxDQUFDO0VBQzVDO0VBRU9DLGtCQUFrQkEsQ0FBQSxFQUFTO0lBQzlCLElBQUksQ0FBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQ0gsS0FBSyxDQUFDSSxRQUFRLENBQUM7RUFDNUM7O0VB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