UNPKG

matrix-react-sdk

Version:
115 lines (109 loc) 19.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.DefaultOptions = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _arrays = require("../../utils/arrays"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2020-2023 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. */ const DefaultOptions = exports.DefaultOptions = { maxCount: 200, gravity: 0.05, maxDrift: 5 }; const KEY_FRAME_INTERVAL = 15; // 15ms, roughly class Snowfall { constructor(options) { (0, _defineProperty2.default)(this, "options", void 0); (0, _defineProperty2.default)(this, "context", null); (0, _defineProperty2.default)(this, "particles", []); (0, _defineProperty2.default)(this, "lastAnimationTime", 0); (0, _defineProperty2.default)(this, "isRunning", false); (0, _defineProperty2.default)(this, "start", async (canvas, timeout = 3000) => { if (!canvas) { return; } this.context = canvas.getContext("2d"); this.particles = []; const count = this.options.maxCount; while (this.particles.length < count) { this.particles.push(this.resetParticle({}, canvas.width, canvas.height)); } this.isRunning = true; requestAnimationFrame(this.renderLoop); if (timeout) { window.setTimeout(this.stop, timeout); } }); (0, _defineProperty2.default)(this, "stop", async () => { this.isRunning = false; }); (0, _defineProperty2.default)(this, "resetParticle", (particle, width, height) => { particle.x = Math.random() * width; particle.y = Math.random() * -height; particle.xCol = particle.x; particle.diameter = Math.random() * 7 + 4; particle.maximumDrift = Math.random() * this.options.maxDrift + 3.5; particle.gravity = this.options.gravity + Math.random() * 6 + 4; return particle; }); (0, _defineProperty2.default)(this, "renderLoop", () => { if (!this.context || !this.context.canvas) { return; } if (this.particles.length === 0) { this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); } else { const timeDelta = Date.now() - this.lastAnimationTime; if (timeDelta >= KEY_FRAME_INTERVAL || !this.lastAnimationTime) { // Clear the screen first this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height); this.lastAnimationTime = Date.now(); this.animateAndRenderSnowflakes(); } requestAnimationFrame(this.renderLoop); } }); this.options = _objectSpread(_objectSpread({}, DefaultOptions), options); } animateAndRenderSnowflakes() { if (!this.context || !this.context.canvas) { return; } const height = this.context.canvas.height; for (const particle of (0, _arrays.arrayFastClone)(this.particles)) { particle.y += particle.gravity; // We treat the drift as a sine function to have a more fluid-like movement instead // of a pong-like movement off walls of the X column. This means that for // $x=A\sin(\frac{2\pi}{P}y)$ we use the `maximumDrift` as the amplitude (A) and a // large multiplier to create a very long waveform through P. const peakDistance = 75 * particle.maximumDrift; const PI2 = Math.PI * 2; particle.x = particle.maximumDrift * Math.sin(PI2 / peakDistance * particle.y); particle.x += particle.xCol; // bring the particle to the right place const radius = particle.diameter / 2; this.context.save(); this.context.beginPath(); this.context.ellipse(particle.x, particle.y, radius, radius, 0, 0, 360); this.context.fillStyle = "#eaeaea"; // grey so it shows up on the light theme this.context.fill(); this.context.closePath(); this.context.restore(); // Remove any dead snowflakes const maxBounds = radius * 4; // make sure it's *really* off screen if (particle.y > height + maxBounds) { const idx = this.particles.indexOf(particle); this.particles.splice(idx, 1); } } } } exports.default = Snowfall; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXJyYXlzIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRlZmF1bHRPcHRpb25zIiwiZXhwb3J0cyIsIm1heENvdW50IiwiZ3Jhdml0eSIsIm1heERyaWZ0IiwiS0VZX0ZSQU1FX0lOVEVSVkFMIiwiU25vd2ZhbGwiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjYW52YXMiLCJ0aW1lb3V0IiwiY29udGV4dCIsImdldENvbnRleHQiLCJwYXJ0aWNsZXMiLCJjb3VudCIsInJlc2V0UGFydGljbGUiLCJ3aWR0aCIsImhlaWdodCIsImlzUnVubmluZyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInJlbmRlckxvb3AiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Iiwic3RvcCIsInBhcnRpY2xlIiwieCIsIk1hdGgiLCJyYW5kb20iLCJ5IiwieENvbCIsImRpYW1ldGVyIiwibWF4aW11bURyaWZ0IiwiY2xlYXJSZWN0IiwidGltZURlbHRhIiwiRGF0ZSIsIm5vdyIsImxhc3RBbmltYXRpb25UaW1lIiwiYW5pbWF0ZUFuZFJlbmRlclNub3dmbGFrZXMiLCJhcnJheUZhc3RDbG9uZSIsInBlYWtEaXN0YW5jZSIsIlBJMiIsIlBJIiwic2luIiwicmFkaXVzIiwic2F2ZSIsImJlZ2luUGF0aCIsImVsbGlwc2UiLCJmaWxsU3R5bGUiLCJmaWxsIiwiY2xvc2VQYXRoIiwicmVzdG9yZSIsIm1heEJvdW5kcyIsImlkeCIsImluZGV4T2YiLCJzcGxpY2UiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZWZmZWN0cy9zbm93ZmFsbC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMC0yMDIzIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiAqL1xuaW1wb3J0IElDYW52YXNFZmZlY3QgZnJvbSBcIi4uL0lDYW52YXNFZmZlY3RcIjtcbmltcG9ydCB7IGFycmF5RmFzdENsb25lIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2FycmF5c1wiO1xuXG5leHBvcnQgdHlwZSBTbm93ZmFsbE9wdGlvbnMgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNub3dmbGFrZXMgdG8gcmVuZGVyIGF0IGEgZ2l2ZW4gdGltZVxuICAgICAqL1xuICAgIG1heENvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBncmF2aXR5IHRvIGFwcGx5IHRvIHRoZSBzbm93Zmxha2VzXG4gICAgICovXG4gICAgZ3Jhdml0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZHJpZnQgKGhvcml6b250YWwgc3dheSkgdG8gYXBwbHkgdG8gdGhlIHNub3dmbGFrZXMuIEVhY2ggc25vd2ZsYWtlIHZhcmllcy5cbiAgICAgKi9cbiAgICBtYXhEcmlmdDogbnVtYmVyO1xufTtcblxudHlwZSBTbm93Zmxha2UgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB4Q29sOiBudW1iZXI7XG4gICAgZGlhbWV0ZXI6IG51bWJlcjtcbiAgICBtYXhpbXVtRHJpZnQ6IG51bWJlcjtcbiAgICBncmF2aXR5OiBudW1iZXI7XG59O1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdE9wdGlvbnM6IFNub3dmYWxsT3B0aW9ucyA9IHtcbiAgICBtYXhDb3VudDogMjAwLFxuICAgIGdyYXZpdHk6IDAuMDUsXG4gICAgbWF4RHJpZnQ6IDUsXG59O1xuXG5jb25zdCBLRVlfRlJBTUVfSU5URVJWQUwgPSAxNTsgLy8gMTVtcywgcm91Z2hseVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbm93ZmFsbCBpbXBsZW1lbnRzIElDYW52YXNFZmZlY3Qge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU25vd2ZhbGxPcHRpb25zO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0geyAuLi5EZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBwYXJ0aWNsZXM6IEFycmF5PFNub3dmbGFrZT4gPSBbXTtcbiAgICBwcml2YXRlIGxhc3RBbmltYXRpb25UaW1lID0gMDtcblxuICAgIHB1YmxpYyBpc1J1bm5pbmcgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGFydCA9IGFzeW5jIChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCB0aW1lb3V0ID0gMzAwMCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoIWNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIHRoaXMucGFydGljbGVzID0gW107XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5vcHRpb25zLm1heENvdW50O1xuICAgICAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFydGljbGVzLnB1c2godGhpcy5yZXNldFBhcnRpY2xlKHt9IGFzIFNub3dmbGFrZSwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXJMb29wKTtcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc3RvcCwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHN0b3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVzZXRQYXJ0aWNsZSA9IChwYXJ0aWNsZTogU25vd2ZsYWtlLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFNub3dmbGFrZSA9PiB7XG4gICAgICAgIHBhcnRpY2xlLnggPSBNYXRoLnJhbmRvbSgpICogd2lkdGg7XG4gICAgICAgIHBhcnRpY2xlLnkgPSBNYXRoLnJhbmRvbSgpICogLWhlaWdodDtcbiAgICAgICAgcGFydGljbGUueENvbCA9IHBhcnRpY2xlLng7XG4gICAgICAgIHBhcnRpY2xlLmRpYW1ldGVyID0gTWF0aC5yYW5kb20oKSAqIDcgKyA0O1xuICAgICAgICBwYXJ0aWNsZS5tYXhpbXVtRHJpZnQgPSBNYXRoLnJhbmRvbSgpICogdGhpcy5vcHRpb25zLm1heERyaWZ0ICsgMy41O1xuICAgICAgICBwYXJ0aWNsZS5ncmF2aXR5ID0gdGhpcy5vcHRpb25zLmdyYXZpdHkgKyBNYXRoLnJhbmRvbSgpICogNiArIDQ7XG4gICAgICAgIHJldHVybiBwYXJ0aWNsZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZW5kZXJMb29wID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCB8fCAhdGhpcy5jb250ZXh0LmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBhcnRpY2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCwgdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGltZURlbHRhID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEFuaW1hdGlvblRpbWU7XG4gICAgICAgICAgICBpZiAodGltZURlbHRhID49IEtFWV9GUkFNRV9JTlRFUlZBTCB8fCAhdGhpcy5sYXN0QW5pbWF0aW9uVGltZSkge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzY3JlZW4gZmlyc3RcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsIHRoaXMuY29udGV4dC5jYW52YXMuaGVpZ2h0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEFuaW1hdGlvblRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZUFuZFJlbmRlclNub3dmbGFrZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3ApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYW5pbWF0ZUFuZFJlbmRlclNub3dmbGFrZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0IHx8ICF0aGlzLmNvbnRleHQuY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQ7XG4gICAgICAgIGZvciAoY29uc3QgcGFydGljbGUgb2YgYXJyYXlGYXN0Q2xvbmUodGhpcy5wYXJ0aWNsZXMpKSB7XG4gICAgICAgICAgICBwYXJ0aWNsZS55ICs9IHBhcnRpY2xlLmdyYXZpdHk7XG5cbiAgICAgICAgICAgIC8vIFdlIHRyZWF0IHRoZSBkcmlmdCBhcyBhIHNpbmUgZnVuY3Rpb24gdG8gaGF2ZSBhIG1vcmUgZmx1aWQtbGlrZSBtb3ZlbWVudCBpbnN0ZWFkXG4gICAgICAgICAgICAvLyBvZiBhIHBvbmctbGlrZSBtb3ZlbWVudCBvZmYgd2FsbHMgb2YgdGhlIFggY29sdW1uLiBUaGlzIG1lYW5zIHRoYXQgZm9yXG4gICAgICAgICAgICAvLyAkeD1BXFxzaW4oXFxmcmFjezJcXHBpfXtQfXkpJCB3ZSB1c2UgdGhlIGBtYXhpbXVtRHJpZnRgIGFzIHRoZSBhbXBsaXR1ZGUgKEEpIGFuZCBhXG4gICAgICAgICAgICAvLyBsYXJnZSBtdWx0aXBsaWVyIHRvIGNyZWF0ZSBhIHZlcnkgbG9uZyB3YXZlZm9ybSB0aHJvdWdoIFAuXG4gICAgICAgICAgICBjb25zdCBwZWFrRGlzdGFuY2UgPSA3NSAqIHBhcnRpY2xlLm1heGltdW1EcmlmdDtcbiAgICAgICAgICAgIGNvbnN0IFBJMiA9IE1hdGguUEkgKiAyO1xuICAgICAgICAgICAgcGFydGljbGUueCA9IHBhcnRpY2xlLm1heGltdW1EcmlmdCAqIE1hdGguc2luKChQSTIgLyBwZWFrRGlzdGFuY2UpICogcGFydGljbGUueSk7XG4gICAgICAgICAgICBwYXJ0aWNsZS54ICs9IHBhcnRpY2xlLnhDb2w7IC8vIGJyaW5nIHRoZSBwYXJ0aWNsZSB0byB0aGUgcmlnaHQgcGxhY2VcblxuICAgICAgICAgICAgY29uc3QgcmFkaXVzID0gcGFydGljbGUuZGlhbWV0ZXIgLyAyO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5lbGxpcHNlKHBhcnRpY2xlLngsIHBhcnRpY2xlLnksIHJhZGl1cywgcmFkaXVzLCAwLCAwLCAzNjApO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxTdHlsZSA9IFwiI2VhZWFlYVwiOyAvLyBncmV5IHNvIGl0IHNob3dzIHVwIG9uIHRoZSBsaWdodCB0aGVtZVxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbGwoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZGVhZCBzbm93Zmxha2VzXG4gICAgICAgICAgICBjb25zdCBtYXhCb3VuZHMgPSByYWRpdXMgKiA0OyAvLyBtYWtlIHN1cmUgaXQncyAqcmVhbGx5KiBvZmYgc2NyZWVuXG4gICAgICAgICAgICBpZiAocGFydGljbGUueSA+IGhlaWdodCArIG1heEJvdW5kcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRoaXMucGFydGljbGVzLmluZGV4T2YocGFydGljbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFydGljbGVzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUFvRCxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FB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