diff --git a/.eslintrc.js b/.eslintrc.js index eb23d3872c..7c640ab03f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,16 +3,31 @@ module.exports = { "browser": true, "es6": true }, - "extends": "eslint:recommended", + "extends": [ + "eslint:recommended", + // "plugin:@typescript-eslint/recommended", + // "plugin:@typescript-eslint/recommended-requiring-type-checking" + ], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], "parserOptions": { "ecmaVersion": 2020, - "sourceType": "module" + "sourceType": "module", + "project": "./tsconfig.json" }, "rules": { + "semi": "error", + "quotes": "error", "no-console": "off", "no-empty": "off", "no-prototype-builtins": "off", - "no-unused-vars": "warn" + "no-unused-vars": "warn", + "quote-props": ["warn", "consistent"], + "no-multi-spaces": ["warn", { "ignoreEOLComments": true }], + "@typescript-eslint/no-unused-vars": "warn" + // "@typescript-eslint/no-misused-promises": "error", + // "@typescript-eslint/no-floating-promises": 2, + // "@typescript-eslint/explicit-function-return-type": "error" }, "globals": { "DEFINE_VERSION": "readonly", diff --git a/.ts-eslintrc.js b/.ts-eslintrc.js deleted file mode 100644 index ae7233ed83..0000000000 --- a/.ts-eslintrc.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - root: true, - env: { - "browser": true, - "es6": true - }, - extends: [ - // "plugin:@typescript-eslint/recommended", - // "plugin:@typescript-eslint/recommended-requiring-type-checking", - ], - parser: '@typescript-eslint/parser', - parserOptions: { - "ecmaVersion": 2020, - "sourceType": "module", - "project": "./tsconfig.json" - }, - plugins: [ - '@typescript-eslint', - ], - rules: { - "@typescript-eslint/no-floating-promises": 2, - "@typescript-eslint/no-misused-promises": 2, - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": ["warn"], - "no-undef": "off", - "semi": ["error", "always"], - "@typescript-eslint/explicit-function-return-type": ["error"] - } -}; diff --git a/src/domain/SessionLoadViewModel.js b/src/domain/SessionLoadViewModel.js index 6a63145f4a..d9c8af22bc 100644 --- a/src/domain/SessionLoadViewModel.js +++ b/src/domain/SessionLoadViewModel.js @@ -123,21 +123,21 @@ export class SessionLoadViewModel extends ViewModel { if (client) { switch (client.loadStatus.get()) { case LoadStatus.QueryAccount: - return `Querying account encryption setup…`; + return "Querying account encryption setup…"; case LoadStatus.AccountSetup: return ""; // we'll show a header ing AccountSetupView case LoadStatus.SessionSetup: - return `Setting up your encryption keys…`; + return "Setting up your encryption keys…"; case LoadStatus.Loading: - return `Loading your conversations…`; + return "Loading your conversations…"; case LoadStatus.FirstSync: - return `Getting your conversations from the server…`; + return "Getting your conversations from the server…"; default: return this._client.loadStatus.get(); } } - return `Preparing…`; + return "Preparing…"; } _getError() { diff --git a/src/domain/SessionPickerViewModel.js b/src/domain/SessionPickerViewModel.js index 97b29f393e..d33e788252 100644 --- a/src/domain/SessionPickerViewModel.js +++ b/src/domain/SessionPickerViewModel.js @@ -42,7 +42,7 @@ class SessionItemViewModel extends ViewModel { } get label() { - const {userId, comment} = this._sessionInfo; + const {userId, comment} = this._sessionInfo; if (comment) { return `${userId} (${comment})`; } else { diff --git a/src/domain/session/CreateRoomViewModel.js b/src/domain/session/CreateRoomViewModel.js index 12b4fbd50c..de079d3559 100644 --- a/src/domain/session/CreateRoomViewModel.js +++ b/src/domain/session/CreateRoomViewModel.js @@ -86,7 +86,7 @@ export class CreateRoomViewModel extends ViewModel { info: this._avatarInfo, name: this._avatarFileName, blob: this._avatarScaledBlob - } + }; } const roomBeingCreated = this._session.createRoom({ type: this.isPublic ? RoomType.Public : RoomType.Private, diff --git a/src/domain/session/leftpanel/InviteTileViewModel.js b/src/domain/session/leftpanel/InviteTileViewModel.js index 26c8ec76d7..e890cd2ff7 100644 --- a/src/domain/session/leftpanel/InviteTileViewModel.js +++ b/src/domain/session/leftpanel/InviteTileViewModel.js @@ -53,12 +53,12 @@ export class InviteTileViewModel extends BaseTileViewModel { export function tests() { return { "test compare with timestamp": assert => { - const urlRouter = {openRoomActionUrl() { return "";}} + const urlRouter = {openRoomActionUrl() { return "";}}; const vm1 = new InviteTileViewModel({invite: {timestamp: 500, id: "1"}, urlRouter}); const vm2 = new InviteTileViewModel({invite: {timestamp: 250, id: "2"}, urlRouter}); assert(vm1.compare(vm2) < 0); assert(vm2.compare(vm1) > 0); assert.equal(vm1.compare(vm1), 0); }, - } + }; } diff --git a/src/domain/session/leftpanel/RoomBeingCreatedTileViewModel.js b/src/domain/session/leftpanel/RoomBeingCreatedTileViewModel.js index b6c8c976ca..f4d7bb72ea 100644 --- a/src/domain/session/leftpanel/RoomBeingCreatedTileViewModel.js +++ b/src/domain/session/leftpanel/RoomBeingCreatedTileViewModel.js @@ -59,12 +59,12 @@ export class RoomBeingCreatedTileViewModel extends BaseTileViewModel { export function tests() { return { "test compare with names": assert => { - const urlRouter = {openRoomActionUrl() { return "";}} + const urlRouter = {openRoomActionUrl() { return "";}}; const vm1 = new RoomBeingCreatedTileViewModel({roomBeingCreated: {name: "A", id: "1"}, urlRouter}); const vm2 = new RoomBeingCreatedTileViewModel({roomBeingCreated: {name: "B", id: "2"}, urlRouter}); assert(vm1.compare(vm2) < 0); assert(vm2.compare(vm1) > 0); assert.equal(vm1.compare(vm1), 0); }, - } + }; } diff --git a/src/domain/session/rightpanel/MemberDetailsViewModel.js b/src/domain/session/rightpanel/MemberDetailsViewModel.js index b3c8278c96..d14c6170be 100644 --- a/src/domain/session/rightpanel/MemberDetailsViewModel.js +++ b/src/domain/session/rightpanel/MemberDetailsViewModel.js @@ -59,7 +59,7 @@ export class MemberDetailsViewModel extends ViewModel { } get avatarColorNumber() { - return getIdentifierColorNumber(this.userId) + return getIdentifierColorNumber(this.userId); } avatarUrl(size) { diff --git a/src/domain/session/rightpanel/MemberTileViewModel.js b/src/domain/session/rightpanel/MemberTileViewModel.js index 9f9a5483fe..1b28e009ab 100644 --- a/src/domain/session/rightpanel/MemberTileViewModel.js +++ b/src/domain/session/rightpanel/MemberTileViewModel.js @@ -21,7 +21,7 @@ export class MemberTileViewModel extends ViewModel { constructor(options) { super(options); this._member = this._options.member; - this._mediaRepository = options.mediaRepository + this._mediaRepository = options.mediaRepository; this._previousName = null; this._nameChanged = true; } @@ -76,7 +76,7 @@ export class MemberTileViewModel extends ViewModel { } get avatarColorNumber() { - return getIdentifierColorNumber(this.userId) + return getIdentifierColorNumber(this.userId); } avatarUrl(size) { diff --git a/src/domain/session/rightpanel/RoomDetailsViewModel.js b/src/domain/session/rightpanel/RoomDetailsViewModel.js index 4e2735b1ef..4b5a9df709 100644 --- a/src/domain/session/rightpanel/RoomDetailsViewModel.js +++ b/src/domain/session/rightpanel/RoomDetailsViewModel.js @@ -62,7 +62,7 @@ export class RoomDetailsViewModel extends ViewModel { } get avatarColorNumber() { - return getIdentifierColorNumber(this._room.avatarColorId) + return getIdentifierColorNumber(this._room.avatarColorId); } avatarUrl(size) { diff --git a/src/domain/session/rightpanel/members/disambiguator.js b/src/domain/session/rightpanel/members/disambiguator.js index e998a432bb..b771475231 100644 --- a/src/domain/session/rightpanel/members/disambiguator.js +++ b/src/domain/session/rightpanel/members/disambiguator.js @@ -52,7 +52,7 @@ export class Disambiguator { value.push(vm); return value; } else if(vm.userId !== value.userId) { - const array = [value, vm] + const array = [value, vm]; this._map.set(name, array); return array; } diff --git a/src/domain/session/room/InviteViewModel.js b/src/domain/session/room/InviteViewModel.js index 7a6c2a6a68..c83724c257 100644 --- a/src/domain/session/room/InviteViewModel.js +++ b/src/domain/session/room/InviteViewModel.js @@ -56,7 +56,7 @@ export class InviteViewModel extends ViewModel { } get avatarColorNumber() { - return getIdentifierColorNumber(this._invite.avatarColorId) + return getIdentifierColorNumber(this._invite.avatarColorId); } avatarUrl(size) { @@ -74,7 +74,7 @@ export class InviteViewModel extends ViewModel { if (this._invite.canonicalAlias) { parts.push(this._invite.canonicalAlias); } - return parts.join(" • ") + return parts.join(" • "); } get roomDescription() { diff --git a/src/domain/session/room/LightboxViewModel.js b/src/domain/session/room/LightboxViewModel.js index a14eef8978..30f2f7d800 100644 --- a/src/domain/session/room/LightboxViewModel.js +++ b/src/domain/session/room/LightboxViewModel.js @@ -79,7 +79,7 @@ export class LightboxViewModel extends ViewModel { } get date() { - return this._date && this._date.toLocaleDateString({}, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }); + return this._date && this._date.toLocaleDateString({}, { weekday: "long", year: "numeric", month: "long", day: "numeric" }); } get time() { diff --git a/src/domain/session/room/RoomViewModel.js b/src/domain/session/room/RoomViewModel.js index 31608a62e7..743fd9d8ab 100644 --- a/src/domain/session/room/RoomViewModel.js +++ b/src/domain/session/room/RoomViewModel.js @@ -16,8 +16,8 @@ limitations under the License. */ import {TimelineViewModel} from "./timeline/TimelineViewModel.js"; -import {ComposerViewModel} from "./ComposerViewModel.js" -import {CallViewModel} from "./CallViewModel" +import {ComposerViewModel} from "./ComposerViewModel.js"; +import {CallViewModel} from "./CallViewModel"; import {PickMapObservableValue} from "../../../observable/value"; import {avatarInitials, getIdentifierColorNumber, getAvatarHttpUrl} from "../../avatar"; import {ErrorReportViewModel} from "../../ErrorReportViewModel"; @@ -107,7 +107,7 @@ export class RoomViewModel extends ErrorReportViewModel { else { this._composerVM = this.track(new LowerPowerLevelViewModel(this.childOptions())); } - this.emitChange("powerLevelObservable") + this.emitChange("powerLevelObservable"); }; this.track(powerLevelObservable.subscribe(() => { const newCanSendMessage = canSendMessage(); @@ -175,7 +175,7 @@ export class RoomViewModel extends ErrorReportViewModel { } get avatarColorNumber() { - return getIdentifierColorNumber(this._room.avatarColorId) + return getIdentifierColorNumber(this._room.avatarColorId); } avatarUrl(size) { diff --git a/src/domain/session/room/timeline/ReactionsViewModel.js b/src/domain/session/room/timeline/ReactionsViewModel.js index 0355889c7a..496a7af0c2 100644 --- a/src/domain/session/room/timeline/ReactionsViewModel.js +++ b/src/domain/session/room/timeline/ReactionsViewModel.js @@ -88,7 +88,7 @@ class ReactionViewModel { _tryUpdate(annotation) { const oneSetAndOtherNot = !!this._annotation !== !!annotation; const bothSet = this._annotation && annotation; - const areDifferent = bothSet && ( + const areDifferent = bothSet && ( annotation.me !== this._annotation.me || annotation.count !== this._annotation.count || annotation.firstTimestamp !== this._annotation.firstTimestamp @@ -369,5 +369,5 @@ export function tests() { redactionIndex = index; } }, - } + }; } diff --git a/src/domain/session/room/timeline/TilesCollection.js b/src/domain/session/room/timeline/TilesCollection.js index c5bddc2c3b..08bbe06c75 100644 --- a/src/domain/session/room/timeline/TilesCollection.js +++ b/src/domain/session/room/timeline/TilesCollection.js @@ -500,5 +500,5 @@ export function tests() { assert.equal(tilesArray.length, 2); assert.equal(removals, 2); } - } + }; } diff --git a/src/domain/session/room/timeline/deserialize.js b/src/domain/session/room/timeline/deserialize.js index 2e2a30f2b4..4b8a4906ed 100644 --- a/src/domain/session/room/timeline/deserialize.js +++ b/src/domain/session/room/timeline/deserialize.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MessageBody, HeaderBlock, TableBlock, ListBlock, CodeBlock, PillPart, FormatPart, NewLinePart, RulePart, TextPart, LinkPart, ImagePart } from "./MessageBody.js" +import { MessageBody, HeaderBlock, TableBlock, ListBlock, CodeBlock, PillPart, FormatPart, NewLinePart, RulePart, TextPart, LinkPart, ImagePart } from "./MessageBody.js"; import {linkify} from "./linkify/linkify"; /* At the time of writing (Jul 1 2021), Matrix Spec recommends @@ -30,7 +30,7 @@ import {linkify} from "./linkify/linkify"; const basicInline = ["EM", "STRONG", "CODE", "DEL", "SPAN" ]; const basicBlock = ["DIV", "BLOCKQUOTE"]; const safeSchemas = ["https", "http", "ftp", "mailto", "magnet"].map(name => `${name}://`); -const baseUrl = 'https://matrix.to'; +const baseUrl = "https://matrix.to"; const linkPrefix = `${baseUrl}/#/`; class Deserializer { @@ -44,7 +44,7 @@ class Deserializer { return null; } const contents = link.substring(linkPrefix.length); - if (contents[0] === '@') { + if (contents[0] === "@") { return contents; } return null; @@ -99,10 +99,10 @@ class Deserializer { if (!this._ensureElement(codeNode, "CODE")) { return new CodeBlock(language, this.result.getNodeText(node)); } - const cl = result.getAttributeValue(codeNode, "class") || "" + const cl = result.getAttributeValue(codeNode, "class") || ""; for (const clname of cl.split(" ")) { if (clname.startsWith("language-") && !clname.startsWith("language-_")) { - language = clname.substring(9) // "language-".length + language = clname.substring(9); // "language-".length break; } } @@ -231,7 +231,7 @@ class Deserializer { case "H5": case "H6": { const inlines = this.parseInlineNodes(children); - return new HeaderBlock(parseInt(tag[1]), inlines) + return new HeaderBlock(parseInt(tag[1]), inlines); } case "UL": case "OL": @@ -432,7 +432,7 @@ export async function tests() { test(assert, input, output); }, "Text with ordered list starting at 3": assert => { - const input = '
  1. Lorem
  2. Ipsum
'; + const input = "
  1. Lorem
  2. Ipsum
"; const output = [ new ListBlock(3, [ [ new TextPart("Lorem") ], @@ -442,7 +442,7 @@ export async function tests() { test(assert, input, output); }, "Text with unordered list": assert => { - const input = ''; + const input = ""; const output = [ new ListBlock(null, [ [ new TextPart("Lorem") ], @@ -452,7 +452,7 @@ export async function tests() { test(assert, input, output); }, "Auto-closed tags": assert => { - const input = '

hello

world

'; + const input = "

hello

world

"; const output = [ new FormatPart("p", [new TextPart("hello")]), new FormatPart("p", [new TextPart("world")]) @@ -460,14 +460,14 @@ export async function tests() { test(assert, input, output); }, "Block elements ignored inside inline elements": assert => { - const input = '

Hello

'; + const input = "

Hello

"; const output = [ new FormatPart("span", [new FormatPart("code", [new TextPart("Hello")])]) ]; test(assert, input, output); }, "Unknown tags are ignored, but their children are kept": assert => { - const input = 'Hello'; + const input = "Hello"; const output = [ new FormatPart("span", [ new FormatPart("code", [new TextPart("Hello")]), @@ -477,14 +477,14 @@ export async function tests() { test(assert, input, output); }, "Unknown and invalid attributes are stripped": assert => { - const input = 'Hello'; + const input = "Hello"; const output = [ new FormatPart("em", [new TextPart("Hello")]) ]; test(assert, input, output); }, "Text with code block but no tag": assert => { - const code = 'main :: IO ()\nmain = putStrLn "Hello"' + const code = "main :: IO ()\nmain = putStrLn \"Hello\""; const input = `
${code}
`; const output = [ new CodeBlock(null, code) @@ -492,7 +492,7 @@ export async function tests() { test(assert, input, output); }, "Text with code block and 'unsupported' tag": assert => { - const code = 'Hello, world' + const code = "Hello, world"; const input = `
${code}
`; const output = [ new CodeBlock(null, code) @@ -500,11 +500,11 @@ export async function tests() { test(assert, input, output); }, "Reply fallback is always stripped": assert => { - const input = 'Hello, World!'; + const input = "Hello, World!"; const output = [ - new TextPart('Hello, '), + new TextPart("Hello, "), new FormatPart("em", []), - new TextPart('!'), + new TextPart("!"), ]; assert.deepEqual(parseHTMLBody(platform, null, input), new MessageBody(input, output)); } diff --git a/src/domain/session/room/timeline/tiles/BaseMediaTile.js b/src/domain/session/room/timeline/tiles/BaseMediaTile.js index aa53661c53..d62329c6c8 100644 --- a/src/domain/session/room/timeline/tiles/BaseMediaTile.js +++ b/src/domain/session/room/timeline/tiles/BaseMediaTile.js @@ -77,7 +77,7 @@ export class BaseMediaTile extends BaseMessageTile { return this.i18n`Error: ${pendingEvent.error.message}`; default: if (this._downloadError) { - return `Download failed`; + return "Download failed"; } if (this._downloading) { return this.i18n`Downloading…`; diff --git a/src/domain/session/room/timeline/tiles/BaseTextTile.js b/src/domain/session/room/timeline/tiles/BaseTextTile.js index 8e78c95f74..3839c06c40 100644 --- a/src/domain/session/room/timeline/tiles/BaseTextTile.js +++ b/src/domain/session/room/timeline/tiles/BaseTextTile.js @@ -24,7 +24,7 @@ export class BaseTextTile extends BaseMessageTile { constructor(entry, options) { super(entry, options); this._messageBody = null; - this._format = null + this._format = null; } get shape() { diff --git a/src/domain/session/room/timeline/tiles/CallTile.js b/src/domain/session/room/timeline/tiles/CallTile.js index 05762bc0bc..848ddabb13 100644 --- a/src/domain/session/room/timeline/tiles/CallTile.js +++ b/src/domain/session/room/timeline/tiles/CallTile.js @@ -110,21 +110,21 @@ export class CallTile extends SimpleTile { } } else { if (this.type === CallType.Video) { - return `Video call ended`; + return "Video call ended"; } else { - return `Voice call ended`; + return "Voice call ended"; } } } get typeLabel() { if (this._call && this._call.usesFoci) { - return `This call uses a stream-forwarding unit, which isn't supported yet, so you can't join this call.`; + return "This call uses a stream-forwarding unit, which isn't supported yet, so you can't join this call."; } if (this.type === CallType.Video) { - return `Video call`; + return "Video call"; } else { - return `Voice call`; + return "Voice call"; } } diff --git a/src/domain/session/room/timeline/tiles/EncryptedEventTile.js b/src/domain/session/room/timeline/tiles/EncryptedEventTile.js index b96e2d85bd..ca17622bfc 100644 --- a/src/domain/session/room/timeline/tiles/EncryptedEventTile.js +++ b/src/domain/session/room/timeline/tiles/EncryptedEventTile.js @@ -30,7 +30,7 @@ export class EncryptedEventTile extends BaseTextTile { } get shape() { - return "message-status" + return "message-status"; } _getBody() { diff --git a/src/domain/session/room/timeline/tiles/EncryptionEnabledTile.js b/src/domain/session/room/timeline/tiles/EncryptionEnabledTile.js index 00bc67377b..4c3e23fbc2 100644 --- a/src/domain/session/room/timeline/tiles/EncryptionEnabledTile.js +++ b/src/domain/session/room/timeline/tiles/EncryptionEnabledTile.js @@ -22,7 +22,7 @@ export class EncryptionEnabledTile extends SimpleTile { } get announcement() { - const senderName = this._entry.displayName || this._entry.sender; + const senderName = this._entry.displayName || this._entry.sender; return this.i18n`${senderName} has enabled end-to-end encryption`; } } diff --git a/src/domain/session/room/timeline/tiles/GapTile.js b/src/domain/session/room/timeline/tiles/GapTile.js index 66e831473d..6f3b50e7d0 100644 --- a/src/domain/session/room/timeline/tiles/GapTile.js +++ b/src/domain/session/room/timeline/tiles/GapTile.js @@ -169,5 +169,5 @@ export function tests() { await tile.fill(); assert.equal(currentToken, 8); } - } + }; } diff --git a/src/domain/session/room/timeline/tiles/MissingAttachmentTile.js b/src/domain/session/room/timeline/tiles/MissingAttachmentTile.js index 847901acf2..9916839ad8 100644 --- a/src/domain/session/room/timeline/tiles/MissingAttachmentTile.js +++ b/src/domain/session/room/timeline/tiles/MissingAttachmentTile.js @@ -18,7 +18,7 @@ import {BaseMessageTile} from "./BaseMessageTile.js"; export class MissingAttachmentTile extends BaseMessageTile { get shape() { - return "missing-attachment" + return "missing-attachment"; } get label() { diff --git a/src/domain/session/room/timeline/tiles/RoomMemberTile.js b/src/domain/session/room/timeline/tiles/RoomMemberTile.js index ca9cd9b7ed..f63383c27b 100644 --- a/src/domain/session/room/timeline/tiles/RoomMemberTile.js +++ b/src/domain/session/room/timeline/tiles/RoomMemberTile.js @@ -24,7 +24,7 @@ export class RoomMemberTile extends SimpleTile { get announcement() { const {sender, content, prevContent, stateKey} = this._entry; - const senderName = this._entry.displayName || sender; + const senderName = this._entry.displayName || sender; const targetName = sender === stateKey ? senderName : (this._entry.content?.displayname || stateKey); const membership = content && content.membership; const prevMembership = prevContent && prevContent.membership; diff --git a/src/domain/session/room/timeline/tiles/RoomNameTile.js b/src/domain/session/room/timeline/tiles/RoomNameTile.js index d5694a6242..7c69ba552c 100644 --- a/src/domain/session/room/timeline/tiles/RoomNameTile.js +++ b/src/domain/session/room/timeline/tiles/RoomNameTile.js @@ -24,6 +24,6 @@ export class RoomNameTile extends SimpleTile { get announcement() { const content = this._entry.content; - return `${this._entry.displayName || this._entry.sender} named the room "${content?.name}"` + return `${this._entry.displayName || this._entry.sender} named the room "${content?.name}"`; } } diff --git a/src/domain/session/room/timeline/tiles/SimpleTile.js b/src/domain/session/room/timeline/tiles/SimpleTile.js index 59ddf15b4c..89cb2d8f6a 100644 --- a/src/domain/session/room/timeline/tiles/SimpleTile.js +++ b/src/domain/session/room/timeline/tiles/SimpleTile.js @@ -256,5 +256,5 @@ export function tests() { fridayTile.updatePreviousSibling(undefined); assert.equal(fridayTile.needsDateSeparator, true); }, - } + }; } diff --git a/src/matrix/Session.js b/src/matrix/Session.js index 35f713f658..2c80c8646a 100644 --- a/src/matrix/Session.js +++ b/src/matrix/Session.js @@ -72,7 +72,7 @@ export class Session { if (rbc.isCancelled) { this._roomsBeingCreated.remove(rbc.id); } else { - this._roomsBeingCreated.update(rbc.id, params) + this._roomsBeingCreated.update(rbc.id, params); } }; this._roomsBeingCreated = new ObservableMap(); @@ -228,7 +228,7 @@ export class Session { encryptionParams, notifyMissingMegolmSession: () => { if (!this._keyBackup.get()) { - this.needsKeyBackup.set(true) + this.needsKeyBackup.set(true); } }, clock: this._platform.clock @@ -795,7 +795,7 @@ export class Session { if (roomBeingCreated.roomId === roomId) { const observableStatus = this._observedRoomStatus.get(roomBeingCreated.id); if (observableStatus) { - log.log(`replacing room being created`) + log.log("replacing room being created") .set("localId", roomBeingCreated.id) .set("roomId", roomBeingCreated.roomId); observableStatus.set(observableStatus.get() | RoomStatus.Replaced); @@ -1107,5 +1107,5 @@ export function tests() { assert.equal(session.syncToken, "b"); assert.equal(session.syncFilterId, 6); } - } + }; } diff --git a/src/matrix/Sync.js b/src/matrix/Sync.js index d335336d29..5e47a956ba 100644 --- a/src/matrix/Sync.js +++ b/src/matrix/Sync.js @@ -259,7 +259,7 @@ export class Sync { await rs.room.load(null, prepareTxn, log); } return rs.room.prepareSync( - rs.roomResponse, rs.membership, newKeys, prepareTxn, log) + rs.roomResponse, rs.membership, newKeys, prepareTxn, log); }, log.level.Detail); })); diff --git a/src/matrix/common.js b/src/matrix/common.js index 7cd72ae1ac..61b9a32613 100644 --- a/src/matrix/common.js +++ b/src/matrix/common.js @@ -54,5 +54,5 @@ export function tests() { "isTxnId fails on event id": assert => { assert(!isTxnId("$yS_n5n3cIO2aTtek0_2ZSlv-7g4YYR2zKrk2mFCW_rm")); }, - } + }; } diff --git a/src/matrix/e2ee/DeviceTracker.js b/src/matrix/e2ee/DeviceTracker.js index b669629ea5..a49f35a9d1 100644 --- a/src/matrix/e2ee/DeviceTracker.js +++ b/src/matrix/e2ee/DeviceTracker.js @@ -246,7 +246,7 @@ export class DeviceTracker { }, {log}).response(); const masterKeys = log.wrap("master keys", log => this._filterValidMasterKeys(deviceKeyResponse, log)); - const selfSigningKeys = log.wrap("self-signing keys", log => this._filterVerifiedCrossSigningKeys(deviceKeyResponse["self_signing_keys"], "self_signing", masterKeys, log)) + const selfSigningKeys = log.wrap("self-signing keys", log => this._filterVerifiedCrossSigningKeys(deviceKeyResponse["self_signing_keys"], "self_signing", masterKeys, log)); const verifiedKeysPerUser = log.wrap("verify", log => this._filterVerifiedDeviceKeys(deviceKeyResponse["device_keys"], log)); const txn = await this._storage.readWriteTxn([ this._storage.storeNames.userIdentities, @@ -319,7 +319,7 @@ export class DeviceTracker { return allDeviceIdentities; } - _filterValidMasterKeys(keyQueryResponse, log) { + _filterValidMasterKeys(keyQueryResponse) { const masterKeys = new Map(); const masterKeysResponse = keyQueryResponse["master_keys"]; if (!masterKeysResponse) { @@ -620,7 +620,7 @@ export function tests() { map.set(member.userId, member); return map; }, new Map()); - return {members: memberMap, release() {}} + return {members: memberMap, release() {}}; }, writeIsTrackingMembers(isTrackingMembers) { if (this.isTrackingMembers !== isTrackingMembers) { @@ -633,7 +633,7 @@ export function tests() { this.isTrackingMembers = isTrackingMembers; } }, - } + }; } function createQueryKeysHSApiMock(createKey = (algorithm, userId, deviceId) => `${algorithm}:${userId}:${deviceId}:key`) { @@ -965,5 +965,5 @@ export function tests() { const txn1 = await storage.readTxn([storage.storeNames.userIdentities]); assert.deepEqual((await txn1.userIdentities.get("@bob:hs.tld")).roomIds, []); } - } + }; } diff --git a/src/matrix/e2ee/RoomEncryption.js b/src/matrix/e2ee/RoomEncryption.js index b74dc710f1..7626bc3c17 100644 --- a/src/matrix/e2ee/RoomEncryption.js +++ b/src/matrix/e2ee/RoomEncryption.js @@ -605,7 +605,7 @@ export function tests() { }; const olmMock = { async encrypt() { return []; } - } + }; let isRoomTracked = false; let isDevicesRequested = false; const deviceTracker = { @@ -625,7 +625,7 @@ export function tests() { async devicesForRoomMembers() { return []; } - } + }; const writeTxn = await storage.readWriteTxn([storage.storeNames.roomState]); writeTxn.roomState.set(roomId, {state_key: "", type: ROOM_HISTORY_VISIBILITY_TYPE, content: { history_visibility: "invited" @@ -655,7 +655,7 @@ export function tests() { }; const olmMock = { async encrypt() { return []; } - } + }; let isRoomTracked = false; let isDevicesRequested = false; const deviceTracker = { @@ -675,7 +675,7 @@ export function tests() { async devicesForRoomMembers() { return []; } - } + }; const writeTxn = await storage.readWriteTxn([storage.storeNames.roomState]); writeTxn.roomState.set(roomId, {state_key: "", type: ROOM_HISTORY_VISIBILITY_TYPE, content: { history_visibility: "invited" @@ -709,7 +709,7 @@ export function tests() { async devicesForRoomMembers() { return []; } - } + }; const writeTxn = await storage.readWriteTxn([storage.storeNames.roomState]); writeTxn.roomState.set(roomId, {state_key: "", type: ROOM_HISTORY_VISIBILITY_TYPE, content: { history_visibility: "invited" @@ -725,5 +725,5 @@ export function tests() { await roomEncryption.writeSync(roomResponse, memberChanges, txn, NullLoggerInstance.item); assert(isMemberChangesCalled); }, - } + }; } diff --git a/src/matrix/e2ee/attachment.js b/src/matrix/e2ee/attachment.js index 647cced871..7ea168cb0c 100644 --- a/src/matrix/e2ee/attachment.js +++ b/src/matrix/e2ee/attachment.js @@ -66,7 +66,7 @@ export async function encryptAttachment(platform, blob) { const ciphertext = await crypto.aes.encryptCTR({jwkKey: key, iv, data: buffer}); const digest = await crypto.digest("SHA-256", ciphertext); return { - blob: platform.createBlob(ciphertext, 'application/octet-stream'), + blob: platform.createBlob(ciphertext, "application/octet-stream"), info: { v: "v2", key, diff --git a/src/matrix/e2ee/common.js b/src/matrix/e2ee/common.js index cc3bfff5f9..f37d8c7576 100644 --- a/src/matrix/e2ee/common.js +++ b/src/matrix/e2ee/common.js @@ -67,7 +67,7 @@ export function createRoomEncryptionEvent() { "rotation_period_ms": 604800000, "rotation_period_msgs": 100 } - } + }; } diff --git a/src/matrix/e2ee/megolm/Encryption.js b/src/matrix/e2ee/megolm/Encryption.js index eb5f68d304..d6350a842a 100644 --- a/src/matrix/e2ee/megolm/Encryption.js +++ b/src/matrix/e2ee/megolm/Encryption.js @@ -191,7 +191,7 @@ export class Encryption { // chain_index is ignored by element-web if not all clients // but let's send it anyway, as element-web does so chain_index: session.message_index() - } + }; } } diff --git a/src/matrix/room/ArchivedRoom.js b/src/matrix/room/ArchivedRoom.js index 865951637c..d02c944e7e 100644 --- a/src/matrix/room/ArchivedRoom.js +++ b/src/matrix/room/ArchivedRoom.js @@ -230,5 +230,5 @@ export function tests() { const kickDetails = findKickDetails({state: {events: [leaveEvent]}}, bob); assert.equal(kickDetails, null); } - } + }; } diff --git a/src/matrix/room/BaseRoom.js b/src/matrix/room/BaseRoom.js index 4ea2538923..4feceec689 100644 --- a/src/matrix/room/BaseRoom.js +++ b/src/matrix/room/BaseRoom.js @@ -20,7 +20,7 @@ import {GapWriter} from "./timeline/persistence/GapWriter.js"; import {RelationWriter} from "./timeline/persistence/RelationWriter.js"; import {Timeline} from "./timeline/Timeline.js"; import {FragmentIdComparer} from "./timeline/FragmentIdComparer.js"; -import {WrappedError} from "../error.js" +import {WrappedError} from "../error.js"; import {fetchOrLoadMembers, fetchOrLoadMember} from "./members/load.js"; import {MemberList} from "./members/MemberList.js"; import {Heroes} from "./members/Heroes.js"; @@ -379,7 +379,7 @@ export class BaseRoom extends EventEmitter { allow sub classes to integrate in the gap fill lifecycle. JoinedRoom uses this update remote echos. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars async _writeGapFill(chunk, txn, log) {} _applyGapFill() {} @@ -428,7 +428,7 @@ export class BaseRoom extends EventEmitter { get isLowPriority() { const tags = this._summary.data.tags; - return !!(tags && tags['m.lowpriority']); + return !!(tags && tags["m.lowpriority"]); } get isEncrypted() { diff --git a/src/matrix/room/Invite.js b/src/matrix/room/Invite.js index 6c5ef121a4..acc3e73161 100644 --- a/src/matrix/room/Invite.js +++ b/src/matrix/room/Invite.js @@ -263,7 +263,7 @@ export function tests() { invitesMap.delete(roomId); } } - } + }; } const roomId = "!123:hs.tld"; @@ -352,5 +352,5 @@ export function tests() { assert.equal(invite.rejected, false); assert.equal(invite.accepted, true); } - } + }; } diff --git a/src/matrix/room/PowerLevels.js b/src/matrix/room/PowerLevels.js index 76e062ef37..29869aed88 100644 --- a/src/matrix/room/PowerLevels.js +++ b/src/matrix/room/PowerLevels.js @@ -156,5 +156,5 @@ export function tests() { assert.equal(pl.canRedactFromSender(alice), false); assert.equal(pl.canSendType("m.room.message"), false); }, - } + }; } diff --git a/src/matrix/room/Room.js b/src/matrix/room/Room.js index b87d7a88cd..cfe5885727 100644 --- a/src/matrix/room/Room.js +++ b/src/matrix/room/Room.js @@ -19,7 +19,7 @@ import {SyncWriter} from "./timeline/persistence/SyncWriter.js"; import {MemberWriter} from "./timeline/persistence/MemberWriter.js"; import {RelationWriter} from "./timeline/persistence/RelationWriter.js"; import {SendQueue} from "./sending/SendQueue.js"; -import {WrappedError} from "../error.js" +import {WrappedError} from "../error.js"; import {Heroes} from "./members/Heroes.js"; import {AttachmentUpload} from "./AttachmentUpload.js"; import {DecryptionSource} from "../e2ee/common.js"; diff --git a/src/matrix/room/RoomSummary.js b/src/matrix/room/RoomSummary.js index 6260868332..1a5369b671 100644 --- a/src/matrix/room/RoomSummary.js +++ b/src/matrix/room/RoomSummary.js @@ -189,7 +189,7 @@ export class SummaryData { changedKeys(other) { const props = Object.getOwnPropertyNames(this); return props.filter(prop => { - return prop !== "cloned" && this[prop] !== other[prop] + return prop !== "cloned" && this[prop] !== other[prop]; }); } @@ -317,5 +317,5 @@ export function tests() { const nullCount = Object.values(serialized).reduce((count, value) => count + value === null ? 1 : 0, 0); assert.strictEqual(nullCount, 0); } - } + }; } diff --git a/src/matrix/room/members/Heroes.js b/src/matrix/room/members/Heroes.js index 97630edd8f..3fa579c304 100644 --- a/src/matrix/room/members/Heroes.js +++ b/src/matrix/room/members/Heroes.js @@ -117,7 +117,7 @@ export class Heroes { get roomAvatarColorId() { if (this._members.size === 1) { for (const member of this._members.keys()) { - return member + return member; } } return null; diff --git a/src/matrix/room/sending/SendQueue.js b/src/matrix/room/sending/SendQueue.js index f9950c0142..9c6204b6a8 100644 --- a/src/matrix/room/sending/SendQueue.js +++ b/src/matrix/room/sending/SendQueue.js @@ -446,5 +446,5 @@ export function tests() { assert.equal(queue.pendingEvents.length, 2); }, - } + }; } diff --git a/src/matrix/room/timeline/FragmentIdComparer.js b/src/matrix/room/timeline/FragmentIdComparer.js index fcd27edf2b..8f9d687862 100644 --- a/src/matrix/room/timeline/FragmentIdComparer.js +++ b/src/matrix/room/timeline/FragmentIdComparer.js @@ -314,5 +314,5 @@ export function tests() { index.prepend(1, 2); assert(index.compare(1, 2) < 0); } - } + }; } diff --git a/src/matrix/room/timeline/Timeline.js b/src/matrix/room/timeline/Timeline.js index a721092e43..7dfead7c3f 100644 --- a/src/matrix/room/timeline/Timeline.js +++ b/src/matrix/room/timeline/Timeline.js @@ -228,7 +228,7 @@ export class Timeline { for (const entry of entries) { try { this._remoteEntries.getAndUpdate(entry, Timeline._entryUpdater); - const oldEntry = this._contextEntriesNotInTimeline.get(entry.id) + const oldEntry = this._contextEntriesNotInTimeline.get(entry.id); if (oldEntry) { Timeline._entryUpdater(oldEntry, entry); this._contextEntriesNotInTimeline.set(entry.id, entry); diff --git a/src/matrix/room/timeline/common.js b/src/matrix/room/timeline/common.js index 7958f75438..5318b0436e 100644 --- a/src/matrix/room/timeline/common.js +++ b/src/matrix/room/timeline/common.js @@ -29,22 +29,22 @@ export function isValidFragmentId(id) { * - We keep user_id for backwards-compat with v1 */ const _REDACT_KEEP_KEY_MAP = [ - 'event_id', 'type', 'room_id', 'user_id', 'sender', 'state_key', 'prev_state', - 'content', 'unsigned', 'origin_server_ts', + "event_id", "type", "room_id", "user_id", "sender", "state_key", "prev_state", + "content", "unsigned", "origin_server_ts", ].reduce(function(ret, val) { ret[val] = 1; return ret; }, {}); // a map from event type to the .content keys we keep when an event is redacted const _REDACT_KEEP_CONTENT_MAP = { - 'm.room.member': {'membership': 1}, - 'm.room.create': {'creator': 1}, - 'm.room.join_rules': {'join_rule': 1}, - 'm.room.power_levels': {'ban': 1, 'events': 1, 'events_default': 1, - 'kick': 1, 'redact': 1, 'state_default': 1, - 'users': 1, 'users_default': 1, + "m.room.member": {"membership": 1}, + "m.room.create": {"creator": 1}, + "m.room.join_rules": {"join_rule": 1}, + "m.room.power_levels": {"ban": 1, "events": 1, "events_default": 1, + "kick": 1, "redact": 1, "state_default": 1, + "users": 1, "users_default": 1, }, - 'm.room.aliases': {'aliases': 1}, + "m.room.aliases": {"aliases": 1}, }; // end of matrix-js-sdk code diff --git a/src/matrix/room/timeline/entries/BaseEventEntry.js b/src/matrix/room/timeline/entries/BaseEventEntry.js index 3969855772..765adf39bf 100644 --- a/src/matrix/room/timeline/entries/BaseEventEntry.js +++ b/src/matrix/room/timeline/entries/BaseEventEntry.js @@ -18,7 +18,7 @@ import {BaseEntry} from "./BaseEntry"; import {REDACTION_TYPE} from "../../common"; import {createAnnotation, ANNOTATION_RELATION_TYPE, getRelationFromContent} from "../relations.js"; import {PendingAnnotation} from "../PendingAnnotation.js"; -import {createReplyContent} from "./reply.js" +import {createReplyContent} from "./reply.js"; /** Deals mainly with local echo for relations and redactions, * so it is shared between PendingEventEntry and EventEntry */ diff --git a/src/matrix/room/timeline/entries/EventEntry.js b/src/matrix/room/timeline/entries/EventEntry.js index cf56cbf954..b5ce4fe1c8 100644 --- a/src/matrix/room/timeline/entries/EventEntry.js +++ b/src/matrix/room/timeline/entries/EventEntry.js @@ -240,5 +240,5 @@ export function tests() { "🚀"); assert.equal(false, e8.haveAnnotation("🚀")); } - } + }; } diff --git a/src/matrix/room/timeline/entries/reply.js b/src/matrix/room/timeline/entries/reply.js index 2e180c1124..52337e40e4 100644 --- a/src/matrix/room/timeline/entries/reply.js +++ b/src/matrix/room/timeline/entries/reply.js @@ -65,10 +65,10 @@ export function createReplyContent(entry, msgtype, body) { const plainBody = nonTextual || entry.content.body || ""; const bodyLines = plainBody.split("\n"); - bodyLines[0] = `> ${prefix}<${sender}> ${bodyLines[0]}` + bodyLines[0] = `> ${prefix}<${sender}> ${bodyLines[0]}`; const plainFallback = bodyLines.join("\n> "); - const newBody = plainFallback + '\n\n' + body; + const newBody = plainFallback + "\n\n" + body; const newFormattedBody = formattedFallback + htmlEscape(body); return _createReplyContent(entry.id, msgtype, newBody, newFormattedBody); } diff --git a/src/matrix/room/timeline/persistence/GapWriter.js b/src/matrix/room/timeline/persistence/GapWriter.js index d9ad547622..6125fdf5a3 100644 --- a/src/matrix/room/timeline/persistence/GapWriter.js +++ b/src/matrix/room/timeline/persistence/GapWriter.js @@ -315,7 +315,7 @@ export function tests() { const firstFragment = await fetchFragment(mocks, firstFragmentEntry.fragmentId); const secondFragment = await fetchFragment(mocks, secondFragmentEntry.fragmentId); - assertFilledLink(assert, firstFragment, secondFragment) + assertFilledLink(assert, firstFragment, secondFragment); const firstEvents = await allFragmentEvents(mocks, firstFragmentEntry.fragmentId); assert.deepEqual(firstEvents.map(e => e.event_id), eventIds(0, 10)); const secondEvents = await allFragmentEvents(mocks, secondFragmentEntry.fragmentId); @@ -333,7 +333,7 @@ export function tests() { const firstFragment = await fetchFragment(mocks, firstFragmentEntry.fragmentId); const secondFragment = await fetchFragment(mocks, secondFragmentEntry.fragmentId); - assertGapLink(assert, firstFragment, secondFragment) + assertGapLink(assert, firstFragment, secondFragment); const firstEvents = await allFragmentEvents(mocks, firstFragmentEntry.fragmentId); assert.deepEqual(firstEvents.map(e => e.event_id), eventIds(0, 10)); const secondEvents = await allFragmentEvents(mocks, secondFragmentEntry.fragmentId); @@ -371,8 +371,8 @@ export function tests() { assert.deepEqual(secondEvents.map(e => e.event_id), [...eventIds(21,26), ...eventIds(10, 21)]); const firstFragment = await fetchFragment(mocks, firstFragmentEntry.fragmentId); const secondFragment = await fetchFragment(mocks, secondFragmentEntry.fragmentId); - assertFilledLink(assert, firstFragment, secondFragment) + assertFilledLink(assert, firstFragment, secondFragment); await mocks.txn.complete(); } - } + }; } diff --git a/src/matrix/room/timeline/persistence/MemberWriter.js b/src/matrix/room/timeline/persistence/MemberWriter.js index 9345324efc..eb4097864c 100644 --- a/src/matrix/room/timeline/persistence/MemberWriter.js +++ b/src/matrix/room/timeline/persistence/MemberWriter.js @@ -192,15 +192,15 @@ export function tests() { function createMemberEvent(membership, userId, displayName, avatarUrl) { idCounter += 1; return { - content: { + "content": { membership, "displayname": displayName, "avatar_url": avatarUrl }, - event_id: `$${idCounter}`, - sender: userId, + "event_id": `$${idCounter}`, + "sender": userId, "state_key": userId, - type: "m.room.member" + "type": "m.room.member" }; } @@ -219,7 +219,7 @@ export function tests() { members.set(member.userId, member); } } - } + }; } function member(...args) { diff --git a/src/matrix/room/timeline/persistence/RelationWriter.js b/src/matrix/room/timeline/persistence/RelationWriter.js index ae078bfcfe..3f664fe746 100644 --- a/src/matrix/room/timeline/persistence/RelationWriter.js +++ b/src/matrix/room/timeline/persistence/RelationWriter.js @@ -341,5 +341,5 @@ export function tests() { assert.equal(storedMessage.annotations["🐶"].count, 1); }, - } + }; } diff --git a/src/matrix/room/timeline/persistence/SyncWriter.js b/src/matrix/room/timeline/persistence/SyncWriter.js index 76c7bec725..a80c3027e5 100644 --- a/src/matrix/room/timeline/persistence/SyncWriter.js +++ b/src/matrix/room/timeline/persistence/SyncWriter.js @@ -285,5 +285,5 @@ export function tests() { // fake-indexeddb still aborts the transaction when preventDefault is called by tryInsert, so don't await as it will abort // await txn.complete(); }, - } + }; } diff --git a/src/matrix/room/timeline/relations.js b/src/matrix/room/timeline/relations.js index 2183a6c517..aa0804a40c 100644 --- a/src/matrix/room/timeline/relations.js +++ b/src/matrix/room/timeline/relations.js @@ -30,7 +30,7 @@ export function createAnnotation(targetId, key) { } export function getRelationTarget(relation) { - return relation.event_id || relation["m.in_reply_to"]?.event_id + return relation.event_id || relation["m.in_reply_to"]?.event_id; } export function setRelationTarget(relation, target) { diff --git a/src/mocks/Clock.js b/src/mocks/Clock.js index e060c24ec5..84c053c6f9 100644 --- a/src/mocks/Clock.js +++ b/src/mocks/Clock.js @@ -131,5 +131,5 @@ export function tests() { assert.strictEqual(counter, 3); interval.dispose(); } - } + }; } diff --git a/src/mocks/HomeServer.js b/src/mocks/HomeServer.js index 072344efe7..5fd5d0a060 100644 --- a/src/mocks/HomeServer.js +++ b/src/mocks/HomeServer.js @@ -35,7 +35,7 @@ class Target { } function handleMethod(target, name, ...args) { - let requests = target.requests[name] + let requests = target.requests[name]; if (!requests) { target.requests[name] = requests = []; } diff --git a/src/platform/web/Platform.js b/src/platform/web/Platform.js index be8c997078..f3b25726b8 100644 --- a/src/platform/web/Platform.js +++ b/src/platform/web/Platform.js @@ -99,12 +99,12 @@ function adaptUIOnVisualViewportResize(container) { return; } const handler = () => { - const sessionView = container.querySelector('.SessionView'); + const sessionView = container.querySelector(".SessionView"); if (!sessionView) { return; } - const scrollable = container.querySelector('.bottom-aligned-scroll'); + const scrollable = container.querySelector(".bottom-aligned-scroll"); let scrollTopBefore, heightBefore, heightAfter; if (scrollable) { @@ -116,17 +116,17 @@ function adaptUIOnVisualViewportResize(container) { // behind (last tested on iOS 14.4 simulator) so we have to compute the offset manually const offsetTop = sessionView.offsetTop + sessionView.offsetHeight - window.visualViewport.height; - container.style.setProperty('--ios-viewport-height', window.visualViewport.height.toString() + 'px'); - container.style.setProperty('--ios-viewport-top', offsetTop.toString() + 'px'); + container.style.setProperty("--ios-viewport-height", window.visualViewport.height.toString() + "px"); + container.style.setProperty("--ios-viewport-top", offsetTop.toString() + "px"); if (scrollable) { heightAfter = scrollable.offsetHeight; scrollable.scrollTop = scrollTopBefore + heightBefore - heightAfter; } }; - window.visualViewport.addEventListener('resize', handler); + window.visualViewport.addEventListener("resize", handler); return () => { - window.visualViewport.removeEventListener('resize', handler); + window.visualViewport.removeEventListener("resize", handler); }; } @@ -165,7 +165,7 @@ export class Platform { const isIE11 = !!window.MSInputMethodContext && !!document.documentMode; this.isIE11 = isIE11; // From https://stackoverflow.com/questions/9038625/detect-if-device-is-ios/9039885 - const isIOS = /iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) && !window.MSStream; + const isIOS = /iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1) && !window.MSStream; this.isIOS = isIOS; this._disposables = new Disposables(); this._olmPromise = undefined; @@ -304,7 +304,7 @@ export class Platform { } else { resolve(); } - } + }; input.addEventListener("change", checkFile, true); }); // IE11 needs the input to be attached to the document @@ -402,7 +402,7 @@ export function tests() { const logger = { _now() {return 5;} }; const logItem = new LogItem("test", 1, logger); logItem.error = new Error(); - logItem.error.stack = "main http://localhost:3000/src/main.js:55\n http://localhost:3000/?loginToken=secret:26" + logItem.error.stack = "main http://localhost:3000/src/main.js:55\n http://localhost:3000/?loginToken=secret:26"; logPersister.reportItem(logItem, null, false); const item = logPersister._queuedItems.pop(); assert.strictEqual(item.json.search("secret"), -1); diff --git a/src/platform/web/dom/BlobHandle.js b/src/platform/web/dom/BlobHandle.js index 32dd94c0e2..34a0cf12a2 100644 --- a/src/platform/web/dom/BlobHandle.js +++ b/src/platform/web/dom/BlobHandle.js @@ -48,30 +48,30 @@ limitations under the License. // text/html, text/xhtml, image/svg, image/svg+xml, image/pdf, and similar. const ALLOWED_BLOB_MIMETYPES = { - 'image/jpeg': true, - 'image/gif': true, - 'image/png': true, - - 'video/mp4': true, - 'video/webm': true, - 'video/ogg': true, - 'video/quicktime': true, - 'video/VP8': true, - - 'audio/mp4': true, - 'audio/webm': true, - 'audio/aac': true, - 'audio/mpeg': true, - 'audio/ogg': true, - 'audio/wave': true, - 'audio/wav': true, - 'audio/x-wav': true, - 'audio/x-pn-wav': true, - 'audio/flac': true, - 'audio/x-flac': true, + "image/jpeg": true, + "image/gif": true, + "image/png": true, + + "video/mp4": true, + "video/webm": true, + "video/ogg": true, + "video/quicktime": true, + "video/VP8": true, + + "audio/mp4": true, + "audio/webm": true, + "audio/aac": true, + "audio/mpeg": true, + "audio/ogg": true, + "audio/wave": true, + "audio/wav": true, + "audio/x-wav": true, + "audio/x-pn-wav": true, + "audio/flac": true, + "audio/x-flac": true, }; -const DEFAULT_MIMETYPE = 'application/octet-stream'; +const DEFAULT_MIMETYPE = "application/octet-stream"; export class BlobHandle { constructor(blob, buffer = null) { @@ -81,7 +81,7 @@ export class BlobHandle { } static fromBuffer(buffer, mimetype) { - mimetype = mimetype ? mimetype.split(";")[0].trim() : ''; + mimetype = mimetype ? mimetype.split(";")[0].trim() : ""; if (!ALLOWED_BLOB_MIMETYPES[mimetype]) { mimetype = DEFAULT_MIMETYPE; } diff --git a/src/platform/web/dom/Crypto.js b/src/platform/web/dom/Crypto.js index 441daf31b5..db5a1e0cb0 100644 --- a/src/platform/web/dom/Crypto.js +++ b/src/platform/web/dom/Crypto.js @@ -42,15 +42,15 @@ class HMACCrypto { */ async verify(key, mac, data, hash) { const opts = { - name: 'HMAC', + name: "HMAC", hash: {name: hashName(hash)}, }; const hmacKey = await subtleCryptoResult(this._subtleCrypto.importKey( - 'raw', + "raw", key, opts, false, - ['verify'], + ["verify"], ), "importKey"); const isVerified = await subtleCryptoResult(this._subtleCrypto.verify( opts, @@ -63,15 +63,15 @@ class HMACCrypto { async compute(key, data, hash) { const opts = { - name: 'HMAC', + name: "HMAC", hash: {name: hashName(hash)}, }; const hmacKey = await subtleCryptoResult(this._subtleCrypto.importKey( - 'raw', + "raw", key, opts, false, - ['sign'], + ["sign"], ), "importKey"); const buffer = await subtleCryptoResult(this._subtleCrypto.sign( opts, @@ -102,15 +102,15 @@ class DeriveCrypto { throw new Error("PBKDF2 is not supported"); } const key = await subtleCryptoResult(this._subtleCrypto.importKey( - 'raw', + "raw", password, - {name: 'PBKDF2'}, + {name: "PBKDF2"}, false, - ['deriveBits'], + ["deriveBits"], ), "importKey"); const keybits = await subtleCryptoResult(this._subtleCrypto.deriveBits( { - name: 'PBKDF2', + name: "PBKDF2", salt, iterations, hash: hashName(hash), @@ -135,7 +135,7 @@ class DeriveCrypto { return this._cryptoExtras.hkdf(this._crypto, key, salt, info, hash, length); } const hkdfkey = await subtleCryptoResult(this._subtleCrypto.importKey( - 'raw', + "raw", key, {name: "HKDF"}, false, @@ -183,7 +183,7 @@ class AESCrypto { selectedKey, opts, false, - ['decrypt'], + ["decrypt"], ), "importKey"); } catch (err) { throw new Error(`Could not import key for AES-CTR decryption: ${err.message}`); @@ -216,7 +216,7 @@ class AESCrypto { selectedKey, opts, false, - ['encrypt'], + ["encrypt"], ), "importKey"); } catch (err) { throw new Error(`Could not import key for AES-CTR encryption: ${err.message}`); @@ -265,7 +265,7 @@ function jwkKeyToRaw(jwkKey) { throw new Error(`Unknown algorithm: ${jwkKey.alg}`); } if (!jwkKey.key_ops.includes("decrypt")) { - throw new Error(`decrypt missing from key_ops`); + throw new Error("decrypt missing from key_ops"); } if (jwkKey.kty !== "oct") { throw new Error(`Invalid key type, "oct" expected: ${jwkKey.kty}`); diff --git a/src/platform/web/dom/History.js b/src/platform/web/dom/History.js index 81ddc7395d..66b794b916 100644 --- a/src/platform/web/dom/History.js +++ b/src/platform/web/dom/History.js @@ -72,11 +72,11 @@ export class History extends BaseObservableValue { onSubscribeFirst() { this._lastSessionHash = window.localStorage?.getItem("hydrogen_last_url_hash"); - window.addEventListener('hashchange', this); + window.addEventListener("hashchange", this); } onUnsubscribeLast() { - window.removeEventListener('hashchange', this); + window.removeEventListener("hashchange", this); } _storeHash(hash) { diff --git a/src/platform/web/dom/ImageHandle.js b/src/platform/web/dom/ImageHandle.js index 4ac3a6cd2e..4d111b9d98 100644 --- a/src/platform/web/dom/ImageHandle.js +++ b/src/platform/web/dom/ImageHandle.js @@ -97,7 +97,7 @@ export function hasReadPixelPermission() { Math.round(Math.random() * 255), Math.round(Math.random() * 255), Math.round(Math.random() * 255), - ] + ]; ctx.fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`; ctx.fillRect(0, 0, 1, 1); const data = ctx.getImageData(0, 0, 1, 1).data; diff --git a/src/platform/web/dom/OnlineStatus.js b/src/platform/web/dom/OnlineStatus.js index 4c316de68f..19288a2fb6 100644 --- a/src/platform/web/dom/OnlineStatus.js +++ b/src/platform/web/dom/OnlineStatus.js @@ -36,12 +36,12 @@ export class OnlineStatus extends BaseObservableValue { } onSubscribeFirst() { - window.addEventListener('offline', this._onOffline); - window.addEventListener('online', this._onOnline); + window.addEventListener("offline", this._onOffline); + window.addEventListener("online", this._onOnline); } onUnsubscribeLast() { - window.removeEventListener('offline', this._onOffline); - window.removeEventListener('online', this._onOnline); + window.removeEventListener("offline", this._onOffline); + window.removeEventListener("online", this._onOnline); } } diff --git a/src/platform/web/dom/download.js b/src/platform/web/dom/download.js index 2476d3dfed..19bfc7daea 100644 --- a/src/platform/web/dom/download.js +++ b/src/platform/web/dom/download.js @@ -27,7 +27,7 @@ export async function downloadInIframe(container, iframeSrc, blobHandle, filenam detach = () => { iframe.removeEventListener("load", resolve); iframe.removeEventListener("error", reject); - } + }; iframe.addEventListener("load", resolve); iframe.addEventListener("error", reject); }); diff --git a/src/platform/web/dom/request/common.js b/src/platform/web/dom/request/common.js index d6ed5074bc..a045e589f4 100644 --- a/src/platform/web/dom/request/common.js +++ b/src/platform/web/dom/request/common.js @@ -48,5 +48,5 @@ export function tests() { assert.equal(addCacheBuster("http://foo", random), "http://foo?_cacheBuster=4503599627370496"); assert.equal(addCacheBuster("http://foo?bar=baz", random), "http://foo?bar=baz&_cacheBuster=4503599627370496"); } - } + }; } diff --git a/src/platform/web/dom/request/fetch.js b/src/platform/web/dom/request/fetch.js index c2e2d4b7a9..2a49df618e 100644 --- a/src/platform/web/dom/request/fetch.js +++ b/src/platform/web/dom/request/fetch.js @@ -149,5 +149,5 @@ export function createFetchRequest(createTimeout, serviceWorkerHandler) { } return result; - } + }; } diff --git a/src/platform/web/parsehtml.js b/src/platform/web/parsehtml.js index e80ec9958c..bab8b29a0c 100644 --- a/src/platform/web/parsehtml.js +++ b/src/platform/web/parsehtml.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import DOMPurify from "dompurify" +import DOMPurify from "dompurify"; class HTMLParseResult { constructor(bodyNode) { @@ -56,9 +56,9 @@ class HTMLParseResult { const sanitizeConfig = { ALLOWED_URI_REGEXP: /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|xxx|mxc):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i, - FORBID_TAGS: ['mx-reply'], + FORBID_TAGS: ["mx-reply"], KEEP_CONTENT: false, -} +}; export function parseHTML(html) { // If DOMPurify uses DOMParser, can't we just get the built tree from it diff --git a/src/platform/web/sw.js b/src/platform/web/sw.js index 088bc05975..69bbe5b657 100644 --- a/src/platform/web/sw.js +++ b/src/platform/web/sw.js @@ -22,10 +22,10 @@ const HASHED_PRECACHED_ASSETS = DEFINE_HASHED_PRECACHED_ASSETS; const HASHED_CACHED_ON_REQUEST_ASSETS = DEFINE_HASHED_CACHED_ON_REQUEST_ASSETS; const unhashedCacheName = `hydrogen-assets-${DEFINE_GLOBAL_HASH}`; -const hashedCacheName = `hydrogen-assets`; -const mediaThumbnailCacheName = `hydrogen-media-thumbnails-v2`; +const hashedCacheName = "hydrogen-assets"; +const mediaThumbnailCacheName = "hydrogen-media-thumbnails-v2"; -self.addEventListener('install', function(e) { +self.addEventListener("install", function(e) { e.waitUntil((async () => { const unhashedCache = await caches.open(unhashedCacheName); await unhashedCache.addAll(UNHASHED_PRECACHED_ASSETS); @@ -38,7 +38,7 @@ self.addEventListener('install', function(e) { })()); }); -self.addEventListener('activate', (event) => { +self.addEventListener("activate", (event) => { // on a first page load/sw install, // start using the service worker on all pages straight away self.clients.claim(); @@ -68,7 +68,7 @@ async function purgeOldCaches() { } } -self.addEventListener('fetch', (event) => { +self.addEventListener("fetch", (event) => { /* service worker shouldn't handle xhr uploads because otherwise the progress events won't fire. @@ -198,7 +198,7 @@ async function readCache(request) { return response; } -self.addEventListener('message', (event) => { +self.addEventListener("message", (event) => { const reply = payload => event.source.postMessage({replyTo: event.data.id, payload}); const {replyTo} = event.data; if (replyTo) { @@ -245,7 +245,7 @@ async function openClientFromNotif(event) { console.log("notificationclick: client has session open, showing room there"); // use a message rather than clientWithSession.navigate here as this refreshes the page on chrome clientWithSession.postMessage({type: "openRoom", payload: {roomId}}); - if ('focus' in clientWithSession) { + if ("focus" in clientWithSession) { try { await clientWithSession.focus(); } catch (err) { console.error(err); } // I've had this throw on me on Android @@ -257,7 +257,7 @@ async function openClientFromNotif(event) { } } -self.addEventListener('notificationclick', event => { +self.addEventListener("notificationclick", event => { event.notification.close(); event.waitUntil(openClientFromNotif(event)); }); @@ -315,7 +315,7 @@ async function handlePushNotification(n) { // when no client is visible, see https://goo.gl/yqv4Q4 } -self.addEventListener('push', event => { +self.addEventListener("push", event => { event.waitUntil(handlePushNotification(event.data.json())); }); diff --git a/src/platform/web/ui/RootView.js b/src/platform/web/ui/RootView.js index 1db5c334b6..f33f882235 100644 --- a/src/platform/web/ui/RootView.js +++ b/src/platform/web/ui/RootView.js @@ -32,7 +32,7 @@ export class RootView extends TemplateView { return t.div({className: "StatusView"}, [ t.h1("Something went wrong"), t.p(vm.errorText), - ]) + ]); }); case "session": return new SessionView(vm.sessionViewModel); diff --git a/src/platform/web/ui/avatar.js b/src/platform/web/ui/avatar.js index ce2dfdabd8..8f37b10d7f 100644 --- a/src/platform/web/ui/avatar.js +++ b/src/platform/web/ui/avatar.js @@ -32,8 +32,8 @@ export function renderStaticAvatar(vm, size, extraClasses = undefined) { } const avatarContent = hasAvatar ? renderImg(vm, size) : text(vm.avatarLetter); const avatar = tag.div({ - className: avatarClasses, - title: vm.avatarTitle, + "className": avatarClasses, + "title": vm.avatarTitle, "data-testid": "avatar", }, [avatarContent]); if (hasAvatar) { diff --git a/src/platform/web/ui/login/SessionLoadView.js b/src/platform/web/ui/login/SessionLoadView.js index 4f546b70f8..56e14b67cf 100644 --- a/src/platform/web/ui/login/SessionLoadView.js +++ b/src/platform/web/ui/login/SessionLoadView.js @@ -24,7 +24,7 @@ export class SessionLoadView extends TemplateView { t.div({className: "SessionLoadView"}, [ t.view(new SessionLoadStatusView(vm)) ]), - t.div({className: {"button-row": true, hidden: vm => vm.loading}}, + t.div({className: {"button-row": true, "hidden": vm => vm.loading}}, t.a({className: "button-action primary", href: vm.backUrl}, vm.i18n`Go back`)) ]); } diff --git a/src/platform/web/ui/session/CreateRoomView.js b/src/platform/web/ui/session/CreateRoomView.js index 9d6c6bbc2b..156e5b1f11 100644 --- a/src/platform/web/ui/session/CreateRoomView.js +++ b/src/platform/web/ui/session/CreateRoomView.js @@ -33,7 +33,7 @@ export class CreateRoomView extends TemplateView { return new AvatarView(vm, 64); } else { return new StaticView(undefined, t => { - return t.div({className: "CreateRoomView_selectAvatarPlaceholder"}) + return t.div({className: "CreateRoomView_selectAvatarPlaceholder"}); }); } }) @@ -65,11 +65,11 @@ export class CreateRoomView extends TemplateView { t.label({for: "isPublic"}, vm.i18n`Public room, anyone can join`) ]), ]), - t.div({className: {"form-row check": true, hidden: vm => vm.isPublic}}, [ + t.div({className: {"form-row check": true, "hidden": vm => vm.isPublic}}, [ t.input({type: "checkbox", name: "isEncrypted", id: "isEncrypted", checked: vm.isEncrypted}), t.label({for: "isEncrypted"}, vm.i18n`Enable end-to-end encryption`) ]), - t.div({className: {"form-row text": true, hidden: vm => !vm.isPublic}}, [ + t.div({className: {"form-row text": true, "hidden": vm => !vm.isPublic}}, [ t.label({for: "roomAlias"}, vm.i18n`Room alias`), t.input({ onInput: evt => vm.setRoomAlias(evt.target.value), @@ -79,7 +79,7 @@ export class CreateRoomView extends TemplateView { t.div({className: "form-group"}, [ t.div(t.button({className: "link", type: "button", onClick: () => vm.toggleAdvancedShown()}, vm => vm.isAdvancedShown ? vm.i18n`Hide advanced settings` : vm.i18n`Show advanced settings`)), - t.div({className: {"form-row check": true, hidden: vm => !vm.isAdvancedShown}}, [ + t.div({className: {"form-row check": true, "hidden": vm => !vm.isAdvancedShown}}, [ t.input({type: "checkbox", name: "isFederationDisabled", id: "isFederationDisabled", checked: vm.isFederationDisabled}), t.label({for: "isFederationDisabled"}, [ vm.i18n`Disable federation`, diff --git a/src/platform/web/ui/session/leftpanel/LeftPanelView.js b/src/platform/web/ui/session/leftpanel/LeftPanelView.js index fb2feb5711..9a3e7f2500 100644 --- a/src/platform/web/ui/session/leftpanel/LeftPanelView.js +++ b/src/platform/web/ui/session/leftpanel/LeftPanelView.js @@ -29,23 +29,23 @@ class FilterField extends TemplateView { options.clear(); }; const filterInput = t.input({ - type: "text", - placeholder: options?.label, + "type": "text", + "placeholder": options?.label, "aria-label": options?.label, - autocomplete: options?.autocomplete, - enterkeyhint: 'search', - name: options?.name, - onInput: event => options.set(event.target.value), - onKeydown: event => { + "autocomplete": options?.autocomplete, + "enterkeyhint": "search", + "name": options?.name, + "onInput": event => options.set(event.target.value), + "onKeydown": event => { if (event.key === "Escape" || event.key === "Esc") { clear(); } }, - onFocus: () => filterInput.select() + "onFocus": () => filterInput.select() }); const clearButton = t.button({ - onClick: clear, - title: options.i18n`Clear`, + "onClick": clear, + "title": options.i18n`Clear`, "aria-label": options.i18n`Clear` }); return t.div({className: "FilterField"}, [filterInput, clearButton]); @@ -72,7 +72,7 @@ export class LeftPanelView extends TemplateView { tileVM => new RoomTileView(tileVM) )); const utilitiesRow = t.div({className: "utilities"}, [ - t.a({className: "button-utility close-session", href: vm.closeUrl, "aria-label": vm.i18n`Back to account list`, title: vm.i18n`Back to account list`}), + t.a({"className": "button-utility close-session", "href": vm.closeUrl, "aria-label": vm.i18n`Back to account list`, "title": vm.i18n`Back to account list`}), t.view(new FilterField({ i18n: vm.i18n, label: vm.i18n`Filter rooms…`, @@ -87,20 +87,20 @@ export class LeftPanelView extends TemplateView { clear: () => vm.clearFilter() })), t.button({ - onClick: () => vm.toggleGrid(), - className: { + "onClick": () => vm.toggleGrid(), + "className": { "button-utility": true, - grid: true, - on: vm => vm.gridEnabled + "grid": true, + "on": vm => vm.gridEnabled }, - title: gridButtonLabel, + "title": gridButtonLabel, "aria-label": gridButtonLabel }), - t.a({className: "button-utility settings", href: vm.settingsUrl, "aria-label": vm.i18n`Settings`, title: vm.i18n`Settings`}), + t.a({"className": "button-utility settings", "href": vm.settingsUrl, "aria-label": vm.i18n`Settings`, "title": vm.i18n`Settings`}), t.button({ - className: "button-utility create", + "className": "button-utility create", "aria-label": vm.i18n`Create room`, - onClick: evt => this._toggleCreateMenu(evt) + "onClick": evt => this._toggleCreateMenu(evt) }), ]); diff --git a/src/platform/web/ui/session/leftpanel/RoomTileView.js b/src/platform/web/ui/session/leftpanel/RoomTileView.js index 4875c16746..038753a589 100644 --- a/src/platform/web/ui/session/leftpanel/RoomTileView.js +++ b/src/platform/web/ui/session/leftpanel/RoomTileView.js @@ -29,7 +29,7 @@ export class RoomTileView extends TemplateView { t.a({href: vm.url}, [ t.view(new AvatarView(vm, 32), {parentProvidesUpdates: true}), t.div({className: "description"}, [ - t.div({className: {"name": true, unread: vm => vm.isUnread}}, vm => vm.name), + t.div({className: {"name": true, "unread": vm => vm.isUnread}}, vm => vm.name), t.map(vm => vm.busy, busy => { if (busy) { return spinner(t); diff --git a/src/platform/web/ui/session/rightpanel/MemberDetailsView.js b/src/platform/web/ui/session/rightpanel/MemberDetailsView.js index 5d2f9387e3..5e7d7b3bff 100644 --- a/src/platform/web/ui/session/rightpanel/MemberDetailsView.js +++ b/src/platform/web/ui/session/rightpanel/MemberDetailsView.js @@ -20,7 +20,7 @@ import {TemplateView} from "../../general/TemplateView"; export class MemberDetailsView extends TemplateView { render(t, vm) { return t.div({className: "MemberDetailsView"}, - [ t.view(new AvatarView(vm, 128)), + [ t.view(new AvatarView(vm, 128)), t.div({className: "MemberDetailsView_name"}, t.h2(vm => vm.name)), t.div({className: "MemberDetailsView_id"}, vm.userId), this._createSection(t, vm.i18n`Role`, vm => vm.role), diff --git a/src/platform/web/ui/session/room/InviteView.js b/src/platform/web/ui/session/room/InviteView.js index 993453609e..1f80dcfd7e 100644 --- a/src/platform/web/ui/session/room/InviteView.js +++ b/src/platform/web/ui/session/room/InviteView.js @@ -30,7 +30,7 @@ export class InviteView extends TemplateView { } else if (vm.inviter) { inviterNodes = [renderStaticAvatar(vm.inviter, 24), t.strong(vm.inviter.name), ` (${vm.inviter.id}) invited you.`]; } else { - inviterNodes = `You were invited to join.`; + inviterNodes = "You were invited to join."; } inviteNodes.push(t.p({className: "InviteView_inviter"}, inviterNodes)); if (!vm.isDirectMessage) { diff --git a/src/platform/web/ui/session/room/LightboxView.js b/src/platform/web/ui/session/room/LightboxView.js index 9fbf392a30..0c464fdef0 100644 --- a/src/platform/web/ui/session/room/LightboxView.js +++ b/src/platform/web/ui/session/room/LightboxView.js @@ -21,14 +21,14 @@ export class LightboxView extends TemplateView { render(t, vm) { const close = t.a({href: vm.closeUrl, title: vm.i18n`Close`, className: "close"}); const image = t.div({ - role: "img", + "role": "img", "aria-label": vm => vm.name, - title: vm => vm.name, - className: { + "title": vm => vm.name, + "className": { picture: true, hidden: vm => !vm.imageUrl, }, - style: vm => `background-image: url('${vm.imageUrl}'); max-width: ${vm.imageWidth}px; max-height: ${vm.imageHeight}px;` + "style": vm => `background-image: url('${vm.imageUrl}'); max-width: ${vm.imageWidth}px; max-height: ${vm.imageHeight}px;` }); const loading = t.div({ className: { @@ -91,6 +91,6 @@ function trapFocus(t, element) { } function focusables(element) { - return element.querySelectorAll('a[href], button, textarea, input, select'); + return element.querySelectorAll("a[href], button, textarea, input, select"); } diff --git a/src/platform/web/ui/session/room/RoomView.js b/src/platform/web/ui/session/room/RoomView.js index 727fb44ddd..5367b77b36 100644 --- a/src/platform/web/ui/session/room/RoomView.js +++ b/src/platform/web/ui/session/room/RoomView.js @@ -42,9 +42,9 @@ export class RoomView extends TemplateView { t.h2(vm => vm.name), ]), t.button({ - className: "button-utility room-options", + "className": "button-utility room-options", "aria-label":vm.i18n`Room options`, - onClick: evt => this._toggleOptionsMenu(evt) + "onClick": evt => this._toggleOptionsMenu(evt) }) ]), t.div({className: "RoomView_body"}, [ diff --git a/src/platform/web/ui/session/room/timeline/AnnouncementView.js b/src/platform/web/ui/session/room/timeline/AnnouncementView.js index 8b68d33bd5..6161d9d108 100644 --- a/src/platform/web/ui/session/room/timeline/AnnouncementView.js +++ b/src/platform/web/ui/session/room/timeline/AnnouncementView.js @@ -24,8 +24,8 @@ export class AnnouncementView extends TemplateView { render(t, vm) { return t.li({ - className: "AnnouncementView", - 'data-event-id': vm.eventId + "className": "AnnouncementView", + "data-event-id": vm.eventId }, t.div(vm => vm.announcement)); } diff --git a/src/platform/web/ui/session/room/timeline/BaseMediaView.js b/src/platform/web/ui/session/room/timeline/BaseMediaView.js index bc49b3f661..69e25b887b 100644 --- a/src/platform/web/ui/session/room/timeline/BaseMediaView.js +++ b/src/platform/web/ui/session/room/timeline/BaseMediaView.js @@ -53,7 +53,7 @@ export class BaseMediaView extends BaseMessageView { children.push(progress); } return t.div({className: "Timeline_messageBody"}, [ - t.div({className: "media", style: `max-width: ${vm.width}px`, "data-testid": "media"}, children), + t.div({"className": "media", "style": `max-width: ${vm.width}px`, "data-testid": "media"}, children), t.if(vm => vm.error, t => t.p({className: "error"}, vm.error)) ]); } diff --git a/src/platform/web/ui/session/room/timeline/BaseMessageView.js b/src/platform/web/ui/session/room/timeline/BaseMessageView.js index d998e8269b..6fe26f10c7 100644 --- a/src/platform/web/ui/session/room/timeline/BaseMessageView.js +++ b/src/platform/web/ui/session/room/timeline/BaseMessageView.js @@ -42,15 +42,15 @@ export class BaseMessageView extends TemplateView { children.push(t.button({className: "Timeline_messageOptions"}, "⋯")); } const li = t.el(this._tagName, { - className: { + "className": { "Timeline_message": true, - own: vm.isOwn, - unsent: vm.isUnsent, - unverified: vm => vm.isUnverified, - disabled: !this._interactive, - continuation: vm => vm.isContinuation, + "own": vm.isOwn, + "unsent": vm.isUnsent, + "unverified": vm => vm.isUnverified, + "disabled": !this._interactive, + "continuation": vm => vm.isContinuation, }, - 'data-event-id': vm.eventId + "data-event-id": vm.eventId }, children); // given that there can be many tiles, we don't add // unneeded DOM nodes in case of a continuation, and we add it diff --git a/src/platform/web/ui/session/room/timeline/ReactionsView.js b/src/platform/web/ui/session/room/timeline/ReactionsView.js index 5e4c97bcbf..52c0af2bea 100644 --- a/src/platform/web/ui/session/room/timeline/ReactionsView.js +++ b/src/platform/web/ui/session/room/timeline/ReactionsView.js @@ -24,7 +24,7 @@ export class ReactionsView extends ListView { tagName: "div", list: reactionsViewModel.reactions, onItemClick: reactionView => reactionView.onClick(), - } + }; super(options, reactionVM => new ReactionView(reactionVM)); } } diff --git a/src/platform/web/ui/session/room/timeline/ReplyPreviewView.js b/src/platform/web/ui/session/room/timeline/ReplyPreviewView.js index 219e435775..a07b76dbe6 100644 --- a/src/platform/web/ui/session/room/timeline/ReplyPreviewView.js +++ b/src/platform/web/ui/session/room/timeline/ReplyPreviewView.js @@ -25,7 +25,7 @@ export class ReplyPreviewView extends TemplateView { render(t, vm) { const TileView = this._viewClassForTile(vm); if (!TileView) { - throw new Error(`Shape ${vm.shape} is unrecognized.`) + throw new Error(`Shape ${vm.shape} is unrecognized.`); } const view = new TileView(vm, this._viewClassForTile, { reply: true, interactive: false }); return t.div( diff --git a/src/platform/web/ui/session/room/timeline/TextMessageView.js b/src/platform/web/ui/session/room/timeline/TextMessageView.js index a6741de7db..e1bdf7a701 100644 --- a/src/platform/web/ui/session/room/timeline/TextMessageView.js +++ b/src/platform/web/ui/session/room/timeline/TextMessageView.js @@ -24,7 +24,7 @@ export class TextMessageView extends BaseMessageView { const container = t.div({ className: { "Timeline_messageBody": true, - statusMessage: vm => vm.shape === "message-status", + "statusMessage": vm => vm.shape === "message-status", } }, t.mapView(vm => vm.replyTile, replyTile => { if (this._isReplyPreview) { @@ -71,10 +71,10 @@ function renderList(listBlock) { function renderImage(imagePart) { const attributes = { src: imagePart.src }; - if (imagePart.width) { attributes.width = imagePart.width } - if (imagePart.height) { attributes.height = imagePart.height } - if (imagePart.alt) { attributes.alt = imagePart.alt } - if (imagePart.title) { attributes.title = imagePart.title } + if (imagePart.width) { attributes.width = imagePart.width; } + if (imagePart.height) { attributes.height = imagePart.height; } + if (imagePart.alt) { attributes.alt = imagePart.alt; } + if (imagePart.title) { attributes.title = imagePart.title; } return tag.img(attributes); } @@ -94,7 +94,7 @@ function renderTable(tablePart) { if (tablePart.head) { const headers = tablePart.head .map(cell => tag.th(renderParts(cell))); - children.push(tag.thead(tag.tr(headers))) + children.push(tag.thead(tag.tr(headers))); } const rows = []; for (const row of tablePart.body) { diff --git a/src/platform/web/ui/session/settings/KeyBackupSettingsView.js b/src/platform/web/ui/session/settings/KeyBackupSettingsView.js index a68a80b3ed..ee960e65bc 100644 --- a/src/platform/web/ui/session/settings/KeyBackupSettingsView.js +++ b/src/platform/web/ui/session/settings/KeyBackupSettingsView.js @@ -37,7 +37,7 @@ export class KeyBackupSettingsView extends TemplateView { max: 100, value: vm => vm.backupPercentage, }); - return t.div([`Backup in progress `, progress, " ", vm => vm.backupInProgressLabel]); + return t.div(["Backup in progress ", progress, " ", vm => vm.backupInProgressLabel]); } case "Stopped": { let label; @@ -45,27 +45,26 @@ export class KeyBackupSettingsView extends TemplateView { if (error) { label = `Backup has stopped because of an error: ${vm.backupError}`; } else { - label = `Backup has stopped`; + label = "Backup has stopped"; } - return t.p(label, " ", t.button({onClick: () => vm.startBackup()}, `Backup now`)); + return t.p(label, " ", t.button({onClick: () => vm.startBackup()}, "Backup now")); } case "Done": - return t.p(`All keys are backed up.`); + return t.p("All keys are backed up."); default: return null; } }), t.if(vm => vm.isMasterKeyTrusted, t => { - return t.p("Cross-signing master key found and trusted.") + return t.p("Cross-signing master key found and trusted."); }), t.if(vm => vm.canSignOwnDevice, t => { return t.button({ - onClick: disableTargetCallback(async evt => { + onClick: disableTargetCallback(async () => { await vm.signOwnDevice(); }) }, "Sign own device"); }), - ]); } } @@ -125,7 +124,7 @@ function renderEnableFieldRow(t, vm, label, callback) { t.label({for: setupDehydrationCheck.id}, [vm.i18n`Back up my device as well (`, moreInfo, ")"]) ])); } - return t.div({className: `row`}, [ + return t.div({className: "row"}, [ t.div({className: "label"}, label), t.div({className: "content"}, children), ]); @@ -136,7 +135,7 @@ function renderError(t) { return t.div([ t.p({className: "error"}, vm => vm.i18n`Could not enable key backup: ${vm.error}.`), t.p(vm.i18n`Try double checking that you did not mix up your security key, security phrase and login password as explained above.`) - ]) + ]); }); } diff --git a/src/platform/web/ui/session/settings/SettingsView.js b/src/platform/web/ui/session/settings/SettingsView.js index aea1108af0..0bbf40a1b1 100644 --- a/src/platform/web/ui/session/settings/SettingsView.js +++ b/src/platform/web/ui/session/settings/SettingsView.js @@ -16,8 +16,8 @@ limitations under the License. import {TemplateView} from "../../general/TemplateView"; import {disableTargetCallback} from "../../general/utils"; -import {KeyBackupSettingsView} from "./KeyBackupSettingsView.js" -import {FeaturesView} from "./FeaturesView" +import {KeyBackupSettingsView} from "./KeyBackupSettingsView.js"; +import {FeaturesView} from "./FeaturesView"; export class SettingsView extends TemplateView { render(t, vm) {