matrix-react-sdk
Version:
SDK for matrix.org using React
93 lines (86 loc) • 11.8 kB
JavaScript
;
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=