UNPKG

matrix-react-sdk

Version:
93 lines (86 loc) 11.8 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 _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var _isLocalRoom = require("../utils/localRoom/isLocalRoom"); var _Timer = _interopRequireDefault(require("../utils/Timer")); /* Copyright 2024 New Vector Ltd. Copyright 2019-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 TYPING_USER_TIMEOUT = 10000; const TYPING_SERVER_TIMEOUT = 30000; /** * Tracks typing state for users. */ class TypingStore { constructor(context) { (0, _defineProperty2.default)(this, "typingStates", {}); this.context = context; this.reset(); } /** * Clears all cached typing states. Intended to be called when the * MatrixClientPeg client changes. */ reset() { this.typingStates = { // "roomId": { // isTyping: bool, // Whether the user is typing or not // userTimer: Timer, // Local timeout for "user has stopped typing" // serverTimer: Timer, // Maximum timeout for the typing state // }, }; } /** * Changes the typing status for the MatrixClientPeg user. * @param {string} roomId The room ID to set the typing state in. * @param {boolean} isTyping Whether the user is typing or not. */ setSelfTyping(roomId, threadId, isTyping) { // No typing notifications for local rooms if ((0, _isLocalRoom.isLocalRoom)(roomId)) return; if (!_SettingsStore.default.getValue("sendTypingNotifications")) return; if (_SettingsStore.default.getValue("lowBandwidth")) return; // Disable typing notification for threads for the initial launch // before we figure out a better user experience for them if (threadId) return; let currentTyping = this.typingStates[roomId]; if (!isTyping && !currentTyping || currentTyping?.isTyping === isTyping) { // No change in state, so don't do anything. We'll let the timer run its course. return; } if (!currentTyping) { currentTyping = this.typingStates[roomId] = { isTyping: isTyping, serverTimer: new _Timer.default(TYPING_SERVER_TIMEOUT), userTimer: new _Timer.default(TYPING_USER_TIMEOUT) }; } currentTyping.isTyping = isTyping; if (isTyping) { if (!currentTyping.serverTimer.isRunning()) { currentTyping.serverTimer.restart().finished().then(() => { const currentTyping = this.typingStates[roomId]; if (currentTyping) currentTyping.isTyping = false; // The server will (should) time us out on typing, so we don't // need to advertise a stop of typing. }); } else currentTyping.serverTimer.restart(); if (!currentTyping.userTimer.isRunning()) { currentTyping.userTimer.restart().finished().then(() => { this.setSelfTyping(roomId, threadId, false); }); } else currentTyping.userTimer.restart(); } this.context.client?.sendTyping(roomId, isTyping, TYPING_SERVER_TIMEOUT); } } exports.default = TypingStore; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU2V0dGluZ3NTdG9yZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2lzTG9jYWxSb29tIiwiX1RpbWVyIiwiVFlQSU5HX1VTRVJfVElNRU9VVCIsIlRZUElOR19TRVJWRVJfVElNRU9VVCIsIlR5cGluZ1N0b3JlIiwiY29uc3RydWN0b3IiLCJjb250ZXh0IiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJyZXNldCIsInR5cGluZ1N0YXRlcyIsInNldFNlbGZUeXBpbmciLCJyb29tSWQiLCJ0aHJlYWRJZCIsImlzVHlwaW5nIiwiaXNMb2NhbFJvb20iLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJjdXJyZW50VHlwaW5nIiwic2VydmVyVGltZXIiLCJUaW1lciIsInVzZXJUaW1lciIsImlzUnVubmluZyIsInJlc3RhcnQiLCJmaW5pc2hlZCIsInRoZW4iLCJjbGllbnQiLCJzZW5kVHlwaW5nIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yZXMvVHlwaW5nU3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBTZGtDb250ZXh0Q2xhc3MgfSBmcm9tIFwiLi4vY29udGV4dHMvU0RLQ29udGV4dFwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7IGlzTG9jYWxSb29tIH0gZnJvbSBcIi4uL3V0aWxzL2xvY2FsUm9vbS9pc0xvY2FsUm9vbVwiO1xuaW1wb3J0IFRpbWVyIGZyb20gXCIuLi91dGlscy9UaW1lclwiO1xuXG5jb25zdCBUWVBJTkdfVVNFUl9USU1FT1VUID0gMTAwMDA7XG5jb25zdCBUWVBJTkdfU0VSVkVSX1RJTUVPVVQgPSAzMDAwMDtcblxuLyoqXG4gKiBUcmFja3MgdHlwaW5nIHN0YXRlIGZvciB1c2Vycy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwaW5nU3RvcmUge1xuICAgIHByaXZhdGUgdHlwaW5nU3RhdGVzOiB7XG4gICAgICAgIFtyb29tSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIGlzVHlwaW5nOiBib29sZWFuO1xuICAgICAgICAgICAgdXNlclRpbWVyOiBUaW1lcjtcbiAgICAgICAgICAgIHNlcnZlclRpbWVyOiBUaW1lcjtcbiAgICAgICAgfTtcbiAgICB9ID0ge307XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBTZGtDb250ZXh0Q2xhc3MpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgY2FjaGVkIHR5cGluZyBzdGF0ZXMuIEludGVuZGVkIHRvIGJlIGNhbGxlZCB3aGVuIHRoZVxuICAgICAqIE1hdHJpeENsaWVudFBlZyBjbGllbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHlwaW5nU3RhdGVzID0ge1xuICAgICAgICAgICAgLy8gXCJyb29tSWRcIjoge1xuICAgICAgICAgICAgLy8gICAgIGlzVHlwaW5nOiBib29sLCAgICAgLy8gV2hldGhlciB0aGUgdXNlciBpcyB0eXBpbmcgb3Igbm90XG4gICAgICAgICAgICAvLyAgICAgdXNlclRpbWVyOiBUaW1lciwgICAvLyBMb2NhbCB0aW1lb3V0IGZvciBcInVzZXIgaGFzIHN0b3BwZWQgdHlwaW5nXCJcbiAgICAgICAgICAgIC8vICAgICBzZXJ2ZXJUaW1lcjogVGltZXIsIC8vIE1heGltdW0gdGltZW91dCBmb3IgdGhlIHR5cGluZyBzdGF0ZVxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHRoZSB0eXBpbmcgc3RhdHVzIGZvciB0aGUgTWF0cml4Q2xpZW50UGVnIHVzZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJvb21JZCBUaGUgcm9vbSBJRCB0byBzZXQgdGhlIHR5cGluZyBzdGF0ZSBpbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzVHlwaW5nIFdoZXRoZXIgdGhlIHVzZXIgaXMgdHlwaW5nIG9yIG5vdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZlR5cGluZyhyb29tSWQ6IHN0cmluZywgdGhyZWFkSWQ6IHN0cmluZyB8IG51bGwsIGlzVHlwaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIC8vIE5vIHR5cGluZyBub3RpZmljYXRpb25zIGZvciBsb2NhbCByb29tc1xuICAgICAgICBpZiAoaXNMb2NhbFJvb20ocm9vbUlkKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcInNlbmRUeXBpbmdOb3RpZmljYXRpb25zXCIpKSByZXR1cm47XG4gICAgICAgIGlmIChTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwibG93QmFuZHdpZHRoXCIpKSByZXR1cm47XG4gICAgICAgIC8vIERpc2FibGUgdHlwaW5nIG5vdGlmaWNhdGlvbiBmb3IgdGhyZWFkcyBmb3IgdGhlIGluaXRpYWwgbGF1bmNoXG4gICAgICAgIC8vIGJlZm9yZSB3ZSBmaWd1cmUgb3V0IGEgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZSBmb3IgdGhlbVxuICAgICAgICBpZiAodGhyZWFkSWQpIHJldHVybjtcblxuICAgICAgICBsZXQgY3VycmVudFR5cGluZyA9IHRoaXMudHlwaW5nU3RhdGVzW3Jvb21JZF07XG4gICAgICAgIGlmICgoIWlzVHlwaW5nICYmICFjdXJyZW50VHlwaW5nKSB8fCBjdXJyZW50VHlwaW5nPy5pc1R5cGluZyA9PT0gaXNUeXBpbmcpIHtcbiAgICAgICAgICAgIC8vIE5vIGNoYW5nZSBpbiBzdGF0ZSwgc28gZG9uJ3QgZG8gYW55dGhpbmcuIFdlJ2xsIGxldCB0aGUgdGltZXIgcnVuIGl0cyBjb3Vyc2UuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWN1cnJlbnRUeXBpbmcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRUeXBpbmcgPSB0aGlzLnR5cGluZ1N0YXRlc1tyb29tSWRdID0ge1xuICAgICAgICAgICAgICAgIGlzVHlwaW5nOiBpc1R5cGluZyxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJUaW1lcjogbmV3IFRpbWVyKFRZUElOR19TRVJWRVJfVElNRU9VVCksXG4gICAgICAgICAgICAgICAgdXNlclRpbWVyOiBuZXcgVGltZXIoVFlQSU5HX1VTRVJfVElNRU9VVCksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFR5cGluZy5pc1R5cGluZyA9IGlzVHlwaW5nO1xuXG4gICAgICAgIGlmIChpc1R5cGluZykge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50VHlwaW5nLnNlcnZlclRpbWVyLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFR5cGluZy5zZXJ2ZXJUaW1lclxuICAgICAgICAgICAgICAgICAgICAucmVzdGFydCgpXG4gICAgICAgICAgICAgICAgICAgIC5maW5pc2hlZCgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUeXBpbmcgPSB0aGlzLnR5cGluZ1N0YXRlc1tyb29tSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUeXBpbmcpIGN1cnJlbnRUeXBpbmcuaXNUeXBpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciB3aWxsIChzaG91bGQpIHRpbWUgdXMgb3V0IG9uIHR5cGluZywgc28gd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWR2ZXJ0aXNlIGEgc3RvcCBvZiB0eXBpbmcuXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGN1cnJlbnRUeXBpbmcuc2VydmVyVGltZXIucmVzdGFydCgpO1xuXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRUeXBpbmcudXNlclRpbWVyLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFR5cGluZy51c2VyVGltZXJcbiAgICAgICAgICAgICAgICAgICAgLnJlc3RhcnQoKVxuICAgICAgICAgICAgICAgICAgICAuZmluaXNoZWQoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGZUeXBpbmcocm9vbUlkLCB0aHJlYWRJZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBjdXJyZW50VHlwaW5nLnVzZXJUaW1lci5yZXN0YXJ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRleHQuY2xpZW50Py5zZW5kVHlwaW5nKHJvb21JZCwgaXNUeXBpbmcsIFRZUElOR19TRVJWRVJfVElNRU9VVCk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQU9BLE1BQU1HLG1CQUFtQixHQUFHLEtBQUs7QUFDakMsTUFBTUMscUJBQXFCLEdBQUcsS0FBSzs7QUFFbkM7QUFDQTtBQUNBO0FBQ2UsTUFBTUMsV0FBVyxDQUFDO0VBU3RCQyxXQUFXQSxDQUFrQkMsT0FBd0IsRUFBRTtJQUFBLElBQUFDLGdCQUFBLENBQUFDLE9BQUEsd0JBRjFELENBQUMsQ0FBQztJQUFBLEtBRThCRixPQUF3QixHQUF4QkEsT0FBd0I7SUFDeEQsSUFBSSxDQUFDRyxLQUFLLENBQUMsQ0FBQztFQUNoQjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtFQUNXQSxLQUFLQSxDQUFBLEVBQVM7SUFDakIsSUFBSSxDQUFDQyxZQUFZLEdBQUc7TUFDaEI7TUFDQTtNQUNBO01BQ0E7TUFDQTtJQUFBLENBQ0g7RUFDTDs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ1dDLGFBQWFBLENBQUNDLE1BQWMsRUFBRUMsUUFBdUIsRUFBRUMsUUFBaUIsRUFBUTtJQUNuRjtJQUNBLElBQUksSUFBQUMsd0JBQVcsRUFBQ0gsTUFBTSxDQUFDLEVBQUU7SUFFekIsSUFBSSxDQUFDSSxzQkFBYSxDQUFDQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRTtJQUN4RCxJQUFJRCxzQkFBYSxDQUFDQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUU7SUFDNUM7SUFDQTtJQUNBLElBQUlKLFFBQVEsRUFBRTtJQUVkLElBQUlLLGFBQWEsR0FBRyxJQUFJLENBQUNSLFlBQVksQ0FBQ0UsTUFBTSxDQUFDO0lBQzdDLElBQUssQ0FBQ0UsUUFBUSxJQUFJLENBQUNJLGFBQWEsSUFBS0EsYUFBYSxFQUFFSixRQUFRLEtBQUtBLFFBQVEsRUFBRTtNQUN2RTtNQUNBO0lBQ0o7SUFFQSxJQUFJLENBQUNJLGFBQWEsRUFBRTtNQUNoQkEsYUFBYSxHQUFHLElBQUksQ0FBQ1IsWUFBWSxDQUFDRSxNQUFNLENBQUMsR0FBRztRQUN4Q0UsUUFBUSxFQUFFQSxRQUFRO1FBQ2xCSyxXQUFXLEVBQUUsSUFBSUMsY0FBSyxDQUFDakIscUJBQXFCLENBQUM7UUFDN0NrQixTQUFTLEVBQUUsSUFBSUQsY0FBSyxDQUFDbEIsbUJBQW1CO01BQzVDLENBQUM7SUFDTDtJQUVBZ0IsYUFBYSxDQUFDSixRQUFRLEdBQUdBLFFBQVE7SUFFakMsSUFBSUEsUUFBUSxFQUFFO01BQ1YsSUFBSSxDQUFDSSxhQUFhLENBQUNDLFdBQVcsQ0FBQ0csU0FBUyxDQUFDLENBQUMsRUFBRTtRQUN4Q0osYUFBYSxDQUFDQyxXQUFXLENBQ3BCSSxPQUFPLENBQUMsQ0FBQyxDQUNUQyxRQUFRLENBQUMsQ0FBQyxDQUNWQyxJQUFJLENBQUMsTUFBTTtVQUNSLE1BQU1QLGFBQWEsR0FBRyxJQUFJLENBQUNSLFlBQVksQ0FBQ0UsTUFBTSxDQUFDO1VBQy9DLElBQUlNLGFBQWEsRUFBRUEsYUFBYSxDQUFDSixRQUFRLEdBQUcsS0FBSzs7VUFFakQ7VUFDQTtRQUNKLENBQUMsQ0FBQztNQUNWLENBQUMsTUFBTUksYUFBYSxDQUFDQyxXQUFXLENBQUNJLE9BQU8sQ0FBQyxDQUFDO01BRTFDLElBQUksQ0FBQ0wsYUFBYSxDQUFDRyxTQUFTLENBQUNDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7UUFDdENKLGFBQWEsQ0FBQ0csU0FBUyxDQUNsQkUsT0FBTyxDQUFDLENBQUMsQ0FDVEMsUUFBUSxDQUFDLENBQUMsQ0FDVkMsSUFBSSxDQUFDLE1BQU07VUFDUixJQUFJLENBQUNkLGFBQWEsQ0FBQ0MsTUFBTSxFQUFFQyxRQUFRLEVBQUUsS0FBSyxDQUFDO1FBQy9DLENBQUMsQ0FBQztNQUNWLENBQUMsTUFBTUssYUFBYSxDQUFDRyxTQUFTLENBQUNFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDO0lBRUEsSUFBSSxDQUFDakIsT0FBTyxDQUFDb0IsTUFBTSxFQUFFQyxVQUFVLENBQUNmLE1BQU0sRUFBRUUsUUFBUSxFQUFFWCxxQkFBcUIsQ0FBQztFQUM1RTtBQUNKO0FBQUN5QixPQUFBLENBQUFwQixPQUFBLEdBQUFKLFdBQUEiLCJpZ25vcmVMaXN0IjpbXX0=