matrix-react-sdk
Version:
SDK for matrix.org using React
103 lines (100 loc) • 16.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _logger = require("matrix-js-sdk/src/logger");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _effects = require("../../../effects");
var _UIStore = _interopRequireWildcard(require("../../../stores/UIStore"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /*
Copyright 2024 New Vector Ltd.
Copyright 2020 Nurjin Jafar
Copyright 2020 Nordeck IT + Consulting GmbH.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const EffectsOverlay = ({
roomWidth
}) => {
const canvasRef = (0, _react.useRef)(null);
const effectsRef = (0, _react.useRef)(new Map());
const lazyLoadEffectModule = async name => {
if (!name) return null;
let effect = effectsRef.current.get(name) || null;
if (effect === null) {
const options = _effects.CHAT_EFFECTS.find(e => e.command === name)?.options;
try {
const {
default: Effect
} = await (specifier => new Promise(r => r(specifier)).then(s => _interopRequireWildcard(require(s))))(`../../../effects/${name}`);
effect = new Effect(options);
effectsRef.current.set(name, effect);
} catch (err) {
_logger.logger.warn(`Unable to load effect module at '../../../effects/${name}.`, err);
}
}
return effect;
};
(0, _react.useEffect)(() => {
const resize = () => {
if (canvasRef.current && canvasRef.current?.height !== _UIStore.default.instance.windowHeight) {
canvasRef.current.height = _UIStore.default.instance.windowHeight;
}
};
const onAction = payload => {
const actionPrefix = "effects.";
const isOutdated = isEventOutdated(payload.event);
if (canvasRef.current && payload.action.startsWith(actionPrefix) && !isOutdated) {
const effect = payload.action.slice(actionPrefix.length);
lazyLoadEffectModule(effect).then(module => module?.start(canvasRef.current));
}
};
const dispatcherRef = _dispatcher.default.register(onAction);
const canvas = canvasRef.current;
if (canvas) canvas.height = _UIStore.default.instance.windowHeight;
_UIStore.default.instance.on(_UIStore.UI_EVENTS.Resize, resize);
return () => {
_dispatcher.default.unregister(dispatcherRef);
_UIStore.default.instance.off(_UIStore.UI_EVENTS.Resize, resize);
// eslint-disable-next-line react-hooks/exhaustive-deps
const currentEffects = effectsRef.current; // this is not a react node ref, warning can be safely ignored
for (const effect in currentEffects) {
const effectModule = currentEffects.get(effect);
if (effectModule && effectModule.isRunning) {
effectModule.stop();
}
}
};
}, []);
return /*#__PURE__*/_react.default.createElement("canvas", {
ref: canvasRef,
width: roomWidth,
style: {
display: "block",
zIndex: 999999,
pointerEvents: "none",
position: "fixed",
top: 0,
right: 0
},
"aria-hidden": true
});
};
var _default = exports.default = EffectsOverlay; // 48 hours
// 48h * 60m * 60s * 1000ms
const OUTDATED_EVENT_THRESHOLD = 48 * 60 * 60 * 1000;
/**
* Return true if the event is older than 48h.
* @param event
*/
function isEventOutdated(event) {
if (!event) return false;
const nowTs = Date.now();
const eventTs = event.getTs();
return nowTs - eventTs > OUTDATED_EVENT_THRESHOLD;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2Rpc3BhdGNoZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2VmZmVjdHMiLCJfVUlTdG9yZSIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkVmZmVjdHNPdmVybGF5Iiwicm9vbVdpZHRoIiwiY2FudmFzUmVmIiwidXNlUmVmIiwiZWZmZWN0c1JlZiIsIk1hcCIsImxhenlMb2FkRWZmZWN0TW9kdWxlIiwibmFtZSIsImVmZmVjdCIsImN1cnJlbnQiLCJvcHRpb25zIiwiQ0hBVF9FRkZFQ1RTIiwiZmluZCIsImNvbW1hbmQiLCJFZmZlY3QiLCJzcGVjaWZpZXIiLCJQcm9taXNlIiwidGhlbiIsInMiLCJlcnIiLCJsb2dnZXIiLCJ3YXJuIiwidXNlRWZmZWN0IiwicmVzaXplIiwiaGVpZ2h0IiwiVUlTdG9yZSIsImluc3RhbmNlIiwid2luZG93SGVpZ2h0Iiwib25BY3Rpb24iLCJwYXlsb2FkIiwiYWN0aW9uUHJlZml4IiwiaXNPdXRkYXRlZCIsImlzRXZlbnRPdXRkYXRlZCIsImV2ZW50IiwiYWN0aW9uIiwic3RhcnRzV2l0aCIsInNsaWNlIiwibGVuZ3RoIiwibW9kdWxlIiwic3RhcnQiLCJkaXNwYXRjaGVyUmVmIiwiZGlzIiwicmVnaXN0ZXIiLCJjYW52YXMiLCJvbiIsIlVJX0VWRU5UUyIsIlJlc2l6ZSIsInVucmVnaXN0ZXIiLCJvZmYiLCJjdXJyZW50RWZmZWN0cyIsImVmZmVjdE1vZHVsZSIsImlzUnVubmluZyIsInN0b3AiLCJjcmVhdGVFbGVtZW50IiwicmVmIiwid2lkdGgiLCJzdHlsZSIsImRpc3BsYXkiLCJ6SW5kZXgiLCJwb2ludGVyRXZlbnRzIiwicG9zaXRpb24iLCJ0b3AiLCJyaWdodCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIk9VVERBVEVEX0VWRU5UX1RIUkVTSE9MRCIsIm5vd1RzIiwiRGF0ZSIsIm5vdyIsImV2ZW50VHMiLCJnZXRUcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0VmZmVjdHNPdmVybGF5LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCBOdXJqaW4gSmFmYXJcbkNvcHlyaWdodCAyMDIwIE5vcmRlY2sgSVQgKyBDb25zdWx0aW5nIEdtYkguXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiAqL1xuaW1wb3J0IFJlYWN0LCB7IEZ1bmN0aW9uQ29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IElDYW52YXNFZmZlY3QgZnJvbSBcIi4uLy4uLy4uL2VmZmVjdHMvSUNhbnZhc0VmZmVjdFwiO1xuaW1wb3J0IHsgQ0hBVF9FRkZFQ1RTIH0gZnJvbSBcIi4uLy4uLy4uL2VmZmVjdHNcIjtcbmltcG9ydCBVSVN0b3JlLCB7IFVJX0VWRU5UUyB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvVUlTdG9yZVwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICByb29tV2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgRWZmZWN0c092ZXJsYXk6IEZ1bmN0aW9uQ29tcG9uZW50PElQcm9wcz4gPSAoeyByb29tV2lkdGggfSkgPT4ge1xuICAgIGNvbnN0IGNhbnZhc1JlZiA9IHVzZVJlZjxIVE1MQ2FudmFzRWxlbWVudD4obnVsbCk7XG4gICAgY29uc3QgZWZmZWN0c1JlZiA9IHVzZVJlZjxNYXA8c3RyaW5nLCBJQ2FudmFzRWZmZWN0Pj4obmV3IE1hcDxzdHJpbmcsIElDYW52YXNFZmZlY3Q+KCkpO1xuXG4gICAgY29uc3QgbGF6eUxvYWRFZmZlY3RNb2R1bGUgPSBhc3luYyAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxJQ2FudmFzRWZmZWN0IHwgbnVsbD4gPT4ge1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZWZmZWN0OiBJQ2FudmFzRWZmZWN0IHwgbnVsbCA9IGVmZmVjdHNSZWYuY3VycmVudC5nZXQobmFtZSkgfHwgbnVsbDtcbiAgICAgICAgaWYgKGVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IENIQVRfRUZGRUNUUy5maW5kKChlKSA9PiBlLmNvbW1hbmQgPT09IG5hbWUpPy5vcHRpb25zO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRlZmF1bHQ6IEVmZmVjdCB9ID0gYXdhaXQgaW1wb3J0KGAuLi8uLi8uLi9lZmZlY3RzLyR7bmFtZX1gKTtcbiAgICAgICAgICAgICAgICBlZmZlY3QgPSBuZXcgRWZmZWN0KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGVmZmVjdHNSZWYuY3VycmVudC5zZXQobmFtZSwgZWZmZWN0ISk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIGxvYWQgZWZmZWN0IG1vZHVsZSBhdCAnLi4vLi4vLi4vZWZmZWN0cy8ke25hbWV9LmAsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVmZmVjdDtcbiAgICB9O1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbnZhc1JlZi5jdXJyZW50ICYmIGNhbnZhc1JlZi5jdXJyZW50Py5oZWlnaHQgIT09IFVJU3RvcmUuaW5zdGFuY2Uud2luZG93SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY2FudmFzUmVmLmN1cnJlbnQuaGVpZ2h0ID0gVUlTdG9yZS5pbnN0YW5jZS53aW5kb3dIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG9uQWN0aW9uID0gKHBheWxvYWQ6IHsgYWN0aW9uOiBzdHJpbmc7IGV2ZW50PzogTWF0cml4RXZlbnQgfSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uUHJlZml4ID0gXCJlZmZlY3RzLlwiO1xuICAgICAgICAgICAgY29uc3QgaXNPdXRkYXRlZCA9IGlzRXZlbnRPdXRkYXRlZChwYXlsb2FkLmV2ZW50KTtcbiAgICAgICAgICAgIGlmIChjYW52YXNSZWYuY3VycmVudCAmJiBwYXlsb2FkLmFjdGlvbi5zdGFydHNXaXRoKGFjdGlvblByZWZpeCkgJiYgIWlzT3V0ZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3QgPSBwYXlsb2FkLmFjdGlvbi5zbGljZShhY3Rpb25QcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsYXp5TG9hZEVmZmVjdE1vZHVsZShlZmZlY3QpLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlPy5zdGFydChjYW52YXNSZWYuY3VycmVudCEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlclJlZiA9IGRpcy5yZWdpc3RlcihvbkFjdGlvbik7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgICAgICBpZiAoY2FudmFzKSBjYW52YXMuaGVpZ2h0ID0gVUlTdG9yZS5pbnN0YW5jZS53aW5kb3dIZWlnaHQ7XG4gICAgICAgIFVJU3RvcmUuaW5zdGFuY2Uub24oVUlfRVZFTlRTLlJlc2l6ZSwgcmVzaXplKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgZGlzLnVucmVnaXN0ZXIoZGlzcGF0Y2hlclJlZik7XG4gICAgICAgICAgICBVSVN0b3JlLmluc3RhbmNlLm9mZihVSV9FVkVOVFMuUmVzaXplLCByZXNpemUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEVmZmVjdHMgPSBlZmZlY3RzUmVmLmN1cnJlbnQ7IC8vIHRoaXMgaXMgbm90IGEgcmVhY3Qgbm9kZSByZWYsIHdhcm5pbmcgY2FuIGJlIHNhZmVseSBpZ25vcmVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVmZmVjdCBpbiBjdXJyZW50RWZmZWN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdE1vZHVsZTogSUNhbnZhc0VmZmVjdCA9IGN1cnJlbnRFZmZlY3RzLmdldChlZmZlY3QpITtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0TW9kdWxlICYmIGVmZmVjdE1vZHVsZS5pc1J1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0TW9kdWxlLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPGNhbnZhc1xuICAgICAgICAgICAgcmVmPXtjYW52YXNSZWZ9XG4gICAgICAgICAgICB3aWR0aD17cm9vbVdpZHRofVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICAgICAgICAgICAgekluZGV4OiA5OTk5OTksXG4gICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgYXJpYS1oaWRkZW49e3RydWV9XG4gICAgICAgIC8+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVmZmVjdHNPdmVybGF5O1xuXG4vLyA0OCBob3Vyc1xuLy8gNDhoICogNjBtICogNjBzICogMTAwMG1zXG5jb25zdCBPVVREQVRFRF9FVkVOVF9USFJFU0hPTEQgPSA0OCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBldmVudCBpcyBvbGRlciB0aGFuIDQ4aC5cbiAqIEBwYXJhbSBldmVudFxuICovXG5mdW5jdGlvbiBpc0V2ZW50T3V0ZGF0ZWQoZXZlbnQ/OiBNYXRyaXhFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghZXZlbnQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IG5vd1RzID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBldmVudFRzID0gZXZlbnQuZ2V0VHMoKTtcbiAgICByZXR1cm4gbm93VHMgLSBldmVudFRzID4gT1VUREFURURfRVZFTlRfVEhSRVNIT0xEO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBR0EsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksUUFBQSxHQUFBSixPQUFBO0FBQ0Es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LENBQUNDLFFBQVEsQ0FBQ2tCLEVBQUUsQ0FBQ0Msa0JBQVMsQ0FBQ0MsTUFBTSxFQUFFdkIsTUFBTSxDQUFDO0lBRTdDLE9BQU8sTUFBTTtNQUNUa0IsbUJBQUcsQ0FBQ00sVUFBVSxDQUFDUCxhQUFhLENBQUM7TUFDN0JmLGdCQUFPLENBQUNDLFFBQVEsQ0FBQ3NCLEdBQUcsQ0FBQ0gsa0JBQVMsQ0FBQ0MsTUFBTSxFQUFFdkIsTUFBTSxDQUFDO01BQzlDO01BQ0EsTUFBTTBCLGNBQWMsR0FBRzdDLFVBQVUsQ0FBQ0ssT0FBTyxDQUFDLENBQUM7TUFDM0MsS0FBSyxNQUFNRCxNQUFNLElBQUl5QyxjQUFjLEVBQUU7UUFDakMsTUFBTUMsWUFBMkIsR0FBR0QsY0FBYyxDQUFDN0QsR0FBRyxDQUFDb0IsTUFBTSxDQUFFO1FBQy9ELElBQUkwQyxZQUFZLElBQUlBLFlBQVksQ0FBQ0MsU0FBUyxFQUFFO1VBQ3hDRCxZQUFZLENBQUNFLElBQUksQ0FBQyxDQUFDO1FBQ3ZCO01BQ0o7SUFDSixDQUFDO0VBQ0wsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUVOLG9CQUNJaEYsTUFBQSxDQUFBYyxPQUFBLENBQUFtRSxhQUFBO0lBQ0lDLEdBQUcsRUFBRXBELFNBQVU7SUFDZnFELEtBQUssRUFBRXRELFNBQVU7SUFDakJ1RCxLQUFLLEVBQUU7TUFDSEMsT0FBTyxFQUFFLE9BQU87TUFDaEJDLE1BQU0sRUFBRSxNQUFNO01BQ2RDLGFBQWEsRUFBRSxNQUFNO01BQ3JCQyxRQUFRLEVBQUUsT0FBTztNQUNqQkMsR0FBRyxFQUFFLENBQUM7TUFDTkMsS0FBSyxFQUFFO0lBQ1gsQ0FBRTtJQUNGLGVBQWE7RUFBSyxDQUNyQixDQUFDO0FBRVYsQ0FBQztBQUFDLElBQUFDLFFBQUEsR0FBQUMsT0FBQSxDQUFBOUUsT0FBQSxHQUVhYyxjQUFjLEVBRTdCO0FBQ0E7QUFDQSxNQUFNaUUsd0JBQXdCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTakMsZUFBZUEsQ0FBQ0MsS0FBbUIsRUFBVztFQUNuRCxJQUFJLENBQUNBLEtBQUssRUFBRSxPQUFPLEtBQUs7RUFFeEIsTUFBTWlDLEtBQUssR0FBR0MsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQztFQUN4QixNQUFNQyxPQUFPLEdBQUdwQyxLQUFLLENBQUNxQyxLQUFLLENBQUMsQ0FBQztFQUM3QixPQUFPSixLQUFLLEdBQUdHLE9BQU8sR0FBR0osd0JBQXdCO0FBQ3JEIiwiaWdub3JlTGlzdCI6W119