From 131f499c25828b0c52401ca7556c14b78f23bbbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 27 Feb 2021 08:04:20 +0100 Subject: [PATCH 001/619] Add Confirm Public Encrypted Room dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../tabs/room/SecurityRoomSettingsTab.js | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js index f72e78fa3f..b1be77064a 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js @@ -147,7 +147,7 @@ export default class SecurityRoomSettingsTab extends React.Component { }); }; - _onRoomAccessRadioToggle = (roomAccess) => { + _setRoomAccess = (roomAccess) => { // join_rule // INVITE | PUBLIC // ----------------------+---------------- @@ -191,6 +191,29 @@ export default class SecurityRoomSettingsTab extends React.Component { console.error(e); this.setState({guestAccess: beforeGuestAccess}); }); + } + + _onRoomAccessRadioToggle = async (roomAccess) => { + if ( + this.state.encrypted && + this.state.joinRule != "public" && + roomAccess != "invite_only" + ) { + Modal.createTrackedDialog('Confirm Public Encrypted Room', '', QuestionDialog, { + title: _t('Confirm making this room public?'), + description: _t( + "Making end-to-end encrypted rooms public renders the " + + "encryption pointless, wastes processing power, and can cause " + + "performance problems. Please consider creating a separate " + + "unencrypted public room.", + ), + onFinished: (confirm) => { + if (confirm) this._setRoomAccess(roomAccess); + }, + }); + } else { + this._setRoomAccess(roomAccess); + } }; _onHistoryRadioToggle = (history) => { From 0d9bc009689ad2df73cc8a601ca70a4f7c3e2ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 27 Feb 2021 08:04:30 +0100 Subject: [PATCH 002/619] i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/i18n/strings/en_EN.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 5bbbdf60b5..10d0b56e7f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1337,6 +1337,8 @@ "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", "Enable encryption?": "Enable encryption?", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", + "Confirm making this room public?": "Confirm making this room public?", + "Making end-to-end encrypted rooms public renders the encryption pointless, wastes processing power, and can cause performance problems. Please consider creating a separate unencrypted public room.": "Making end-to-end encrypted rooms public renders the encryption pointless, wastes processing power, and can cause performance problems. Please consider creating a separate unencrypted public room.", "Guests cannot join this room even if explicitly invited.": "Guests cannot join this room even if explicitly invited.", "Click here to fix": "Click here to fix", "To link to this room, please add an address.": "To link to this room, please add an address.", From 5d6bc9a88663463587768c49495e8c03e8f77a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 28 Feb 2021 08:29:31 +0100 Subject: [PATCH 003/619] Add second Confirm Public Encrypted Room dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../tabs/room/SecurityRoomSettingsTab.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js index b1be77064a..e3c23c890c 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js @@ -91,7 +91,24 @@ export default class SecurityRoomSettingsTab extends React.Component { if (refreshWhenTypes.includes(e.getType())) this.forceUpdate(); }; - _onEncryptionChange = (e) => { + _onEncryptionChange = async (e) => { + if (this.state.joinRule == "public") { + const {finished} = Modal.createTrackedDialog('Confirm Public Encrypted Room', '', QuestionDialog, { + title: _t('Enable encryption in a public room?'), + description: _t( + "Note that enabling encryption in public rooms renders the " + + "encryption pointless, wastes processing power, and can cause " + + "performance problems. Please consider creating a separate " + + "encrypted room.", + ), + }); + const [confirm] = await finished; + if (!confirm) { + this.setState({encrypted: false}); + return; + } + } + Modal.createTrackedDialog('Enable encryption', '', QuestionDialog, { title: _t('Enable encryption?'), description: _t( From 5a55b0dcf03e1a86a1a5eb3a33a9664b186d75bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 28 Feb 2021 08:29:37 +0100 Subject: [PATCH 004/619] i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/i18n/strings/en_EN.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 10d0b56e7f..42ad88c01e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1335,6 +1335,8 @@ "Roles & Permissions": "Roles & Permissions", "Permissions": "Permissions", "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", + "Enable encryption in a public room?": "Enable encryption in a public room?", + "Note that enabling encryption in public rooms renders the encryption pointless, wastes processing power, and can cause performance problems. Please consider creating a separate encrypted room.": "Note that enabling encryption in public rooms renders the encryption pointless, wastes processing power, and can cause performance problems. Please consider creating a separate encrypted room.", "Enable encryption?": "Enable encryption?", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", "Confirm making this room public?": "Confirm making this room public?", From 24428783f53dfe88b79477374cc8f34e88fc98c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 28 Feb 2021 09:54:05 +0100 Subject: [PATCH 005/619] Remove unnecessary async MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/settings/tabs/room/SecurityRoomSettingsTab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js index e3c23c890c..ccc5470265 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.js @@ -210,7 +210,7 @@ export default class SecurityRoomSettingsTab extends React.Component { }); } - _onRoomAccessRadioToggle = async (roomAccess) => { + _onRoomAccessRadioToggle = (roomAccess) => { if ( this.state.encrypted && this.state.joinRule != "public" && From 6a5ea970e940bb53671103fe222f0d2220db114b Mon Sep 17 00:00:00 2001 From: Panagiotis <27917356+panoschal@users.noreply.github.com> Date: Sat, 13 Mar 2021 15:20:42 +0200 Subject: [PATCH 006/619] fix: make call area smaller on small screens so that it doesn't need a scrollbar --- res/css/views/voip/_CallView.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index 7eb329594a..4ade5d90f8 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -30,6 +30,9 @@ limitations under the License. .mx_CallView_voice { height: 360px; + @media only screen and (max-height: 768px) { + height: 300px; + } } } From 879dd6eaeac1c91c66ed9329e382c830ad92cd21 Mon Sep 17 00:00:00 2001 From: Panagiotis <27917356+panoschal@users.noreply.github.com> Date: Sat, 13 Mar 2021 15:24:26 +0200 Subject: [PATCH 007/619] fix: make status bar area not show when it is undefined e.g. when user is in call, and there are search results --- src/components/structures/RoomView.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 706cd5ded8..2fdb193389 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -1841,6 +1841,17 @@ export default class RoomView extends React.Component { />; } + const statusBarAreaClass = classNames("mx_RoomView_statusArea", { + "mx_RoomView_statusArea_expanded": isStatusAreaExpanded, + }); + + const statusBarArea = statusBar &&
+
+
+ {statusBar} +
+
+ const roomVersionRecommendation = this.state.upgradeRecommendation; const showRoomUpgradeBar = ( roomVersionRecommendation && @@ -2052,10 +2063,6 @@ export default class RoomView extends React.Component { />); } - const statusBarAreaClass = classNames("mx_RoomView_statusArea", { - "mx_RoomView_statusArea_expanded": isStatusAreaExpanded, - }); - const showRightPanel = this.state.room && this.state.showRightPanel; const rightPanel = showRightPanel ? @@ -2104,12 +2111,7 @@ export default class RoomView extends React.Component { {messagePanel} {searchResultsPanel}
-
-
-
- {statusBar} -
-
+ {statusBarArea} {previewBar} {messageComposer}
From 4d2ecc98b0c4d0d9e5a357e930203b6c917ccb8c Mon Sep 17 00:00:00 2001 From: Panagiotis <27917356+panoschal@users.noreply.github.com> Date: Sat, 13 Mar 2021 19:11:57 +0200 Subject: [PATCH 008/619] fix: decrease the size of CallView on smaller screens so that when the user opens the search box, it does not disappear, and AuxPanel does not need an awkward scrollbar --- res/css/views/voip/_CallView.scss | 2 +- src/components/views/voip/CallView.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index 4ade5d90f8..7f01aecbcd 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -31,7 +31,7 @@ limitations under the License. .mx_CallView_voice { height: 360px; @media only screen and (max-height: 768px) { - height: 300px; + height: 220px; } } } diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 9bdc8fb11d..762a2bb941 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -538,7 +538,8 @@ export default class CallView extends React.Component { {callControls} ; } else { - const avatarSize = this.props.pipMode ? 76 : 160; + const normalAvatarSize = window.innerHeight <= 768 ? 120 : 160; + const avatarSize = this.props.pipMode ? 76 : normalAvatarSize; const classes = classNames({ mx_CallView_voice: true, mx_CallView_voice_hold: isOnHold, From e5794a4c80a3c9fe8f4e02e2f25a18220e5d4a8e Mon Sep 17 00:00:00 2001 From: Panagiotis <27917356+panoschal@users.noreply.github.com> Date: Sat, 13 Mar 2021 19:52:59 +0200 Subject: [PATCH 009/619] linter --- res/css/views/voip/_CallView.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index 7f01aecbcd..c7e2456a16 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -30,6 +30,7 @@ limitations under the License. .mx_CallView_voice { height: 360px; + @media only screen and (max-height: 768px) { height: 220px; } From e91f4b7eb25622dcee27ac4b608ddddd802d1ed2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Apr 2021 19:15:19 +0200 Subject: [PATCH 010/619] Add model var MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/SendMessageComposer.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 75bc943146..a3e841a0e2 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -328,6 +328,8 @@ export default class SendMessageComposer extends React.Component { } async _sendMessage() { + const model = this.model; + if (this.model.isEmpty) { return; } @@ -336,7 +338,7 @@ export default class SendMessageComposer extends React.Component { let shouldSend = true; let content; - if (!containsEmote(this.model) && this._isSlashCommand()) { + if (!containsEmote(model) && this._isSlashCommand()) { const [cmd, args, commandText] = this._getSlashCommand(); if (cmd) { if (cmd.category === CommandCategories.messages) { @@ -377,7 +379,7 @@ export default class SendMessageComposer extends React.Component { } } - if (isQuickReaction(this.model)) { + if (isQuickReaction(model)) { shouldSend = false; this._sendQuickReaction(); } @@ -386,7 +388,7 @@ export default class SendMessageComposer extends React.Component { const startTime = CountlyAnalytics.getTimestamp(); const {roomId} = this.props.room; if (!content) { - content = createMessageContent(this.model, this.props.permalinkCreator, replyToEvent); + content = createMessageContent(model, this.props.permalinkCreator, replyToEvent); } // don't bother sending an empty message if (!content.body.trim()) return; @@ -409,9 +411,9 @@ export default class SendMessageComposer extends React.Component { CountlyAnalytics.instance.trackSendMessage(startTime, prom, roomId, false, !!replyToEvent, content); } - this.sendHistoryManager.save(this.model, replyToEvent); + this.sendHistoryManager.save(model, replyToEvent); // clear composer - this.model.reset([]); + model.reset([]); this._editorRef.clearUndoHistory(); this._editorRef.focus(); this._clearStoredEditorState(); From 3edf05d38d72ec72522842d7e27a2e298b2e077c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 18 Apr 2021 08:43:00 +0200 Subject: [PATCH 011/619] Replace emoji at the end of a message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/rooms/BasicMessageComposer.tsx | 15 ++++++++++----- src/components/views/rooms/SendMessageComposer.js | 7 ++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 9d9e3a1ba0..f19b5903df 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -51,6 +51,7 @@ import {replaceableComponent} from "../../../utils/replaceableComponent"; // matches emoticons which follow the start of a line or whitespace const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$'); +export const REGEX_EMOTICON = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')$'); const IS_MAC = navigator.platform.indexOf("Mac") !== -1; @@ -150,7 +151,7 @@ export default class BasicMessageEditor extends React.Component } } - private replaceEmoticon = (caretPosition: DocumentPosition) => { + public replaceEmoticon(caretPosition: DocumentPosition, regex: RegExp) { const {model} = this.props; const range = model.startRange(caretPosition); // expand range max 8 characters backwards from caretPosition, @@ -161,7 +162,7 @@ export default class BasicMessageEditor extends React.Component n -= 1; return n >= 0 && (part.type === "plain" || part.type === "pill-candidate"); }); - const emoticonMatch = REGEX_EMOTICON_WHITESPACE.exec(range.text); + const emoticonMatch = regex.exec(range.text); if (emoticonMatch) { const query = emoticonMatch[1].replace("-", ""); // try both exact match and lower-case, this means that xd won't match xD but :P will match :p @@ -180,7 +181,7 @@ export default class BasicMessageEditor extends React.Component return range.replace([partCreator.plain(data.unicode + " ")]); } } - }; + } private updateEditorState = (selection: Caret, inputType?: string, diff?: IDiff) => { renderModel(this.editorRef.current, this.props.model); @@ -567,8 +568,7 @@ export default class BasicMessageEditor extends React.Component }; private configureEmoticonAutoReplace = () => { - const shouldReplace = SettingsStore.getValue('MessageComposerInput.autoReplaceEmoji'); - this.props.model.setTransformCallback(shouldReplace ? this.replaceEmoticon : null); + this.props.model.setTransformCallback(this.transform); }; private configureShouldShowPillAvatar = () => { @@ -576,6 +576,11 @@ export default class BasicMessageEditor extends React.Component this.setState({ showPillAvatar }); }; + private transform = (documentPosition: DocumentPosition) => { + const shouldReplace = SettingsStore.getValue('MessageComposerInput.autoReplaceEmoji'); + if (shouldReplace) this.replaceEmoticon(documentPosition, REGEX_EMOTICON_WHITESPACE); + } + componentWillUnmount() { document.removeEventListener("selectionchange", this.onSelectionChange); this.editorRef.current.removeEventListener("input", this.onInput, true); diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index a3e841a0e2..703d409b00 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -28,7 +28,7 @@ import { stripPrefix, } from '../../../editor/serialize'; import {CommandPartCreator} from '../../../editor/parts'; -import BasicMessageComposer from "./BasicMessageComposer"; +import BasicMessageComposer, {REGEX_EMOTICON} from "./BasicMessageComposer"; import ReplyThread from "../elements/ReplyThread"; import {parseEvent} from '../../../editor/deserialize'; import {findEditableEvent} from '../../../utils/EventUtils'; @@ -334,6 +334,11 @@ export default class SendMessageComposer extends React.Component { return; } + // Replace emoticon at the end of the message + const caret = this._editorRef.getCaret(); + const position = model.positionForOffset(caret.offset, caret.atNodeEnd); + this._editorRef.replaceEmoticon(position, REGEX_EMOTICON); + const replyToEvent = this.props.replyToEvent; let shouldSend = true; let content; From 609196a240a8783576fea33599c343a68648e53f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 18 Apr 2021 10:02:50 +0200 Subject: [PATCH 012/619] Replace emoticon before a newline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/rooms/BasicMessageComposer.tsx | 15 ++++++++++----- src/editor/range.ts | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index f19b5903df..e84d8bb9c0 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -50,7 +50,7 @@ import { AutocompleteAction, getKeyBindingsManager, MessageComposerAction } from import {replaceableComponent} from "../../../utils/replaceableComponent"; // matches emoticons which follow the start of a line or whitespace -const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s$'); +const REGEX_EMOTICON_WHITESPACE = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')\\s|:^$'); export const REGEX_EMOTICON = new RegExp('(?:^|\\s)(' + EMOTICON_REGEX.source + ')$'); const IS_MAC = navigator.platform.indexOf("Mac") !== -1; @@ -160,7 +160,7 @@ export default class BasicMessageEditor extends React.Component range.expandBackwardsWhile((index, offset) => { const part = model.parts[index]; n -= 1; - return n >= 0 && (part.type === "plain" || part.type === "pill-candidate"); + return n >= 0 && ["plain", "pill-candidate", "newline"].includes(part.type); }); const emoticonMatch = regex.exec(range.text); if (emoticonMatch) { @@ -170,15 +170,20 @@ export default class BasicMessageEditor extends React.Component if (data) { const {partCreator} = model; - const hasPrecedingSpace = emoticonMatch[0][0] === " "; + const moveStart = emoticonMatch[0][0] === " " ? 1 : 0; + const moveEnd = emoticonMatch[0].length - emoticonMatch.length - moveStart; + // we need the range to only comprise of the emoticon // because we'll replace the whole range with an emoji, // so move the start forward to the start of the emoticon. // Take + 1 because index is reported without the possible preceding space. - range.moveStart(emoticonMatch.index + (hasPrecedingSpace ? 1 : 0)); + range.moveStart(emoticonMatch.index + moveStart); + // and move end backwards so that we don't replace the trailing space/newline + range.moveEndBackwards(moveEnd); + // this returns the amount of added/removed characters during the replace // so the caret position can be adjusted. - return range.replace([partCreator.plain(data.unicode + " ")]); + return range.replace([partCreator.plain(data.unicode)]); } } } diff --git a/src/editor/range.ts b/src/editor/range.ts index 838dfd8b98..b390ad1d5e 100644 --- a/src/editor/range.ts +++ b/src/editor/range.ts @@ -39,6 +39,13 @@ export default class Range { }); } + moveEndBackwards(delta: number) { + this._end = this._end.backwardsWhile(this.model, () => { + delta -= 1; + return delta >= 0; + }); + } + trim() { this._start = this._start.forwardsWhile(this.model, whitespacePredicate); this._end = this._end.backwardsWhile(this.model, whitespacePredicate); From d36f8ccb95bce378026f7a17d9d49fe99191abcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 18 Apr 2021 10:18:49 +0200 Subject: [PATCH 013/619] Rename moveStart to moveStartForwards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So it it's clear what it does Signed-off-by: Šimon Brandner --- src/components/views/rooms/BasicMessageComposer.tsx | 2 +- src/editor/range.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index e84d8bb9c0..09f43fc9a4 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -177,7 +177,7 @@ export default class BasicMessageEditor extends React.Component // because we'll replace the whole range with an emoji, // so move the start forward to the start of the emoticon. // Take + 1 because index is reported without the possible preceding space. - range.moveStart(emoticonMatch.index + moveStart); + range.moveStartForwards(emoticonMatch.index + moveStart); // and move end backwards so that we don't replace the trailing space/newline range.moveEndBackwards(moveEnd); diff --git a/src/editor/range.ts b/src/editor/range.ts index b390ad1d5e..313a1b9ac8 100644 --- a/src/editor/range.ts +++ b/src/editor/range.ts @@ -32,7 +32,7 @@ export default class Range { this._end = bIsLarger ? positionB : positionA; } - moveStart(delta: number) { + moveStartForwards(delta: number) { this._start = this._start.forwardsWhile(this.model, () => { delta -= 1; return delta >= 0; From 02c13788236b13dbcbcfe490e497a784c766996d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 22 May 2021 17:19:07 +0200 Subject: [PATCH 014/619] Fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index b165cec8cd..73cf70b91a 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -121,7 +121,7 @@ export default class SecurityRoomSettingsTab extends React.Component { + private onEncryptionChange = async (e: React.ChangeEvent) => { if (this.state.joinRule == "public") { const {finished} = Modal.createTrackedDialog('Confirm Public Encrypted Room', '', QuestionDialog, { title: _t('Enable encryption in a public room?'), @@ -239,7 +239,7 @@ export default class SecurityRoomSettingsTab extends React.Component { + private onRoomAccessRadioToggle = (roomAccess) => { if ( this.state.encrypted && this.state.joinRule != "public" && From 27ee7c583656ec3e12cf4330d56647d86e6a3914 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Thu, 24 Jun 2021 17:51:11 +0100 Subject: [PATCH 015/619] Move backdrop filter to a canvas based solution --- res/css/structures/_LeftPanel.scss | 1 - res/css/structures/_MatrixChat.scss | 10 +++++ res/css/structures/_SpacePanel.scss | 1 + res/themes/light/css/_mods.scss | 21 --------- src/components/structures/BackdropPanel.tsx | 50 +++++++++++++++++++++ src/components/structures/LeftPanel.tsx | 34 +++++--------- src/components/structures/LoggedInView.tsx | 19 +++++++- src/components/views/spaces/SpacePanel.tsx | 25 ++++++++++- src/stores/OwnProfileStore.ts | 17 +++++++ 9 files changed, 129 insertions(+), 49 deletions(-) create mode 100644 src/components/structures/BackdropPanel.tsx diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index c7dd678c07..d9db8b4fed 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -43,7 +43,6 @@ $roomListCollapsedWidth: 68px; // Note: The 'room list' in this context is actually everything that isn't the tag // panel, such as the menu options, breadcrumbs, filtering, etc .mx_LeftPanel_roomListContainer { - background-color: $roomlist-bg-color; flex: 1 0 0; min-width: 0; // Create another flexbox (this time a column) for the room list components diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index a220c5d505..2e5ffbcd82 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -35,6 +35,16 @@ limitations under the License. height: 100%; } +.mx_BackdropPanel { + position: absolute; + top: 0; + left: 0; + width: 100%; + min-height: 100%; + z-index: 0; + opacity: .15; +} + .mx_MatrixToolbar { order: 1; diff --git a/res/css/structures/_SpacePanel.scss b/res/css/structures/_SpacePanel.scss index e64057d16c..21c1bed18f 100644 --- a/res/css/structures/_SpacePanel.scss +++ b/res/css/structures/_SpacePanel.scss @@ -27,6 +27,7 @@ $activeBorderColor: $secondary-fg-color; background-color: $groupFilterPanel-bg-color; padding: 0; margin: 0; + position: relative; // Create another flexbox so the Panel fills the container display: flex; diff --git a/res/themes/light/css/_mods.scss b/res/themes/light/css/_mods.scss index fbca58dfb1..15f6d4b0fe 100644 --- a/res/themes/light/css/_mods.scss +++ b/res/themes/light/css/_mods.scss @@ -4,27 +4,6 @@ // set the user avatar (if any) as a background so // it can be blurred by the tag panel and room list -@supports (backdrop-filter: none) { - .mx_LeftPanel { - background-image: var(--avatar-url, unset); - background-repeat: no-repeat; - background-size: cover; - background-position: left top; - } - - .mx_GroupFilterPanel { - backdrop-filter: blur($groupFilterPanel-background-blur-amount); - } - - .mx_SpacePanel { - backdrop-filter: blur($groupFilterPanel-background-blur-amount); - } - - .mx_LeftPanel .mx_LeftPanel_roomListContainer { - backdrop-filter: blur($roomlist-background-blur-amount); - } -} - .mx_RoomSublist_showNButton { background-color: transparent !important; } diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx new file mode 100644 index 0000000000..daaae418c4 --- /dev/null +++ b/src/components/structures/BackdropPanel.tsx @@ -0,0 +1,50 @@ +import React, { createRef } from "react"; + +interface IProps { + width?: number; + height?: number; + backgroundImage?: ImageBitmap; + blur?: string; +} + + +export default class BackdropPanel extends React.PureComponent { + private canvasRef: React.RefObject = createRef(); + private ctx: CanvasRenderingContext2D; + + static defaultProps = { + blur: "60px", + } + + public componentDidMount() { + this.ctx = this.canvasRef.current.getContext("2d"); + } + + public componentDidUpdate() { + if (this.props.backgroundImage) { + requestAnimationFrame(this.refreshBackdropImage); + } + } + + private refreshBackdropImage = (): void => { + const { width, height, backgroundImage } = this.props; + this.canvasRef.current.width = width; + this.canvasRef.current.height = height; + + const destinationX = width - backgroundImage.width; + const destinationY = height - backgroundImage.height; + + this.ctx.filter = `blur(${this.props.blur})`; + this.ctx.drawImage( + backgroundImage, + Math.min(destinationX, 0), + Math.min(destinationY, 0), + Math.max(width, backgroundImage.width), + Math.max(height, backgroundImage.height), + ); + } + + public render() { + return ; + } +} diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index af22db1350..f71817480e 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -36,18 +36,18 @@ import SettingsStore from "../../settings/SettingsStore"; import RoomListStore, { LISTS_UPDATE_EVENT } from "../../stores/room-list/RoomListStore"; import IndicatorScrollbar from "../structures/IndicatorScrollbar"; import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; -import { OwnProfileStore } from "../../stores/OwnProfileStore"; import RoomListNumResults from "../views/rooms/RoomListNumResults"; import LeftPanelWidget from "./LeftPanelWidget"; import {replaceableComponent} from "../../utils/replaceableComponent"; -import {mediaFromMxc} from "../../customisations/Media"; import SpaceStore, {UPDATE_SELECTED_SPACE} from "../../stores/SpaceStore"; import { getKeyBindingsManager, RoomListAction } from "../../KeyBindingsManager"; import UIStore from "../../stores/UIStore"; +import BackdropPanel from "./BackdropPanel"; interface IProps { isMinimized: boolean; resizeNotifier: ResizeNotifier; + backgroundImage?: ImageBitmap; } interface IState { @@ -85,16 +85,14 @@ export default class LeftPanel extends React.Component { BreadcrumbsStore.instance.on(UPDATE_EVENT, this.onBreadcrumbsUpdate); RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.onBreadcrumbsUpdate); - OwnProfileStore.instance.on(UPDATE_EVENT, this.onBackgroundImageUpdate); SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.updateActiveSpace); - this.bgImageWatcherRef = SettingsStore.watchSetting( - "RoomList.backgroundImage", null, this.onBackgroundImageUpdate); this.groupFilterPanelWatcherRef = SettingsStore.watchSetting("TagPanel.enableTagPanel", null, () => { this.setState({showGroupFilterPanel: SettingsStore.getValue("TagPanel.enableTagPanel")}); }); } public componentDidMount() { + UIStore.instance.trackElementDimensions("LeftPanel", this.ref.current); UIStore.instance.trackElementDimensions("ListContainer", this.listContainerRef.current); UIStore.instance.on("ListContainer", this.refreshStickyHeaders); // Using the passive option to not block the main thread @@ -104,10 +102,8 @@ export default class LeftPanel extends React.Component { public componentWillUnmount() { SettingsStore.unwatchSetting(this.groupFilterPanelWatcherRef); - SettingsStore.unwatchSetting(this.bgImageWatcherRef); BreadcrumbsStore.instance.off(UPDATE_EVENT, this.onBreadcrumbsUpdate); RoomListStore.instance.off(LISTS_UPDATE_EVENT, this.onBreadcrumbsUpdate); - OwnProfileStore.instance.off(UPDATE_EVENT, this.onBackgroundImageUpdate); SpaceStore.instance.off(UPDATE_SELECTED_SPACE, this.updateActiveSpace); UIStore.instance.stopTrackingElementDimensions("ListContainer"); UIStore.instance.removeListener("ListContainer", this.refreshStickyHeaders); @@ -144,23 +140,6 @@ export default class LeftPanel extends React.Component { } }; - private onBackgroundImageUpdate = () => { - // Note: we do this in the LeftPanel as it uses this variable most prominently. - const avatarSize = 32; // arbitrary - let avatarUrl = OwnProfileStore.instance.getHttpAvatarUrl(avatarSize); - const settingBgMxc = SettingsStore.getValue("RoomList.backgroundImage"); - if (settingBgMxc) { - avatarUrl = mediaFromMxc(settingBgMxc).getSquareThumbnailHttp(avatarSize); - } - - const avatarUrlProp = `url(${avatarUrl})`; - if (!avatarUrl) { - document.body.style.removeProperty("--avatar-url"); - } else if (document.body.style.getPropertyValue("--avatar-url") !== avatarUrlProp) { - document.body.style.setProperty("--avatar-url", avatarUrlProp); - } - }; - private handleStickyHeaders(list: HTMLDivElement) { if (this.isDoingStickyHeaders) return; this.isDoingStickyHeaders = true; @@ -453,8 +432,15 @@ export default class LeftPanel extends React.Component { "mx_AutoHideScrollbar", ); + const panelDimensions = UIStore.instance.getElementDimensions("LeftPanel"); + return (
+ {leftLeftPanel}
From 40ead34c082875d3ec91ad2ab850be09ce73fcae Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Mon, 26 Jul 2021 17:41:39 +0100 Subject: [PATCH 039/619] Add test for textForPinnedEvent Signed-off-by: Paulo Pinto --- test/TextForEvent-test.ts | 43 ++++++++++++++++++++ test/__snapshots__/TextForEvent-test.ts.snap | 17 ++++++++ 2 files changed, 60 insertions(+) create mode 100644 test/TextForEvent-test.ts create mode 100644 test/__snapshots__/TextForEvent-test.ts.snap diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts new file mode 100644 index 0000000000..fdfb1c5711 --- /dev/null +++ b/test/TextForEvent-test.ts @@ -0,0 +1,43 @@ +import './skinned-sdk'; + +import { textForEvent } from "../src/TextForEvent"; +import { MatrixEvent } from "matrix-js-sdk"; +import SettingsStore from "../src/settings/SettingsStore"; +import { SettingLevel } from "../src/settings/SettingLevel"; +import renderer from 'react-test-renderer'; + +function mockPinnedEvent( + pinnedMessageIds?: string[], + prevPinnedMessageIds?: string[], +): MatrixEvent { + return new MatrixEvent({ + type: "m.room.pinned_events", + state_key: "", + sender: "@foo:example.com", + content: { + pinned: pinnedMessageIds, + }, + prev_content: { + pinned: prevPinnedMessageIds, + }, + }); +} + +describe("TextForPinnedEvent", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); + + it("should mention sender", () => { + const event = mockPinnedEvent(); + expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); + }); +}); + +describe("TextForPinnedEvent (JSX)", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); + + it("should mention sender", () => { + const event = mockPinnedEvent(); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); +}); diff --git a/test/__snapshots__/TextForEvent-test.ts.snap b/test/__snapshots__/TextForEvent-test.ts.snap new file mode 100644 index 0000000000..78fd0910b8 --- /dev/null +++ b/test/__snapshots__/TextForEvent-test.ts.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`TextForPinnedEvent (JSX) should mention sender 1`] = ` + + + @foo:example.com changed the + + + pinned messages + + + for the room. + + +`; From 8fe7df91714d995e7ad3c61e147ec9a7e0494824 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 27 Jul 2021 15:37:05 +0100 Subject: [PATCH 040/619] When a single message is pinned, link to it Signed-off-by: Paulo Pinto --- src/TextForEvent.tsx | 44 ++++++++++++++++++++ src/i18n/strings/en_EN.json | 1 + test/TextForEvent-test.ts | 34 ++++++++++++--- test/__snapshots__/TextForEvent-test.ts.snap | 42 ++++++++++++++++++- 4 files changed, 114 insertions(+), 7 deletions(-) diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index 7bad8eb50e..17fede0d21 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -408,6 +408,15 @@ function textForPowerEvent(event: MatrixEvent): () => string | null { }); } +const onPinnedOrUnpinnedMessageClick = (messageId: string, roomId: string): void => { + defaultDispatcher.dispatch({ + action: 'view_room', + event_id: messageId, + highlighted: true, + room_id: roomId, + }); +}; + const onPinnedMessagesClick = (): void => { defaultDispatcher.dispatch({ action: Action.SetRightPanelPhase, @@ -420,6 +429,41 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string if (!SettingsStore.getValue("feature_pinning")) return null; const senderName = event.sender ? event.sender.name : event.getSender(); + const pinned = event.getContent().pinned ?? []; + const previouslyPinned = event.getPrevContent().pinned ?? []; + const newlyPinned = pinned.filter(item => previouslyPinned.indexOf(item) < 0); + + if (newlyPinned.length === 1) { + // A single message was pinned, include a link to that message. + if (allowJSX) { + const messageId = newlyPinned.pop(); + const roomId = event.getRoomId(); + + return () => ( + + { + _t( + "%(senderName)s pinned a message to this room. See all pinned messages.", + { senderName }, + { + "a": (sub) => + onPinnedOrUnpinnedMessageClick(messageId, roomId)}> + { sub } + , + "b": (sub) => + + { sub } + , + }, + ) + } + + ); + } + + return () => _t("%(senderName)s pinned a message to this room. See all pinned messages.", { senderName }); + } + if (allowJSX) { return () => ( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0ca7b9da9e..eb390afb32 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -545,6 +545,7 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s pinned a message to this room. See all pinned messages.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index fdfb1c5711..91c99c7048 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -23,20 +23,42 @@ function mockPinnedEvent( }); } -describe("TextForPinnedEvent", () => { +describe("TextForPinnedEvent - newly pinned message(s)", () => { SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); - it("should mention sender", () => { - const event = mockPinnedEvent(); + it("mentions message when a single message was pinned, with no previously pinned messages", () => { + const event = mockPinnedEvent(['message-1']); + expect(textForEvent(event)).toBe("@foo:example.com pinned a message to this room. See all pinned messages."); + }); + + it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); + expect(textForEvent(event)).toBe("@foo:example.com pinned a message to this room. See all pinned messages."); + }); + + it("shows generic text when multiple messages were pinned", () => { + const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']); expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); }); }); -describe("TextForPinnedEvent (JSX)", () => { +describe("TextForPinnedEvent - newly pinned message(s) (JSX)", () => { SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); - it("should mention sender", () => { - const event = mockPinnedEvent(); + it("mentions message when a single message was pinned, with no previously pinned messages", () => { + const event = mockPinnedEvent(['message-1']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("shows generic text when multiple messages were pinned", () => { + const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']); const component = renderer.create(textForEvent(event, true)); expect(component.toJSON()).toMatchSnapshot(); }); diff --git a/test/__snapshots__/TextForEvent-test.ts.snap b/test/__snapshots__/TextForEvent-test.ts.snap index 78fd0910b8..41ccbc0857 100644 --- a/test/__snapshots__/TextForEvent-test.ts.snap +++ b/test/__snapshots__/TextForEvent-test.ts.snap @@ -1,6 +1,46 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`TextForPinnedEvent (JSX) should mention sender 1`] = ` +exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message when a single message was pinned, with multiple previously pinned messages 1`] = ` + + + @foo:example.com pinned + + a message + + to this room. See all + + pinned messages + + . + + +`; + +exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message when a single message was pinned, with no previously pinned messages 1`] = ` + + + @foo:example.com pinned + + a message + + to this room. See all + + pinned messages + + . + + +`; + +exports[`TextForPinnedEvent - newly pinned message(s) (JSX) shows generic text when multiple messages were pinned 1`] = ` @foo:example.com changed the From 3f2dadf0fe226d572333653c845049cbb6610800 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 27 Jul 2021 16:58:53 +0100 Subject: [PATCH 041/619] When a single message is unpinned, link to it Signed-off-by: Paulo Pinto --- src/TextForEvent.tsx | 33 +++++++++++- src/i18n/strings/en_EN.json | 1 + test/TextForEvent-test.ts | 45 +++++++++++++++- test/__snapshots__/TextForEvent-test.ts.snap | 56 ++++++++++++++++++++ 4 files changed, 132 insertions(+), 3 deletions(-) diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index 17fede0d21..1033ac9fd8 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -428,16 +428,17 @@ const onPinnedMessagesClick = (): void => { function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string | JSX.Element | null { if (!SettingsStore.getValue("feature_pinning")) return null; const senderName = event.sender ? event.sender.name : event.getSender(); + const roomId = event.getRoomId(); const pinned = event.getContent().pinned ?? []; const previouslyPinned = event.getPrevContent().pinned ?? []; const newlyPinned = pinned.filter(item => previouslyPinned.indexOf(item) < 0); + const newlyUnpinned = previouslyPinned.filter(item => pinned.indexOf(item) < 0); if (newlyPinned.length === 1) { // A single message was pinned, include a link to that message. if (allowJSX) { const messageId = newlyPinned.pop(); - const roomId = event.getRoomId(); return () => ( @@ -464,6 +465,36 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string return () => _t("%(senderName)s pinned a message to this room. See all pinned messages.", { senderName }); } + if (newlyUnpinned.length === 1) { + // A single message was unpinned, include a link to that message. + if (allowJSX) { + const messageId = newlyUnpinned.pop(); + + return () => ( + + { + _t( + "%(senderName)s unpinned a message from this room. See all pinned messages.", + { senderName }, + { + "a": (sub) => + onPinnedOrUnpinnedMessageClick(messageId, roomId)}> + { sub } + , + "b": (sub) => + + { sub } + , + }, + ) + } + + ); + } + + return () => _t("%(senderName)s unpinned a message from this room. See all pinned messages.", { senderName }); + } + if (allowJSX) { return () => ( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb390afb32..91325444c3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -546,6 +546,7 @@ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s pinned a message to this room. See all pinned messages.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s unpinned a message from this room. See all pinned messages.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index 91c99c7048..d8c708eea3 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -37,7 +37,7 @@ describe("TextForPinnedEvent - newly pinned message(s)", () => { }); it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']); + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); }); }); @@ -58,7 +58,48 @@ describe("TextForPinnedEvent - newly pinned message(s) (JSX)", () => { }); it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']); + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); +}); + +describe("TextForPinnedEvent - newly unpinned message(s)", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); + + it("mentions message when a single message was unpinned, with a single message previously pinned", () => { + const event = mockPinnedEvent([], ['message-1']); + expect(textForEvent(event)).toBe("@foo:example.com unpinned a message from this room. See all pinned messages."); + }); + + it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); + expect(textForEvent(event)).toBe("@foo:example.com unpinned a message from this room. See all pinned messages."); + }); + + it("shows generic text when multiple messages were unpinned", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); + expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); + }); +}); + +describe("TextForPinnedEvent - newly unpinned message(s) (JSX)", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); + + it("mentions message when a single message was unpinned, with a single message previously pinned", () => { + const event = mockPinnedEvent([], ['message-1']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("shows generic text when multiple messages were unpinned", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); const component = renderer.create(textForEvent(event, true)); expect(component.toJSON()).toMatchSnapshot(); }); diff --git a/test/__snapshots__/TextForEvent-test.ts.snap b/test/__snapshots__/TextForEvent-test.ts.snap index 41ccbc0857..124f7e0663 100644 --- a/test/__snapshots__/TextForEvent-test.ts.snap +++ b/test/__snapshots__/TextForEvent-test.ts.snap @@ -55,3 +55,59 @@ exports[`TextForPinnedEvent - newly pinned message(s) (JSX) shows generic text w `; + +exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message when a single message was unpinned, with a single message previously pinned 1`] = ` + + + @foo:example.com unpinned + + a message + + from this room. See all + + pinned messages + + . + + +`; + +exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message when a single message was unpinned, with multiple previously pinned messages 1`] = ` + + + @foo:example.com unpinned + + a message + + from this room. See all + + pinned messages + + . + + +`; + +exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) shows generic text when multiple messages were unpinned 1`] = ` + + + @foo:example.com changed the + + + pinned messages + + + for the room. + + +`; From 400e772594b35898e5aa5a2df1d18e7faad46226 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 27 Jul 2021 17:53:33 +0100 Subject: [PATCH 042/619] Fix formatting Signed-off-by: Paulo Pinto --- test/TextForEvent-test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index d8c708eea3..0b3b73613a 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -69,12 +69,16 @@ describe("TextForPinnedEvent - newly unpinned message(s)", () => { it("mentions message when a single message was unpinned, with a single message previously pinned", () => { const event = mockPinnedEvent([], ['message-1']); - expect(textForEvent(event)).toBe("@foo:example.com unpinned a message from this room. See all pinned messages."); + expect(textForEvent(event)).toBe( + "@foo:example.com unpinned a message from this room. See all pinned messages.", + ); }); it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); - expect(textForEvent(event)).toBe("@foo:example.com unpinned a message from this room. See all pinned messages."); + expect(textForEvent(event)).toBe( + "@foo:example.com unpinned a message from this room. See all pinned messages.", + ); }); it("shows generic text when multiple messages were unpinned", () => { From 6c945ee4ed2999bd68a32798a3f3869111ac3e45 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 27 Jul 2021 17:58:19 +0100 Subject: [PATCH 043/619] Add missing translations Signed-off-by: Paulo Pinto --- src/i18n/strings/en_EN.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 91325444c3..1fc9689a58 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -546,7 +546,9 @@ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s pinned a message to this room. See all pinned messages.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s pinned a message to this room. See all pinned messages.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s unpinned a message from this room. See all pinned messages.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s unpinned a message from this room. See all pinned messages.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", From 9ec4507da57b37e630906a45a2103650fbc74642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 28 Jul 2021 16:49:03 +0200 Subject: [PATCH 044/619] Update copy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../tabs/room/SecurityRoomSettingsTab.tsx | 18 +++++++++--------- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 214a0b69ef..e03b6f592f 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -137,11 +137,11 @@ export default class SecurityRoomSettingsTab extends React.Component

{ _t( - " It’s not recommended to turn on encryption on for public rooms. " + - "Anyone can find and join public rooms, so anyone can read messages. You’ll " + - "get none of the benefits of encryption, and you won't be able to turn it " + - "off later. Encrypting messages in a public room will also likely make " + - "receiving and sending messages slower than necessary.", + " It’s not recommended to add encryption to public rooms. " + + "Anyone can find and join public rooms, so anyone can read messages in them. " + + "You’ll get none of the benefits of encryption, and you won’t be able to turn it " + + "off later. Encrypting messages in a public room will make receiving and sending " + + "messages slower.", null, { "b": (sub) => { sub } }, ) }

@@ -236,10 +236,10 @@ export default class SecurityRoomSettingsTab extends React.Component

{ _t( - " It’s not recommended to make end-to-end encrypted rooms public. It " + - "means anyone can find and join this room, so anyone can read messages. You’ll " + - "get none of the benefits of encryption. Encrypting messages in a public room " + - "will also likely make receiving and sending messages slower than necessary.", + " It’s not recommended to make encrypted rooms public. It " + + "It will mean anyone can find and join the room, so anyone can read messages. " + + "You’ll get none of the benefits of encryption. Encrypting messages in a public " + + "room will make receiving and sending messages slower.", null, { "b": (sub) => { sub } }, ) }

diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2ab0ea56a4..fc97f9d0ec 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1427,13 +1427,13 @@ "Permissions": "Permissions", "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", "Are you sure you want to add encryption to this public room?": "Are you sure you want to add encryption to this public room?", - " It’s not recommended to turn on encryption on for public rooms. Anyone can find and join public rooms, so anyone can read messages. You’ll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will also likely make receiving and sending messages slower than necessary.": " It’s not recommended to turn on encryption on for public rooms. Anyone can find and join public rooms, so anyone can read messages. You’ll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will also likely make receiving and sending messages slower than necessary.", + " It’s not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You’ll get none of the benefits of encryption, and you won’t be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You’ll get none of the benefits of encryption, and you won’t be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.", "To avoid these issues, create a new private encrypted room for the conversation you plan to have.": "To avoid these issues, create a new private encrypted room for the conversation you plan to have.", "Enable encryption?": "Enable encryption?", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", "This upgrade will allow members of selected spaces access to this room without an invite.": "This upgrade will allow members of selected spaces access to this room without an invite.", "Are you sure you want to make this encrypted room public?": "Are you sure you want to make this encrypted room public?", - " It’s not recommended to make end-to-end encrypted rooms public. It means anyone can find and join this room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will also likely make receiving and sending messages slower than necessary.": " It’s not recommended to make end-to-end encrypted rooms public. It means anyone can find and join this room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will also likely make receiving and sending messages slower than necessary.", + " It’s not recommended to make encrypted rooms public. It It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to make encrypted rooms public. It It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.", "To avoid these issues, create a new public room for the conversation you plan to have.": "To avoid these issues, create a new public room for the conversation you plan to have.", "To link to this room, please add an address.": "To link to this room, please add an address.", "Private (invite only)": "Private (invite only)", From 168a32902e8da185184fef34722936e144c45076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 28 Jul 2021 16:50:40 +0200 Subject: [PATCH 045/619] Remove additional word MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index e03b6f592f..7def68448f 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -146,7 +146,7 @@ export default class SecurityRoomSettingsTab extends React.Component { sub } }, ) }

{ _t( - "To avoid these issues, create a new private encrypted room for " + + "To avoid these issues, create a new encrypted room for " + "the conversation you plan to have.", null, { "a": (sub) => { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index fc97f9d0ec..a00a8e1c9b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1428,7 +1428,7 @@ "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", "Are you sure you want to add encryption to this public room?": "Are you sure you want to add encryption to this public room?", " It’s not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You’ll get none of the benefits of encryption, and you won’t be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You’ll get none of the benefits of encryption, and you won’t be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.", - "To avoid these issues, create a new private encrypted room for the conversation you plan to have.": "To avoid these issues, create a new private encrypted room for the conversation you plan to have.", + "To avoid these issues, create a new encrypted room for the conversation you plan to have.": "To avoid these issues, create a new encrypted room for the conversation you plan to have.", "Enable encryption?": "Enable encryption?", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", "This upgrade will allow members of selected spaces access to this room without an invite.": "This upgrade will allow members of selected spaces access to this room without an invite.", From e0762827feac962267fa8f59e18d9b8a81d126b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 28 Jul 2021 17:19:32 +0200 Subject: [PATCH 046/619] Fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 7def68448f..5aa46bd62a 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -236,7 +236,7 @@ export default class SecurityRoomSettingsTab extends React.Component

{ _t( - " It’s not recommended to make encrypted rooms public. It " + + " It’s not recommended to make encrypted rooms public. " + "It will mean anyone can find and join the room, so anyone can read messages. " + "You’ll get none of the benefits of encryption. Encrypting messages in a public " + "room will make receiving and sending messages slower.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a00a8e1c9b..f20d7db6c8 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1433,7 +1433,7 @@ "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", "This upgrade will allow members of selected spaces access to this room without an invite.": "This upgrade will allow members of selected spaces access to this room without an invite.", "Are you sure you want to make this encrypted room public?": "Are you sure you want to make this encrypted room public?", - " It’s not recommended to make encrypted rooms public. It It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to make encrypted rooms public. It It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.", + " It’s not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.", "To avoid these issues, create a new public room for the conversation you plan to have.": "To avoid these issues, create a new public room for the conversation you plan to have.", "To link to this room, please add an address.": "To link to this room, please add an address.", "Private (invite only)": "Private (invite only)", From 6f37e8b223cb99fa7a36fab883b5f411e184e2f4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 29 Jul 2021 12:16:59 +0100 Subject: [PATCH 047/619] Use getChildren instead of getSpaceSummary as MSC2946 has moved on --- .../structures/SpaceRoomDirectory.tsx | 51 ++++++++++--------- src/stores/SpaceStore.tsx | 22 ++++---- test/test-utils.js | 4 +- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/src/components/structures/SpaceRoomDirectory.tsx b/src/components/structures/SpaceRoomDirectory.tsx index 038c1df514..195c31e959 100644 --- a/src/components/structures/SpaceRoomDirectory.tsx +++ b/src/components/structures/SpaceRoomDirectory.tsx @@ -18,7 +18,7 @@ import React, { ReactNode, useMemo, useState } from "react"; import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixClient } from "matrix-js-sdk/src/client"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; -import { ISpaceSummaryRoom, ISpaceSummaryEvent } from "matrix-js-sdk/src/@types/spaces"; +import { IRoomChild, IRoomChildState } from "matrix-js-sdk/src/@types/spaces"; import classNames from "classnames"; import { sortBy } from "lodash"; @@ -50,11 +50,11 @@ interface IHierarchyProps { initialText?: string; refreshToken?: any; additionalButtons?: ReactNode; - showRoom(room: ISpaceSummaryRoom, viaServers?: string[], autoJoin?: boolean): void; + showRoom(room: IRoomChild, viaServers?: string[], autoJoin?: boolean): void; } interface ITileProps { - room: ISpaceSummaryRoom; + room: IRoomChild; suggested?: boolean; selected?: boolean; numChildRooms?: number; @@ -205,7 +205,7 @@ const Tile: React.FC = ({ ; }; -export const showRoom = (room: ISpaceSummaryRoom, viaServers?: string[], autoJoin = false) => { +export const showRoom = (room: IRoomChild, viaServers?: string[], autoJoin = false) => { // Don't let the user view a room they won't be able to either peek or join: // fail earlier so they don't have to click back to the directory. if (MatrixClientPeg.get().isGuest()) { @@ -234,8 +234,8 @@ export const showRoom = (room: ISpaceSummaryRoom, viaServers?: string[], autoJoi interface IHierarchyLevelProps { spaceId: string; - rooms: Map; - relations: Map>; + rooms: Map; + relations: Map>; parents: Set; selectedMap?: Map>; onViewRoomClick(roomId: string, autoJoin: boolean): void; @@ -260,7 +260,7 @@ export const HierarchyLevel = ({ // XXX: Space Summary API doesn't give the child origin_server_ts but once it does we should use it for sorting return getChildOrder(ev.content.order, null, ev.state_key); }); - const [subspaces, childRooms] = sortedChildren.reduce((result, ev: ISpaceSummaryEvent) => { + const [subspaces, childRooms] = sortedChildren.reduce((result, ev: IRoomChildState) => { const roomId = ev.state_key; if (!rooms.has(roomId)) return result; result[rooms.get(roomId).room_type === RoomType.Space ? 0 : 1].push(roomId); @@ -318,31 +318,34 @@ export const HierarchyLevel = ({ // mutate argument refreshToken to force a reload export const useSpaceSummary = (cli: MatrixClient, space: Room, refreshToken?: any): [ null, - ISpaceSummaryRoom[], - Map>?, + IRoomChild[], + Map>?, Map>?, Map>?, ] | [Error] => { // TODO pagination return useAsyncMemo(async () => { try { - const data = await cli.getSpaceSummary(space.roomId); + const { rooms } = await cli.getRoomChildren(space.roomId); - const parentChildRelations = new EnhancedMap>(); + const parentChildRelations = new EnhancedMap>(); const childParentRelations = new EnhancedMap>(); const viaMap = new EnhancedMap>(); - data.events.map((ev: ISpaceSummaryEvent) => { - if (ev.type === EventType.SpaceChild) { - parentChildRelations.getOrCreate(ev.room_id, new Map()).set(ev.state_key, ev); - childParentRelations.getOrCreate(ev.state_key, new Set()).add(ev.room_id); - } - if (Array.isArray(ev.content.via)) { - const set = viaMap.getOrCreate(ev.state_key, new Set()); - ev.content.via.forEach(via => set.add(via)); - } + + rooms.forEach(room => { + room.children_state.forEach((ev: IRoomChildState) => { + if (ev.type === EventType.SpaceChild) { + parentChildRelations.getOrCreate(ev.room_id, new Map()).set(ev.state_key, ev); + childParentRelations.getOrCreate(ev.state_key, new Set()).add(ev.room_id); + } + if (Array.isArray(ev.content.via)) { + const set = viaMap.getOrCreate(ev.state_key, new Set()); + ev.content.via.forEach(via => set.add(via)); + } + }); }); - return [null, data.rooms as ISpaceSummaryRoom[], parentChildRelations, viaMap, childParentRelations]; + return [null, rooms, parentChildRelations, viaMap, childParentRelations]; } catch (e) { console.error(e); // TODO return [e]; @@ -370,7 +373,7 @@ export const SpaceHierarchy: React.FC = ({ if (!rooms) return null; const lcQuery = query.toLowerCase().trim(); - const roomsMap = new Map(rooms.map(r => [r.room_id, r])); + const roomsMap = new Map(rooms.map(r => [r.room_id, r])); if (!lcQuery) return roomsMap; const directMatches = rooms.filter(r => { @@ -614,7 +617,7 @@ const SpaceRoomDirectory: React.FC = ({ space, onFinished, initialText } { + showRoom={(room: IRoomChild, viaServers?: string[], autoJoin = false) => { showRoom(room, viaServers, autoJoin); onFinished(); }} @@ -637,6 +640,6 @@ export default SpaceRoomDirectory; // Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom // but works with the objects we get from the public room list -function getDisplayAliasForRoom(room: ISpaceSummaryRoom) { +function getDisplayAliasForRoom(room: IRoomChild) { return getDisplayAliasForAliasSet(room.canonical_alias, room.aliases); } diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index d064b01257..e25ca7e32d 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -19,7 +19,7 @@ import { ListIteratee, Many, sortBy, throttle } from "lodash"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { ISpaceSummaryRoom } from "matrix-js-sdk/src/@types/spaces"; +import { IRoomChild } from "matrix-js-sdk/src/@types/spaces"; import { JoinRule } from "matrix-js-sdk/src/@types/partials"; import { IRoomCapability } from "matrix-js-sdk/src/client"; @@ -63,7 +63,7 @@ export const UPDATE_INVITED_SPACES = Symbol("invited-spaces"); export const UPDATE_SELECTED_SPACE = Symbol("selected-space"); // Space Room ID/HOME_SPACE will be emitted when a Space's children change -export interface ISuggestedRoom extends ISpaceSummaryRoom { +export interface ISuggestedRoom extends IRoomChild { viaServers: string[]; } @@ -297,18 +297,20 @@ export class SpaceStoreClass extends AsyncStoreWithClient { public fetchSuggestedRooms = async (space: Room, limit = MAX_SUGGESTED_ROOMS): Promise => { try { - const data = await this.matrixClient.getSpaceSummary(space.roomId, 0, true, false, limit); + const { rooms } = await this.matrixClient.getRoomChildren(space.roomId, limit, 1, true); const viaMap = new EnhancedMap>(); - data.events.forEach(ev => { - if (ev.type === EventType.SpaceChild && ev.content.via?.length) { - ev.content.via.forEach(via => { - viaMap.getOrCreate(ev.state_key, new Set()).add(via); - }); - } + rooms.forEach(room => { + room.children_state.forEach(ev => { + if (ev.type === EventType.SpaceChild && ev.content.via?.length) { + ev.content.via.forEach(via => { + viaMap.getOrCreate(ev.state_key, new Set()).add(via); + }); + } + }); }); - return data.rooms.filter(roomInfo => { + return rooms.filter(roomInfo => { return roomInfo.room_type !== RoomType.Space && this.matrixClient.getRoom(roomInfo.room_id)?.getMyMembership() !== "join"; }).map(roomInfo => ({ diff --git a/test/test-utils.js b/test/test-utils.js index 5e29fd242e..8bc357c7b3 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -86,7 +86,9 @@ export function createTestClient() { isCryptoEnabled: () => false, getSpaceSummary: jest.fn().mockReturnValue({ rooms: [], - events: [], + }), + getRoomChildren: jest.fn().mockReturnValue({ + rooms: [], }), // Used by various internal bits we aren't concerned with (yet) From d459dbe7009567299c61d6765dd3f714d60ec0b0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 29 Jul 2021 17:35:15 +0100 Subject: [PATCH 048/619] Refactor Space Hierarchy stuff in preparation for pagination --- src/components/structures/RoomDirectory.tsx | 2 +- .../structures/SpaceRoomDirectory.tsx | 244 +++++++++--------- src/stores/SpaceStore.tsx | 6 +- test/test-utils.js | 2 +- 4 files changed, 122 insertions(+), 132 deletions(-) diff --git a/src/components/structures/RoomDirectory.tsx b/src/components/structures/RoomDirectory.tsx index 84e8de8221..8d8609d1cf 100644 --- a/src/components/structures/RoomDirectory.tsx +++ b/src/components/structures/RoomDirectory.tsx @@ -833,6 +833,6 @@ export default class RoomDirectory extends React.Component { // Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom // but works with the objects we get from the public room list -function getDisplayAliasForRoom(room: IPublicRoomsChunkRoom) { +export function getDisplayAliasForRoom(room: IPublicRoomsChunkRoom) { return getDisplayAliasForAliasSet(room.canonical_alias, room.aliases); } diff --git a/src/components/structures/SpaceRoomDirectory.tsx b/src/components/structures/SpaceRoomDirectory.tsx index 7d74d7d5a7..05ba61973f 100644 --- a/src/components/structures/SpaceRoomDirectory.tsx +++ b/src/components/structures/SpaceRoomDirectory.tsx @@ -14,15 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { ReactNode, useMemo, useState } from "react"; +import React, { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; import { Room } from "matrix-js-sdk/src/models/room"; +import { RoomHierarchy } from "matrix-js-sdk/src/room-hierarchy"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; -import { IRoomChild, IRoomChildState } from "matrix-js-sdk/src/@types/spaces"; +import { IHierarchyRelation, IHierarchyRoom } from "matrix-js-sdk/src/@types/spaces"; import classNames from "classnames"; import { sortBy } from "lodash"; import { MatrixClientPeg } from "../../MatrixClientPeg"; import dis from "../../dispatcher/dispatcher"; +import defaultDispatcher from "../../dispatcher/dispatcher"; import { _t } from "../../languageHandler"; import AccessibleButton, { ButtonEvent } from "../views/elements/AccessibleButton"; import BaseDialog from "../views/dialogs/BaseDialog"; @@ -30,8 +32,6 @@ import Spinner from "../views/elements/Spinner"; import SearchBox from "./SearchBox"; import RoomAvatar from "../views/avatars/RoomAvatar"; import RoomName from "../views/elements/RoomName"; -import { useAsyncMemo } from "../../hooks/useAsyncMemo"; -import { EnhancedMap } from "../../utils/maps"; import StyledCheckbox from "../views/elements/StyledCheckbox"; import AutoHideScrollbar from "./AutoHideScrollbar"; import BaseAvatar from "../views/avatars/BaseAvatar"; @@ -42,20 +42,19 @@ import { useStateToggle } from "../../hooks/useStateToggle"; import { getChildOrder } from "../../stores/SpaceStore"; import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; import { linkifyElement } from "../../HtmlUtils"; -import { getDisplayAliasForAliasSet } from "../../Rooms"; import { useDispatcher } from "../../hooks/useDispatcher"; -import defaultDispatcher from "../../dispatcher/dispatcher"; import { Action } from "../../dispatcher/actions"; +import { getDisplayAliasForRoom } from "./RoomDirectory"; interface IHierarchyProps { space: Room; initialText?: string; additionalButtons?: ReactNode; - showRoom(room: IRoomChild, viaServers?: string[], autoJoin?: boolean): void; + showRoom(hierarchy: RoomHierarchy, roomId: string, autoJoin?: boolean): void; } interface ITileProps { - room: IRoomChild; + room: IHierarchyRoom; suggested?: boolean; selected?: boolean; numChildRooms?: number; @@ -206,7 +205,9 @@ const Tile: React.FC = ({ ; }; -export const showRoom = (room: IRoomChild, viaServers?: string[], autoJoin = false) => { +export const showRoom = (hierarchy: RoomHierarchy, roomId: string, autoJoin = false) => { + const room = hierarchy.roomMap.get(roomId); + // Don't let the user view a room they won't be able to either peek or join: // fail earlier so they don't have to click back to the directory. if (MatrixClientPeg.get().isGuest()) { @@ -224,7 +225,7 @@ export const showRoom = (room: IRoomChild, viaServers?: string[], autoJoin = fal _type: "room_directory", // instrumentation room_alias: roomAlias, room_id: room.room_id, - via_servers: viaServers, + via_servers: Array.from(hierarchy.viaMap.get(roomId) || []), oob_data: { avatarUrl: room.avatar_url, // XXX: This logic is duplicated from the JS SDK which would normally decide what the name is. @@ -234,9 +235,9 @@ export const showRoom = (room: IRoomChild, viaServers?: string[], autoJoin = fal }; interface IHierarchyLevelProps { - spaceId: string; - rooms: Map; - relations: Map>; + root: IHierarchyRoom; + roomSet: Set; + hierarchy: RoomHierarchy; parents: Set; selectedMap?: Map>; onViewRoomClick(roomId: string, autoJoin: boolean): void; @@ -244,67 +245,69 @@ interface IHierarchyLevelProps { } export const HierarchyLevel = ({ - spaceId, - rooms, - relations, + root, + roomSet, + hierarchy, parents, selectedMap, onViewRoomClick, onToggleClick, }: IHierarchyLevelProps) => { const cli = MatrixClientPeg.get(); - const space = cli.getRoom(spaceId); + const space = cli.getRoom(root.room_id); const hasPermissions = space?.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()); - const children = Array.from(relations.get(spaceId)?.values() || []); - const sortedChildren = sortBy(children, ev => { - // XXX: Space Summary API doesn't give the child origin_server_ts but once it does we should use it for sorting - return getChildOrder(ev.content.order, null, ev.state_key); + const sortedChildren = sortBy(root.children_state, ev => { + return getChildOrder(ev.content.order, ev.origin_server_ts, ev.state_key); }); - const [subspaces, childRooms] = sortedChildren.reduce((result, ev: IRoomChildState) => { - const roomId = ev.state_key; - if (!rooms.has(roomId)) return result; - result[rooms.get(roomId).room_type === RoomType.Space ? 0 : 1].push(roomId); - return result; - }, [[], []]) || [[], []]; - const newParents = new Set(parents).add(spaceId); + const [subspaces, childRooms] = sortedChildren.reduce((result, ev: IHierarchyRelation) => { + const room = hierarchy.roomMap.get(ev.state_key); + if (room && roomSet.has(room)) { + result[room.room_type === RoomType.Space ? 0 : 1].push(room); + } + return result; + }, [[] as IHierarchyRoom[], [] as IHierarchyRoom[]]); + + const newParents = new Set(parents).add(root.room_id); return { - childRooms.map(roomId => ( + childRooms.map(room => ( { - onViewRoomClick(roomId, autoJoin); + onViewRoomClick(room.room_id, autoJoin); }} hasPermissions={hasPermissions} - onToggleClick={onToggleClick ? () => onToggleClick(spaceId, roomId) : undefined} + onToggleClick={onToggleClick ? () => onToggleClick(root.room_id, room.room_id) : undefined} /> )) } { - subspaces.filter(roomId => !newParents.has(roomId)).map(roomId => ( + subspaces.filter(room => !newParents.has(room.room_id)).map(space => ( rooms.has(ev.state_key) && !rooms.get(ev.state_key).room_type).length} - suggested={relations.get(spaceId)?.get(roomId)?.content.suggested} - selected={selectedMap?.get(spaceId)?.has(roomId)} + key={space.room_id} + room={space} + numChildRooms={space.children_state.filter(ev => { + const room = hierarchy.roomMap.get(ev.state_key); + return room && roomSet.has(room) && !room.room_type; + }).length} + suggested={hierarchy.isSuggested(root.room_id, space.room_id)} + selected={selectedMap?.get(root.room_id)?.has(space.room_id)} onViewRoomClick={(autoJoin) => { - onViewRoomClick(roomId, autoJoin); + onViewRoomClick(space.room_id, autoJoin); }} hasPermissions={hasPermissions} - onToggleClick={onToggleClick ? () => onToggleClick(spaceId, roomId) : undefined} + onToggleClick={onToggleClick ? () => onToggleClick(root.room_id, space.room_id) : undefined} > ; }; -export const useSpaceSummary = (space: Room): [ - null, - IRoomChild[], - Map>?, - Map>?, - Map>?, -] | [Error] => { - // crude temporary refresh token approach until we have pagination and rework the data flow here - const [refreshToken, setRefreshToken] = useState(0); +export const useSpaceSummary = (space: Room): { + loading: boolean; + rooms: IHierarchyRoom[]; + hierarchy: RoomHierarchy; + loadMore(pageSize?: number): Promise ; +} => { + const [rooms, setRooms] = useState([]); + const [loading, setLoading] = useState(true); + + const INITIAL_PAGE_SIZE = 20; + const [hierarchy, setHierarchy] = useState(); + + const resetHierarchy = useCallback(() => { + const hierarchy = new RoomHierarchy(space, INITIAL_PAGE_SIZE); + setHierarchy(hierarchy); + + let discard = false; + hierarchy.load().then(() => { + if (discard) return; + setRooms(hierarchy.rooms); + setLoading(false); + }); + + return () => { + discard = true; + }; + }, [space]); + useEffect(resetHierarchy, [resetHierarchy]); + useDispatcher(defaultDispatcher, (payload => { if (payload.action === Action.UpdateSpaceHierarchy) { - setRefreshToken(t => t + 1); + setLoading(true); + setRooms([]); // TODO + resetHierarchy(); } })); - // TODO pagination - return useAsyncMemo(async () => { - try { - const { rooms } = await space.client.getRoomChildren(space.roomId); + const loadMore = useCallback(async (pageSize?: number) => { + if (!hierarchy.canLoadMore || hierarchy.noSupport) return; - const parentChildRelations = new EnhancedMap>(); - const childParentRelations = new EnhancedMap>(); - const viaMap = new EnhancedMap>(); + setLoading(true); + await hierarchy.load(pageSize); + setRooms(hierarchy.rooms); + setLoading(false); + }, [hierarchy]); - rooms.forEach(room => { - room.children_state.forEach((ev: IRoomChildState) => { - if (ev.type === EventType.SpaceChild) { - parentChildRelations.getOrCreate(ev.room_id, new Map()).set(ev.state_key, ev); - childParentRelations.getOrCreate(ev.state_key, new Set()).add(ev.room_id); - } - if (Array.isArray(ev.content.via)) { - const set = viaMap.getOrCreate(ev.state_key, new Set()); - ev.content.via.forEach(via => set.add(via)); - } - }); - }); - - return [null, rooms, parentChildRelations, viaMap, childParentRelations]; - } catch (e) { - console.error(e); // TODO - return [e]; - } - }, [space, refreshToken], [undefined]); + return { loading, rooms, hierarchy, loadMore }; }; export const SpaceHierarchy: React.FC = ({ @@ -374,14 +381,12 @@ export const SpaceHierarchy: React.FC = ({ const [selected, setSelected] = useState(new Map>()); // Map> - const [summaryError, rooms, parentChildMap, viaMap, childParentMap] = useSpaceSummary(space); + const { loading, rooms, hierarchy } = useSpaceSummary(space); - const roomsMap = useMemo(() => { - if (!rooms) return null; + const filteredRoomSet = useMemo>(() => { + if (!rooms.length) return new Set(); const lcQuery = query.toLowerCase().trim(); - - const roomsMap = new Map(rooms.map(r => [r.room_id, r])); - if (!lcQuery) return roomsMap; + if (!lcQuery) return new Set(rooms); const directMatches = rooms.filter(r => { return r.name?.toLowerCase().includes(lcQuery) || r.topic?.toLowerCase().includes(lcQuery); @@ -393,34 +398,30 @@ export const SpaceHierarchy: React.FC = ({ while (queue.length) { const roomId = queue.pop(); visited.add(roomId); - childParentMap.get(roomId)?.forEach(parentId => { + hierarchy.backRefs.get(roomId)?.forEach(parentId => { if (!visited.has(parentId)) { queue.push(parentId); } }); } - // Remove any mappings for rooms which were not visited in the walk - Array.from(roomsMap.keys()).forEach(roomId => { - if (!visited.has(roomId)) { - roomsMap.delete(roomId); - } - }); - return roomsMap; - }, [rooms, childParentMap, query]); + return new Set(rooms.filter(r => visited.has(r.room_id))); + }, [rooms, hierarchy, query]); const [error, setError] = useState(""); const [removing, setRemoving] = useState(false); const [saving, setSaving] = useState(false); - if (summaryError) { + if (!loading && hierarchy.noSupport) { return

{ _t("Your server does not support showing space hierarchies.") }

; } let content; - if (roomsMap) { - const numRooms = Array.from(roomsMap.values()).filter(r => !r.room_type).length; - const numSpaces = roomsMap.size - numRooms - 1; // -1 at the end to exclude the space we are looking at + if (loading) { + content = ; + } else { + const numRooms = Array.from(filteredRoomSet).filter(r => !r.room_type).length; + const numSpaces = filteredRoomSet.size - numRooms - 1; // -1 at the end to exclude the space we are looking at let countsStr; if (numSpaces > 1) { @@ -438,7 +439,7 @@ export const SpaceHierarchy: React.FC = ({ }); const selectionAllSuggested = selectedRelations.every(([parentId, childId]) => { - return parentChildMap.get(parentId)?.get(childId)?.content.suggested; + return hierarchy.isSuggested(parentId, childId); }); const disabled = !selectedRelations.length || removing || saving; @@ -461,17 +462,14 @@ export const SpaceHierarchy: React.FC = ({ try { for (const [parentId, childId] of selectedRelations) { await cli.sendStateEvent(parentId, EventType.SpaceChild, {}, childId); - parentChildMap.get(parentId).delete(childId); - if (parentChildMap.get(parentId).size > 0) { - parentChildMap.set(parentId, new Map(parentChildMap.get(parentId))); - } else { - parentChildMap.delete(parentId); - } + + hierarchy.removeRelation(parentId, childId); } } catch (e) { setError(_t("Failed to remove some rooms. Try again later")); } setRemoving(false); + setSelected(new Map()); }} kind="danger_outline" disabled={disabled} @@ -485,7 +483,7 @@ export const SpaceHierarchy: React.FC = ({ try { for (const [parentId, childId] of selectedRelations) { const suggested = !selectionAllSuggested; - const existingContent = parentChildMap.get(parentId)?.get(childId)?.content; + const existingContent = hierarchy.getRelation(parentId, childId)?.content; if (!existingContent || existingContent.suggested === suggested) continue; const content = { @@ -495,8 +493,8 @@ export const SpaceHierarchy: React.FC = ({ await cli.sendStateEvent(parentId, EventType.SpaceChild, content, childId); - parentChildMap.get(parentId).get(childId).content = content; - parentChildMap.set(parentId, new Map(parentChildMap.get(parentId))); + // mutate the local state to save us having to refetch the world + existingContent.suggested = content.suggested; } } catch (e) { setError("Failed to update some suggestions. Try again later"); @@ -516,14 +514,14 @@ export const SpaceHierarchy: React.FC = ({ } let results; - if (roomsMap.size) { + if (filteredRoomSet.size) { const hasPermissions = space?.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()); results = <> { @@ -543,7 +541,7 @@ export const SpaceHierarchy: React.FC = ({ setSelected(new Map(selected.set(parentId, new Set(parentSet)))); } : undefined} onViewRoomClick={(roomId, autoJoin) => { - showRoom(roomsMap.get(roomId), Array.from(viaMap.get(roomId) || []), autoJoin); + showRoom(hierarchy, roomId, autoJoin); }} /> { children &&
} @@ -571,8 +569,6 @@ export const SpaceHierarchy: React.FC = ({ { children } ; - } else { - content = ; } // TODO loading state/error state @@ -624,8 +620,8 @@ const SpaceRoomDirectory: React.FC = ({ space, onFinished, initialText } { - showRoom(room, viaServers, autoJoin); + showRoom={(hierarchy: RoomHierarchy, roomId: string, autoJoin = false) => { + showRoom(hierarchy, roomId, autoJoin); onFinished(); }} initialText={initialText} @@ -644,9 +640,3 @@ const SpaceRoomDirectory: React.FC = ({ space, onFinished, initialText } }; export default SpaceRoomDirectory; - -// Similar to matrix-react-sdk's MatrixTools.getDisplayAliasForRoom -// but works with the objects we get from the public room list -function getDisplayAliasForRoom(room: IRoomChild) { - return getDisplayAliasForAliasSet(room.canonical_alias, room.aliases); -} diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index e25ca7e32d..bf8c1ecb44 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -19,7 +19,7 @@ import { ListIteratee, Many, sortBy, throttle } from "lodash"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; import { Room } from "matrix-js-sdk/src/models/room"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { IRoomChild } from "matrix-js-sdk/src/@types/spaces"; +import { IHierarchyRoom } from "matrix-js-sdk/src/@types/spaces"; import { JoinRule } from "matrix-js-sdk/src/@types/partials"; import { IRoomCapability } from "matrix-js-sdk/src/client"; @@ -63,7 +63,7 @@ export const UPDATE_INVITED_SPACES = Symbol("invited-spaces"); export const UPDATE_SELECTED_SPACE = Symbol("selected-space"); // Space Room ID/HOME_SPACE will be emitted when a Space's children change -export interface ISuggestedRoom extends IRoomChild { +export interface ISuggestedRoom extends IHierarchyRoom { viaServers: string[]; } @@ -297,7 +297,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { public fetchSuggestedRooms = async (space: Room, limit = MAX_SUGGESTED_ROOMS): Promise => { try { - const { rooms } = await this.matrixClient.getRoomChildren(space.roomId, limit, 1, true); + const { rooms } = await this.matrixClient.getRoomHierarchy(space.roomId, limit, 1, true); const viaMap = new EnhancedMap>(); rooms.forEach(room => { diff --git a/test/test-utils.js b/test/test-utils.js index 8bc357c7b3..b337828b68 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -87,7 +87,7 @@ export function createTestClient() { getSpaceSummary: jest.fn().mockReturnValue({ rooms: [], }), - getRoomChildren: jest.fn().mockReturnValue({ + getRoomHierarchy: jest.fn().mockReturnValue({ rooms: [], }), From 259627fba2f9a83e6f9a2e3cbf39b04c225aaf1d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 30 Jul 2021 11:01:49 +0100 Subject: [PATCH 049/619] Clean up SpaceHierarchy --- res/css/_components.scss | 2 +- ...oomDirectory.scss => _SpaceHierarchy.scss} | 54 +++------ res/css/structures/_SpaceRoomView.scss | 5 - ...ceRoomDirectory.tsx => SpaceHierarchy.tsx} | 108 ++++-------------- src/components/structures/SpaceRoomView.tsx | 2 +- 5 files changed, 43 insertions(+), 128 deletions(-) rename res/css/structures/{_SpaceRoomDirectory.scss => _SpaceHierarchy.scss} (86%) rename src/components/structures/{SpaceRoomDirectory.tsx => SpaceHierarchy.tsx} (86%) diff --git a/res/css/_components.scss b/res/css/_components.scss index 1feea1d26f..15cb20d963 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -27,8 +27,8 @@ @import "./structures/_RoomView.scss"; @import "./structures/_ScrollPanel.scss"; @import "./structures/_SearchBox.scss"; +@import "./structures/_SpaceHierarchy.scss"; @import "./structures/_SpacePanel.scss"; -@import "./structures/_SpaceRoomDirectory.scss"; @import "./structures/_SpaceRoomView.scss"; @import "./structures/_TabbedView.scss"; @import "./structures/_ToastContainer.scss"; diff --git a/res/css/structures/_SpaceRoomDirectory.scss b/res/css/structures/_SpaceHierarchy.scss similarity index 86% rename from res/css/structures/_SpaceRoomDirectory.scss rename to res/css/structures/_SpaceHierarchy.scss index bc343f535c..afb01d7c9a 100644 --- a/res/css/structures/_SpaceRoomDirectory.scss +++ b/res/css/structures/_SpaceHierarchy.scss @@ -14,21 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_SpaceRoomDirectory_dialogWrapper > .mx_Dialog { - max-width: 960px; - height: 100%; -} - -.mx_SpaceRoomDirectory { - height: 100%; - margin-bottom: 12px; - color: $primary-fg-color; - word-break: break-word; - display: flex; - flex-direction: column; -} - -.mx_SpaceRoomDirectory, .mx_SpaceRoomView_landing { .mx_Dialog_title { display: flex; @@ -67,7 +52,7 @@ limitations under the License. margin: 24px 0 16px; } - .mx_SpaceRoomDirectory_noResults { + .mx_SpaceHierarchy_noResults { text-align: center; > div { @@ -77,7 +62,7 @@ limitations under the License. } } - .mx_SpaceRoomDirectory_listHeader { + .mx_SpaceHierarchy_listHeader { display: flex; min-height: 32px; align-items: center; @@ -104,7 +89,7 @@ limitations under the License. } } - .mx_SpaceRoomDirectory_error { + .mx_SpaceHierarchy_error { position: relative; font-weight: $font-semi-bold; color: $notice-primary-color; @@ -123,13 +108,8 @@ limitations under the License. background-image: url("$(res)/img/element-icons/warning-badge.svg"); } } -} -.mx_SpaceRoomDirectory_list { - margin-top: 16px; - padding-bottom: 40px; - - .mx_SpaceRoomDirectory_roomCount { + .mx_SpaceHierarchy_roomCount { > h3 { display: inline; font-weight: $font-semi-bold; @@ -146,13 +126,13 @@ limitations under the License. } } - .mx_SpaceRoomDirectory_subspace { + .mx_SpaceHierarchy_subspace { .mx_BaseAvatar_image { border-radius: 8px; } } - .mx_SpaceRoomDirectory_subspace_toggle { + .mx_SpaceHierarchy_subspace_toggle { position: absolute; left: -1px; top: 10px; @@ -176,17 +156,17 @@ limitations under the License. mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); } - &.mx_SpaceRoomDirectory_subspace_toggle_shown::before { + &.mx_SpaceHierarchy_subspace_toggle_shown::before { transform: rotate(0deg); } } - .mx_SpaceRoomDirectory_subspace_children { + .mx_SpaceHierarchy_subspace_children { position: relative; padding-left: 12px; } - .mx_SpaceRoomDirectory_roomTile { + .mx_SpaceHierarchy_roomTile { position: relative; padding: 8px 16px; border-radius: 8px; @@ -203,7 +183,7 @@ limitations under the License. grid-column: 1; } - .mx_SpaceRoomDirectory_roomTile_name { + .mx_SpaceHierarchy_roomTile_name { font-weight: $font-semi-bold; font-size: $font-15px; line-height: $font-18px; @@ -231,7 +211,7 @@ limitations under the License. } } - .mx_SpaceRoomDirectory_roomTile_info { + .mx_SpaceHierarchy_roomTile_info { font-size: $font-14px; line-height: $font-18px; color: $secondary-fg-color; @@ -243,7 +223,7 @@ limitations under the License. overflow: hidden; } - .mx_SpaceRoomDirectory_actions { + .mx_SpaceHierarchy_actions { text-align: right; margin-left: 20px; grid-column: 3; @@ -277,8 +257,8 @@ limitations under the License. } } - .mx_SpaceRoomDirectory_roomTile, - .mx_SpaceRoomDirectory_subspace_children { + .mx_SpaceHierarchy_roomTile, + .mx_SpaceHierarchy_subspace_children { &::before { content: ""; position: absolute; @@ -290,8 +270,8 @@ limitations under the License. } } - .mx_SpaceRoomDirectory_actions { - .mx_SpaceRoomDirectory_actionsText { + .mx_SpaceHierarchy_actions { + .mx_SpaceHierarchy_actionsText { font-weight: normal; font-size: $font-12px; line-height: $font-15px; @@ -306,7 +286,7 @@ limitations under the License. margin: 20px 0; } - .mx_SpaceRoomDirectory_createRoom { + .mx_SpaceHierarchy_createRoom { display: block; margin: 16px auto 0; width: max-content; diff --git a/res/css/structures/_SpaceRoomView.scss b/res/css/structures/_SpaceRoomView.scss index e4832d9430..3119d2fe6e 100644 --- a/res/css/structures/_SpaceRoomView.scss +++ b/res/css/structures/_SpaceRoomView.scss @@ -354,11 +354,6 @@ $SpaceRoomViewInnerWidth: 428px; display: none; } } - - .mx_SpaceRoomDirectory_list { - // we don't want this container to get forced into the flexbox layout - display: contents; - } } .mx_SpaceRoomView_privateScope { diff --git a/src/components/structures/SpaceRoomDirectory.tsx b/src/components/structures/SpaceHierarchy.tsx similarity index 86% rename from src/components/structures/SpaceRoomDirectory.tsx rename to src/components/structures/SpaceHierarchy.tsx index 05ba61973f..d17d17f31e 100644 --- a/src/components/structures/SpaceRoomDirectory.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; +import React, { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from "react"; import { Room } from "matrix-js-sdk/src/models/room"; import { RoomHierarchy } from "matrix-js-sdk/src/room-hierarchy"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; @@ -27,13 +27,10 @@ import dis from "../../dispatcher/dispatcher"; import defaultDispatcher from "../../dispatcher/dispatcher"; import { _t } from "../../languageHandler"; import AccessibleButton, { ButtonEvent } from "../views/elements/AccessibleButton"; -import BaseDialog from "../views/dialogs/BaseDialog"; import Spinner from "../views/elements/Spinner"; import SearchBox from "./SearchBox"; import RoomAvatar from "../views/avatars/RoomAvatar"; -import RoomName from "../views/elements/RoomName"; import StyledCheckbox from "../views/elements/StyledCheckbox"; -import AutoHideScrollbar from "./AutoHideScrollbar"; import BaseAvatar from "../views/avatars/BaseAvatar"; import { mediaFromMxc } from "../../customisations/Media"; import InfoTooltip from "../views/elements/InfoTooltip"; @@ -46,7 +43,7 @@ import { useDispatcher } from "../../hooks/useDispatcher"; import { Action } from "../../dispatcher/actions"; import { getDisplayAliasForRoom } from "./RoomDirectory"; -interface IHierarchyProps { +interface IProps { space: Room; initialText?: string; additionalButtons?: ReactNode; @@ -148,13 +145,13 @@ const Tile: React.FC = ({ const content = { avatar } -
+
{ name } { suggestedSection }
e && linkifyElement(e)} onClick={ev => { // prevent clicks on links from bubbling up to the room tile @@ -165,7 +162,7 @@ const Tile: React.FC = ({ > { description }
-
+
{ button } { checkbox }
@@ -176,8 +173,8 @@ const Tile: React.FC = ({ if (children) { // the chevron is purposefully a div rather than a button as it should be ignored for a11y childToggle =
{ ev.stopPropagation(); @@ -185,7 +182,7 @@ const Tile: React.FC = ({ }} />; if (showChildren) { - childSection =
+ childSection =
{ children }
; } @@ -193,8 +190,8 @@ const Tile: React.FC = ({ return <> @@ -319,6 +316,8 @@ export const HierarchyLevel = ({ ; }; +const INITIAL_PAGE_SIZE = 20; + export const useSpaceSummary = (space: Room): { loading: boolean; rooms: IHierarchyRoom[]; @@ -327,8 +326,6 @@ export const useSpaceSummary = (space: Room): { } => { const [rooms, setRooms] = useState([]); const [loading, setLoading] = useState(true); - - const INITIAL_PAGE_SIZE = 20; const [hierarchy, setHierarchy] = useState(); const resetHierarchy = useCallback(() => { @@ -368,13 +365,12 @@ export const useSpaceSummary = (space: Room): { return { loading, rooms, hierarchy, loadMore }; }; -export const SpaceHierarchy: React.FC = ({ +const SpaceHierarchy = ({ space, initialText = "", showRoom, additionalButtons, - children, -}) => { +}: IProps) => { const cli = MatrixClientPeg.get(); const userId = cli.getUserId(); const [query, setQuery] = useState(initialText); @@ -416,7 +412,8 @@ export const SpaceHierarchy: React.FC = ({ return

{ _t("Your server does not support showing space hierarchies.") }

; } - let content; + let content: JSX.Element; + let loader: JSX.Element; if (loading) { content = ; } else { @@ -513,7 +510,7 @@ export const SpaceHierarchy: React.FC = ({ ; } - let results; + let results: JSX.Element; if (filteredRoomSet.size) { const hasPermissions = space?.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()); @@ -544,34 +541,31 @@ export const SpaceHierarchy: React.FC = ({ showRoom(hierarchy, roomId, autoJoin); }} /> - { children &&
} ; } else { - results =
+ results =

{ _t("No results found") }

{ _t("You may want to try a different search or check for typos.") }
; } content = <> -
+
{ countsStr } { additionalButtons } { manageButtons }
- { error &&
+ { error &&
{ error }
} - - { results } - { children } - + + { results } + { loader } ; } - // TODO loading state/error state return <> = ({ ; }; -interface IProps { - space: Room; - initialText?: string; - onFinished(): void; -} - -const SpaceRoomDirectory: React.FC = ({ space, onFinished, initialText }) => { - const onCreateRoomClick = () => { - dis.dispatch({ - action: 'view_create_room', - public: true, - }); - onFinished(); - }; - - const title = - -
-

{ _t("Explore rooms") }

-
-
-
; - - return ( - -
- { _t("If you can't find the room you're looking for, ask for an invite or create a new room.", - null, - { a: sub => { - return { sub }; - } }, - ) } - - { - showRoom(hierarchy, roomId, autoJoin); - onFinished(); - }} - initialText={initialText} - > - - { _t("Create room") } - - -
-
- ); -}; - -export default SpaceRoomDirectory; +export default SpaceHierarchy; diff --git a/src/components/structures/SpaceRoomView.tsx b/src/components/structures/SpaceRoomView.tsx index 5829578cd2..f2052f1613 100644 --- a/src/components/structures/SpaceRoomView.tsx +++ b/src/components/structures/SpaceRoomView.tsx @@ -54,7 +54,7 @@ import { showCreateNewSubspace, showSpaceSettings, } from "../../utils/space"; -import { showRoom, SpaceHierarchy } from "./SpaceRoomDirectory"; +import SpaceHierarchy, { showRoom } from "./SpaceHierarchy"; import MemberAvatar from "../views/avatars/MemberAvatar"; import SpaceStore from "../../stores/SpaceStore"; import FacePile from "../views/elements/FacePile"; From f4ed9aeef11040953e14433b8571ce119a09d2ae Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 30 Jul 2021 11:02:05 +0100 Subject: [PATCH 050/619] Add pagination mechanism to SpaceHierarchy based on IntersectionObserver --- src/components/structures/SpaceHierarchy.tsx | 29 +++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index d17d17f31e..f1f5d70fa6 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -377,7 +377,7 @@ const SpaceHierarchy = ({ const [selected, setSelected] = useState(new Map>()); // Map> - const { loading, rooms, hierarchy } = useSpaceSummary(space); + const { loading, rooms, hierarchy, loadMore } = useSpaceSummary(space); const filteredRoomSet = useMemo>(() => { if (!rooms.length) return new Set(); @@ -408,6 +408,29 @@ const SpaceHierarchy = ({ const [removing, setRemoving] = useState(false); const [saving, setSaving] = useState(false); + const handleObserver = (entries: IntersectionObserverEntry[]) => { + const target = entries[0]; + if (target.isIntersecting) { + loadMore(); + } + }; + + const observerRef = useRef(); + const loaderRef = (element: HTMLDivElement) => { + if (observerRef.current) { + observerRef.current.disconnect(); + } else if (element) { + observerRef.current = new IntersectionObserver(handleObserver, { + root: element.parentElement, + rootMargin: "0px 0px 600px 0px", + }); + } + + if (observerRef.current && element) { + observerRef.current.observe(element); + } + }; + if (!loading && hierarchy.noSupport) { return

{ _t("Your server does not support showing space hierarchies.") }

; } @@ -542,6 +565,10 @@ const SpaceHierarchy = ({ }} /> ; + + loader =
+ +
; } else { results =

{ _t("No results found") }

From a3ca2abae386eb921c54f0f528219c8584bbb59d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 30 Jul 2021 11:11:21 +0100 Subject: [PATCH 051/619] i18n --- src/i18n/strings/en_EN.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ef4537bddf..a960af9f79 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2812,8 +2812,6 @@ "No results found": "No results found", "You may want to try a different search or check for typos.": "You may want to try a different search or check for typos.", "Search names and descriptions": "Search names and descriptions", - "If you can't find the room you're looking for, ask for an invite or create a new room.": "If you can't find the room you're looking for, ask for an invite or create a new room.", - "Create room": "Create room", "Spaces are a beta feature.": "Spaces are a beta feature.", "Public space": "Public space", "Private space": "Private space", From 1c2dc13fa330fe2de05d6bfabaaf1028428e8c66 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 30 Jul 2021 12:12:49 +0100 Subject: [PATCH 052/619] factor our observer hook --- src/components/structures/SpaceHierarchy.tsx | 48 +++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index f1f5d70fa6..f13fc7f208 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -365,6 +365,31 @@ export const useSpaceSummary = (space: Room): { return { loading, rooms, hierarchy, loadMore }; }; +const useIntersectionObserver = (callback: () => void) => { + const handleObserver = (entries: IntersectionObserverEntry[]) => { + const target = entries[0]; + if (target.isIntersecting) { + callback(); + } + }; + + const observerRef = useRef(); + return (element: HTMLDivElement) => { + if (observerRef.current) { + observerRef.current.disconnect(); + } else if (element) { + observerRef.current = new IntersectionObserver(handleObserver, { + root: element.parentElement, + rootMargin: "0px 0px 600px 0px", + }); + } + + if (observerRef.current && element) { + observerRef.current.observe(element); + } + }; +}; + const SpaceHierarchy = ({ space, initialText = "", @@ -408,28 +433,7 @@ const SpaceHierarchy = ({ const [removing, setRemoving] = useState(false); const [saving, setSaving] = useState(false); - const handleObserver = (entries: IntersectionObserverEntry[]) => { - const target = entries[0]; - if (target.isIntersecting) { - loadMore(); - } - }; - - const observerRef = useRef(); - const loaderRef = (element: HTMLDivElement) => { - if (observerRef.current) { - observerRef.current.disconnect(); - } else if (element) { - observerRef.current = new IntersectionObserver(handleObserver, { - root: element.parentElement, - rootMargin: "0px 0px 600px 0px", - }); - } - - if (observerRef.current && element) { - observerRef.current.observe(element); - } - }; + const loaderRef = useIntersectionObserver(loadMore); if (!loading && hierarchy.noSupport) { return

{ _t("Your server does not support showing space hierarchies.") }

; From 717691ef2f7114ed227f1d6f46924ecd1980e1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 07:40:25 +0200 Subject: [PATCH 053/619] Remove spaces Co-authored-by: Travis Ralston --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 5aa46bd62a..58b12b18c3 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -143,7 +143,7 @@ export default class SecurityRoomSettingsTab extends React.Component { sub } }, + { "b": (sub) => { sub } }, ) }

{ _t( "To avoid these issues, create a new encrypted room for " + From 67062dab88707b4c1fe26553969c08efb1cfed20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 07:40:35 +0200 Subject: [PATCH 054/619] Remove spaces Co-authored-by: Travis Ralston --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 58b12b18c3..8d870564b2 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -137,7 +137,7 @@ export default class SecurityRoomSettingsTab extends React.Component

{ _t( - " It’s not recommended to add encryption to public rooms. " + + "It's not recommended to add encryption to public rooms." + "Anyone can find and join public rooms, so anyone can read messages in them. " + "You’ll get none of the benefits of encryption, and you won’t be able to turn it " + "off later. Encrypting messages in a public room will make receiving and sending " + From 94f915a4363dc4379e9e92b0ba02881581951fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 07:41:23 +0200 Subject: [PATCH 055/619] Remove spaces Co-authored-by: Travis Ralston --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 8d870564b2..97b924c8a2 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -146,7 +146,7 @@ export default class SecurityRoomSettingsTab extends React.Component { sub } }, ) }

{ _t( - "To avoid these issues, create a new encrypted room for " + + "To avoid these issues, create a new encrypted room for " + "the conversation you plan to have.", null, { "a": (sub) => { From 1e9437db7bd17c686cec55cd2b69551542243e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 07:41:37 +0200 Subject: [PATCH 056/619] Use correct character Co-authored-by: Travis Ralston --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 97b924c8a2..6362b5c790 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -139,7 +139,7 @@ export default class SecurityRoomSettingsTab extends React.Component { _t( "It's not recommended to add encryption to public rooms." + "Anyone can find and join public rooms, so anyone can read messages in them. " + - "You’ll get none of the benefits of encryption, and you won’t be able to turn it " + + "You'll get none of the benefits of encryption, and you won't be able to turn it " + "off later. Encrypting messages in a public room will make receiving and sending " + "messages slower.", null, From 3abc419266a250f42f8b3242105c55a3eae866c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 07:41:56 +0200 Subject: [PATCH 057/619] Remove spaces and use correct character Co-authored-by: Travis Ralston --- .../views/settings/tabs/room/SecurityRoomSettingsTab.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 6362b5c790..d9e97d570b 100644 --- a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -236,15 +236,15 @@ export default class SecurityRoomSettingsTab extends React.Component

{ _t( - " It’s not recommended to make encrypted rooms public. " + + "It's not recommended to make encrypted rooms public. " + "It will mean anyone can find and join the room, so anyone can read messages. " + - "You’ll get none of the benefits of encryption. Encrypting messages in a public " + + "You'll get none of the benefits of encryption. Encrypting messages in a public " + "room will make receiving and sending messages slower.", null, - { "b": (sub) => { sub } }, + { "b": (sub) => { sub } }, ) }

{ _t( - "To avoid these issues, create a new public room for the conversation " + + "To avoid these issues, create a new public room for the conversation " + "you plan to have.", null, { From 1b8aae9556814e977e776d8cb8bbed3429af554f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 07:56:56 +0200 Subject: [PATCH 058/619] i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/i18n/strings/en_EN.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 77d10b8719..abc08f6651 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1437,14 +1437,14 @@ "Permissions": "Permissions", "Select the roles required to change various parts of the room": "Select the roles required to change various parts of the room", "Are you sure you want to add encryption to this public room?": "Are you sure you want to add encryption to this public room?", - " It’s not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You’ll get none of the benefits of encryption, and you won’t be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to add encryption to public rooms. Anyone can find and join public rooms, so anyone can read messages in them. You’ll get none of the benefits of encryption, and you won’t be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.", - "To avoid these issues, create a new encrypted room for the conversation you plan to have.": "To avoid these issues, create a new encrypted room for the conversation you plan to have.", + "It's not recommended to add encryption to public rooms.Anyone can find and join public rooms, so anyone can read messages in them. You'll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": "It's not recommended to add encryption to public rooms.Anyone can find and join public rooms, so anyone can read messages in them. You'll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.", + "To avoid these issues, create a new encrypted room for the conversation you plan to have.": "To avoid these issues, create a new encrypted room for the conversation you plan to have.", "Enable encryption?": "Enable encryption?", "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.", "This upgrade will allow members of selected spaces access to this room without an invite.": "This upgrade will allow members of selected spaces access to this room without an invite.", "Are you sure you want to make this encrypted room public?": "Are you sure you want to make this encrypted room public?", - " It’s not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": " It’s not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You’ll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.", - "To avoid these issues, create a new public room for the conversation you plan to have.": "To avoid these issues, create a new public room for the conversation you plan to have.", + "It's not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You'll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": "It's not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You'll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.", + "To avoid these issues, create a new public room for the conversation you plan to have.": "To avoid these issues, create a new public room for the conversation you plan to have.", "To link to this room, please add an address.": "To link to this room, please add an address.", "Private (invite only)": "Private (invite only)", "Only invited people can join.": "Only invited people can join.", From f57bffad3c5bf3ecfdc17c93a75ce814ab2e35ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 09:05:33 +0200 Subject: [PATCH 059/619] Soften border color MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_EventTile.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 1c9d8e87d9..47512c3094 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -510,7 +510,7 @@ $hover-select-border: 4px; .mx_EventTile:hover .mx_EventTile_body pre, .mx_EventTile.focus-visible:focus-within .mx_EventTile_body pre { - border: 1px solid #e5e5e5; // deliberate constant as we're behind an invert filter + border: 1px solid $tertiary-fg-color; // deliberate constant as we're behind an invert filter } .mx_EventTile_pre_container { From 3c0ac487da0a0f2f9c2d5d0ae4e2d074003c701e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 6 Aug 2021 09:06:24 +0200 Subject: [PATCH 060/619] Remove comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_EventTile.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 47512c3094..6192fc4df9 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -510,7 +510,7 @@ $hover-select-border: 4px; .mx_EventTile:hover .mx_EventTile_body pre, .mx_EventTile.focus-visible:focus-within .mx_EventTile_body pre { - border: 1px solid $tertiary-fg-color; // deliberate constant as we're behind an invert filter + border: 1px solid $tertiary-fg-color; } .mx_EventTile_pre_container { From d43eac7722f45c23397e508870f20b6782163b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 8 Aug 2021 15:00:25 +0200 Subject: [PATCH 061/619] Add bubble highlight styling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_EventBubbleTile.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/res/css/views/rooms/_EventBubbleTile.scss b/res/css/views/rooms/_EventBubbleTile.scss index c6170bf7c0..c4d8fab56f 100644 --- a/res/css/views/rooms/_EventBubbleTile.scss +++ b/res/css/views/rooms/_EventBubbleTile.scss @@ -33,6 +33,10 @@ limitations under the License. margin-top: 2px; } + &.mx_EventTile_highlight .mx_EventTile_line { + background-color: $event-highlight-bg-color; + } + /* For replies */ .mx_EventTile { padding-top: 0; From 1c7a89b2e4b36b4e23d8c358ccf6db6cb1ee5580 Mon Sep 17 00:00:00 2001 From: Panagiotis <27917356+panoschal@users.noreply.github.com> Date: Sun, 8 Aug 2021 21:00:15 +0300 Subject: [PATCH 062/619] add comment - explain conditional statusBar --- src/components/structures/RoomView.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 69d4cfc590..781fb94ddc 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -1852,6 +1852,8 @@ export default class RoomView extends React.Component { "mx_RoomView_statusArea_expanded": isStatusAreaExpanded, }); + // if statusBar does not exist then statusBarArea is blank and takes up unnecessary space on the screen + // show statusBarArea only if statusBar is present const statusBarArea = statusBar &&

From d9718027892e0932ebf84ab10652c5d616e79f7b Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 10 Aug 2021 14:30:12 +0200 Subject: [PATCH 063/619] Create ThreadView phase in RightPanel --- res/css/views/messages/_MessageActionBar.scss | 4 + src/components/structures/RightPanel.tsx | 9 ++ src/components/structures/ThreadView.tsx | 90 +++++++++++++++++++ .../views/messages/MessageActionBar.js | 33 +++++-- src/i18n/strings/en_EN.json | 1 + src/stores/RightPanelStorePhases.ts | 3 + 6 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 src/components/structures/ThreadView.tsx diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index 69f3c672b7..509ded8ee8 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -92,6 +92,10 @@ limitations under the License. mask-image: url('$(res)/img/element-icons/room/message-bar/reply.svg'); } +.mx_MessageActionBar_threadButton::after { + mask-image: url('$(res)/img/element-icons/room/files.svg'); +} + .mx_MessageActionBar_editButton::after { mask-image: url('$(res)/img/element-icons/room/message-bar/edit.svg'); } diff --git a/src/components/structures/RightPanel.tsx b/src/components/structures/RightPanel.tsx index 95d70e913a..f2bd7db0f3 100644 --- a/src/components/structures/RightPanel.tsx +++ b/src/components/structures/RightPanel.tsx @@ -45,6 +45,7 @@ import GroupRoomInfo from "../views/groups/GroupRoomInfo"; import UserInfo from "../views/right_panel/UserInfo"; import ThirdPartyMemberInfo from "../views/rooms/ThirdPartyMemberInfo"; import FilePanel from "./FilePanel"; +import ThreadView from "./ThreadView"; import NotificationPanel from "./NotificationPanel"; import ResizeNotifier from "../../utils/ResizeNotifier"; import PinnedMessagesCard from "../views/right_panel/PinnedMessagesCard"; @@ -309,6 +310,14 @@ export default class RightPanel extends React.Component { panel = ; break; + case RightPanelPhases.ThreadView: + panel = ; + break; + case RightPanelPhases.RoomSummary: panel = ; break; diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx new file mode 100644 index 0000000000..8b196cb4f0 --- /dev/null +++ b/src/components/structures/ThreadView.tsx @@ -0,0 +1,90 @@ +/* +Copyright 2016 OpenMarket Ltd +Copyright 2019 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import { MatrixEvent } from 'matrix-js-sdk/src'; + +import BaseCard from "../views/right_panel/BaseCard"; +import { RightPanelPhases } from "../../stores/RightPanelStorePhases"; +import { replaceableComponent } from "../../utils/replaceableComponent"; +import { MatrixClientPeg } from '../../MatrixClientPeg'; + +import ResizeNotifier from '../../utils/ResizeNotifier'; +import EventTile from '../views/rooms/EventTile'; +import MessageComposer from '../views/rooms/MessageComposer'; + +interface IProps { + roomId: string; + onClose: () => void; + resizeNotifier: ResizeNotifier; + mxEvent: MatrixEvent; +} + +interface IState { +} + +/* + * Component which shows the filtered file using a TimelinePanel + */ +@replaceableComponent("structures.ThreadView") +class ThreadView extends React.Component { + state = {}; + + public componentDidMount(): void {} + + public componentWillUnmount(): void {} + + public renderEventTile(event: MatrixEvent): JSX.Element { + return ; + } + + public render() { + const client = MatrixClientPeg.get(); + const room = client.getRoom(this.props.roomId); + const thread = room.getThread(this.props.mxEvent.getId()); + return ( + + { this.renderEventTile(this.props.mxEvent) } + + { thread && ( + thread.eventTimeline.map((event: MatrixEvent) => { + return this.renderEventTile(event); + }) + ) } + + + + ); + } +} + +export default ThreadView; diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index 7fe0eca697..25f3dc740f 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -23,6 +23,8 @@ import { EventStatus } from 'matrix-js-sdk/src/models/event'; import { _t } from '../../../languageHandler'; import * as sdk from '../../../index'; import dis from '../../../dispatcher/dispatcher'; +import { Action } from '../../../dispatcher/actions'; +import { RightPanelPhases } from '../../../stores/RightPanelStorePhases'; import { aboveLeftOf, ContextMenu, ContextMenuTooltipButton, useContextMenu } from '../../structures/ContextMenu'; import { isContentActionable, canEditContent } from '../../../utils/EventUtils'; import RoomContext from "../../../contexts/RoomContext"; @@ -170,6 +172,17 @@ export default class MessageActionBar extends React.PureComponent { }); }; + onThreadClick = () => { + dis.dispatch({ + action: Action.SetRightPanelPhase, + phase: RightPanelPhases.ThreadView, + allowClose: false, + refireParams: { + event: this.props.mxEvent, + } + }); + } + onEditClick = (ev) => { dis.dispatch({ action: 'edit_event', @@ -254,12 +267,20 @@ export default class MessageActionBar extends React.PureComponent { // The only catch is we do the reply button first so that we can make sure the react // button is the very first button without having to do length checks for `splice()`. if (this.context.canReply) { - toolbarOpts.splice(0, 0, ); + toolbarOpts.splice(0, 0, <> + + + ); } if (this.context.canReact) { toolbarOpts.splice(0, 0, Date: Tue, 10 Aug 2021 15:50:23 +0100 Subject: [PATCH 064/619] Collapse lines together to reduce line/indent spam Signed-off-by: Paulo Pinto --- src/TextForEvent.tsx | 72 ++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index 1033ac9fd8..a85d44ecb3 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -442,22 +442,20 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string return () => ( - { - _t( - "%(senderName)s pinned a message to this room. See all pinned messages.", - { senderName }, - { - "a": (sub) => - onPinnedOrUnpinnedMessageClick(messageId, roomId)}> - { sub } - , - "b": (sub) => - - { sub } - , - }, - ) - } + { _t( + "%(senderName)s pinned a message to this room. See all pinned messages.", + { senderName }, + { + "a": (sub) => + onPinnedOrUnpinnedMessageClick(messageId, roomId)}> + { sub } + , + "b": (sub) => + + { sub } + , + }, + ) } ); } @@ -472,22 +470,20 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string return () => ( - { - _t( - "%(senderName)s unpinned a message from this room. See all pinned messages.", - { senderName }, - { - "a": (sub) => - onPinnedOrUnpinnedMessageClick(messageId, roomId)}> - { sub } - , - "b": (sub) => - - { sub } - , - }, - ) - } + { _t( + "%(senderName)s unpinned a message from this room. See all pinned messages.", + { senderName }, + { + "a": (sub) => + onPinnedOrUnpinnedMessageClick(messageId, roomId)}> + { sub } + , + "b": (sub) => + + { sub } + , + }, + ) } ); } @@ -498,13 +494,11 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string if (allowJSX) { return () => ( - { - _t( - "%(senderName)s changed the pinned messages for the room.", - { senderName }, - { "a": (sub) => { sub } }, - ) - } + { _t( + "%(senderName)s changed the pinned messages for the room.", + { senderName }, + { "a": (sub) => { sub } }, + ) } ); } From 45fd3d83b07814e31788da9421b2c3355dc7f422 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 10 Aug 2021 16:06:33 +0100 Subject: [PATCH 065/619] Refactor tests So that there's one top level `describe('TextForEvent')`, followed by a nested `describe('textForPinnedEvent')`, containting all the `it()`s. Signed-off-by: Paulo Pinto --- test/TextForEvent-test.ts | 136 ++++++++----------- test/__snapshots__/TextForEvent-test.ts.snap | 42 +++--- 2 files changed, 77 insertions(+), 101 deletions(-) diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index 0b3b73613a..b50996c186 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -23,88 +23,64 @@ function mockPinnedEvent( }); } -describe("TextForPinnedEvent - newly pinned message(s)", () => { - SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); +describe('TextForEvent', () => { + describe("TextForPinnedEvent", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); - it("mentions message when a single message was pinned, with no previously pinned messages", () => { - const event = mockPinnedEvent(['message-1']); - expect(textForEvent(event)).toBe("@foo:example.com pinned a message to this room. See all pinned messages."); - }); + it("mentions message when a single message was pinned, with no previously pinned messages", () => { + const event = mockPinnedEvent(['message-1']); + expect(textForEvent(event)).toBe( + "@foo:example.com pinned a message to this room. See all pinned messages.", + ); - it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { - const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); - expect(textForEvent(event)).toBe("@foo:example.com pinned a message to this room. See all pinned messages."); - }); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); - it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); - expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); - }); -}); - -describe("TextForPinnedEvent - newly pinned message(s) (JSX)", () => { - SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); - - it("mentions message when a single message was pinned, with no previously pinned messages", () => { - const event = mockPinnedEvent(['message-1']); - const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); - }); - - it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { - const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); - const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); - }); - - it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); - const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); - }); -}); - -describe("TextForPinnedEvent - newly unpinned message(s)", () => { - SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); - - it("mentions message when a single message was unpinned, with a single message previously pinned", () => { - const event = mockPinnedEvent([], ['message-1']); - expect(textForEvent(event)).toBe( - "@foo:example.com unpinned a message from this room. See all pinned messages.", - ); - }); - - it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { - const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); - expect(textForEvent(event)).toBe( - "@foo:example.com unpinned a message from this room. See all pinned messages.", - ); - }); - - it("shows generic text when multiple messages were unpinned", () => { - const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); - expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); - }); -}); - -describe("TextForPinnedEvent - newly unpinned message(s) (JSX)", () => { - SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); - - it("mentions message when a single message was unpinned, with a single message previously pinned", () => { - const event = mockPinnedEvent([], ['message-1']); - const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); - }); - - it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { - const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); - const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); - }); - - it("shows generic text when multiple messages were unpinned", () => { - const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); - const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); + expect(textForEvent(event)).toBe( + "@foo:example.com pinned a message to this room. See all pinned messages.", + ); + + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("shows generic text when multiple messages were pinned", () => { + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); + expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); + + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("mentions message when a single message was unpinned, with a single message previously pinned", () => { + const event = mockPinnedEvent([], ['message-1']); + expect(textForEvent(event)).toBe( + "@foo:example.com unpinned a message from this room. See all pinned messages.", + ); + + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); + expect(textForEvent(event)).toBe( + "@foo:example.com unpinned a message from this room. See all pinned messages.", + ); + + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("shows generic text when multiple messages were unpinned", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); + expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); + + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); }); }); diff --git a/test/__snapshots__/TextForEvent-test.ts.snap b/test/__snapshots__/TextForEvent-test.ts.snap index 124f7e0663..2b73dbeb3d 100644 --- a/test/__snapshots__/TextForEvent-test.ts.snap +++ b/test/__snapshots__/TextForEvent-test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message when a single message was pinned, with multiple previously pinned messages 1`] = ` +exports[`TextForEvent TextForPinnedEvent mentions message when a single message was pinned, with multiple previously pinned messages 1`] = ` @foo:example.com pinned @@ -20,7 +20,7 @@ exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message whe `; -exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message when a single message was pinned, with no previously pinned messages 1`] = ` +exports[`TextForEvent TextForPinnedEvent mentions message when a single message was pinned, with no previously pinned messages 1`] = ` @foo:example.com pinned @@ -40,23 +40,7 @@ exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message whe `; -exports[`TextForPinnedEvent - newly pinned message(s) (JSX) shows generic text when multiple messages were pinned 1`] = ` - - - @foo:example.com changed the - - - pinned messages - - - for the room. - - -`; - -exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message when a single message was unpinned, with a single message previously pinned 1`] = ` +exports[`TextForEvent TextForPinnedEvent mentions message when a single message was unpinned, with a single message previously pinned 1`] = ` @foo:example.com unpinned @@ -76,7 +60,7 @@ exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message w `; -exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message when a single message was unpinned, with multiple previously pinned messages 1`] = ` +exports[`TextForEvent TextForPinnedEvent mentions message when a single message was unpinned, with multiple previously pinned messages 1`] = ` @foo:example.com unpinned @@ -96,7 +80,23 @@ exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message w `; -exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) shows generic text when multiple messages were unpinned 1`] = ` +exports[`TextForEvent TextForPinnedEvent shows generic text when multiple messages were pinned 1`] = ` + + + @foo:example.com changed the + + + pinned messages + + + for the room. + + +`; + +exports[`TextForEvent TextForPinnedEvent shows generic text when multiple messages were unpinned 1`] = ` @foo:example.com changed the From 79cf69bedb776175c3c7409394091f3bef76c24e Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Wed, 11 Aug 2021 11:40:33 +0100 Subject: [PATCH 066/619] Refactor tests so that snapshots aren't used Signed-off-by: Paulo Pinto --- test/TextForEvent-test.ts | 85 +++++++++----- test/__snapshots__/TextForEvent-test.ts.snap | 113 ------------------- 2 files changed, 59 insertions(+), 139 deletions(-) delete mode 100644 test/__snapshots__/TextForEvent-test.ts.snap diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index b50996c186..ac9c8eba4d 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -23,64 +23,97 @@ function mockPinnedEvent( }); } +// Helper function that renders a component to a plain text string. +// Once snapshots are introduced in tests, this function will no longer be necessary, +// and should be replaced with snapshots. +function renderComponent(component): string { + const serializeObject = (object): string => { + if (typeof object === 'string') { + return object === ' ' ? '' : object; + } + + if (Array.isArray(object) && object.length === 1 && typeof object[0] === 'string') { + return object[0]; + } + + if (object['type'] !== undefined && typeof object['children'] !== undefined) { + return serializeObject(object.children); + } + + if (!Array.isArray(object)) { + return ''; + } + + return object.map(child => { + return serializeObject(child); + }).join(''); + }; + + return serializeObject(component.toJSON()); +} + describe('TextForEvent', () => { describe("TextForPinnedEvent", () => { SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); it("mentions message when a single message was pinned, with no previously pinned messages", () => { const event = mockPinnedEvent(['message-1']); - expect(textForEvent(event)).toBe( - "@foo:example.com pinned a message to this room. See all pinned messages.", - ); - + const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + + const expectedText = "@foo:example.com pinned a message to this room. See all pinned messages."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); }); it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); - expect(textForEvent(event)).toBe( - "@foo:example.com pinned a message to this room. See all pinned messages.", - ); - + const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + + const expectedText = "@foo:example.com pinned a message to this room. See all pinned messages."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); }); it("shows generic text when multiple messages were pinned", () => { const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); - expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); - + const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + + const expectedText = "@foo:example.com changed the pinned messages for the room."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); }); it("mentions message when a single message was unpinned, with a single message previously pinned", () => { const event = mockPinnedEvent([], ['message-1']); - expect(textForEvent(event)).toBe( - "@foo:example.com unpinned a message from this room. See all pinned messages.", - ); - + const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + + const expectedText = "@foo:example.com unpinned a message from this room. See all pinned messages."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); }); it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); - expect(textForEvent(event)).toBe( - "@foo:example.com unpinned a message from this room. See all pinned messages.", - ); - + const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + + const expectedText = "@foo:example.com unpinned a message from this room. See all pinned messages."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); }); it("shows generic text when multiple messages were unpinned", () => { const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); - expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); - + const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); - expect(component.toJSON()).toMatchSnapshot(); + + const expectedText = "@foo:example.com changed the pinned messages for the room."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); }); }); }); diff --git a/test/__snapshots__/TextForEvent-test.ts.snap b/test/__snapshots__/TextForEvent-test.ts.snap deleted file mode 100644 index 2b73dbeb3d..0000000000 --- a/test/__snapshots__/TextForEvent-test.ts.snap +++ /dev/null @@ -1,113 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`TextForEvent TextForPinnedEvent mentions message when a single message was pinned, with multiple previously pinned messages 1`] = ` - - - @foo:example.com pinned - - a message - - to this room. See all - - pinned messages - - . - - -`; - -exports[`TextForEvent TextForPinnedEvent mentions message when a single message was pinned, with no previously pinned messages 1`] = ` - - - @foo:example.com pinned - - a message - - to this room. See all - - pinned messages - - . - - -`; - -exports[`TextForEvent TextForPinnedEvent mentions message when a single message was unpinned, with a single message previously pinned 1`] = ` - - - @foo:example.com unpinned - - a message - - from this room. See all - - pinned messages - - . - - -`; - -exports[`TextForEvent TextForPinnedEvent mentions message when a single message was unpinned, with multiple previously pinned messages 1`] = ` - - - @foo:example.com unpinned - - a message - - from this room. See all - - pinned messages - - . - - -`; - -exports[`TextForEvent TextForPinnedEvent shows generic text when multiple messages were pinned 1`] = ` - - - @foo:example.com changed the - - - pinned messages - - - for the room. - - -`; - -exports[`TextForEvent TextForPinnedEvent shows generic text when multiple messages were unpinned 1`] = ` - - - @foo:example.com changed the - - - pinned messages - - - for the room. - - -`; From ca8832f6faaeef9655000520d60f30fd502bbf83 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Wed, 11 Aug 2021 14:47:49 +0100 Subject: [PATCH 067/619] Fix test case The test case is: "mentions message when a single message was pinned, with multiple previously pinned messages" However, the test case was also unpinning messages. That is now fixed. Signed-off-by: Paulo Pinto --- test/TextForEvent-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index ac9c8eba4d..30bc68751a 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -67,7 +67,7 @@ describe('TextForEvent', () => { }); it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { - const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']); + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1', 'message-2']); const plainText = textForEvent(event); const component = renderer.create(textForEvent(event, true)); From a51b1141717fa12e7fb2517bd2ff754286f9a368 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Wed, 11 Aug 2021 14:51:36 +0100 Subject: [PATCH 068/619] Change order of test cases Just moving test cases so that "generic message" ones are grouped at the bottom. Signed-off-by: Paulo Pinto --- test/TextForEvent-test.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index 30bc68751a..285d4de232 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -76,16 +76,6 @@ describe('TextForEvent', () => { expect(renderComponent(component)).toBe(expectedText); }); - it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); - const plainText = textForEvent(event); - const component = renderer.create(textForEvent(event, true)); - - const expectedText = "@foo:example.com changed the pinned messages for the room."; - expect(plainText).toBe(expectedText); - expect(renderComponent(component)).toBe(expectedText); - }); - it("mentions message when a single message was unpinned, with a single message previously pinned", () => { const event = mockPinnedEvent([], ['message-1']); const plainText = textForEvent(event); @@ -106,6 +96,16 @@ describe('TextForEvent', () => { expect(renderComponent(component)).toBe(expectedText); }); + it("shows generic text when multiple messages were pinned", () => { + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); + const plainText = textForEvent(event); + const component = renderer.create(textForEvent(event, true)); + + const expectedText = "@foo:example.com changed the pinned messages for the room."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); + }); + it("shows generic text when multiple messages were unpinned", () => { const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); const plainText = textForEvent(event); From aaeb9969a47db6abdf7200668ea35d4f68c1d52e Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Wed, 11 Aug 2021 14:56:59 +0100 Subject: [PATCH 069/619] Handle case where one message is pinned, and another unpinned Signed-off-by: Paulo Pinto --- src/TextForEvent.tsx | 4 ++-- test/TextForEvent-test.ts | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index a85d44ecb3..1c5e9ec6f0 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -435,7 +435,7 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string const newlyPinned = pinned.filter(item => previouslyPinned.indexOf(item) < 0); const newlyUnpinned = previouslyPinned.filter(item => pinned.indexOf(item) < 0); - if (newlyPinned.length === 1) { + if (newlyPinned.length === 1 && newlyUnpinned.length === 0) { // A single message was pinned, include a link to that message. if (allowJSX) { const messageId = newlyPinned.pop(); @@ -463,7 +463,7 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string return () => _t("%(senderName)s pinned a message to this room. See all pinned messages.", { senderName }); } - if (newlyUnpinned.length === 1) { + if (newlyUnpinned.length === 1 && newlyPinned.length === 0) { // A single message was unpinned, include a link to that message. if (allowJSX) { const messageId = newlyUnpinned.pop(); diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index 285d4de232..b8a459af67 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -115,5 +115,15 @@ describe('TextForEvent', () => { expect(plainText).toBe(expectedText); expect(renderComponent(component)).toBe(expectedText); }); + + it("shows generic text when one message was pinned, and another unpinned", () => { + const event = mockPinnedEvent(['message-2'], ['message-1']); + const plainText = textForEvent(event); + const component = renderer.create(textForEvent(event, true)); + + const expectedText = "@foo:example.com changed the pinned messages for the room."; + expect(plainText).toBe(expectedText); + expect(renderComponent(component)).toBe(expectedText); + }); }); }); From d74e9c4f905327210e61ecf82982ac52a0ee49a6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 11 Aug 2021 16:47:14 +0100 Subject: [PATCH 070/619] Remove impossible space hierarchy size string --- res/css/structures/_SpaceHierarchy.scss | 6 ++++++ src/components/structures/SpaceHierarchy.tsx | 14 +------------- src/i18n/strings/en_EN.json | 6 ++---- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/res/css/structures/_SpaceHierarchy.scss b/res/css/structures/_SpaceHierarchy.scss index d79eed1a64..f5810b8dfe 100644 --- a/res/css/structures/_SpaceHierarchy.scss +++ b/res/css/structures/_SpaceHierarchy.scss @@ -70,6 +70,12 @@ limitations under the License. font-size: $font-15px; line-height: $font-24px; color: $primary-fg-color; + margin-bottom: 12px; + + > h4 { + font-weight: $font-semi-bold; + margin: 0; + } .mx_AccessibleButton { padding: 4px 12px; diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index f13fc7f208..c55902cf70 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -444,18 +444,6 @@ const SpaceHierarchy = ({ if (loading) { content = ; } else { - const numRooms = Array.from(filteredRoomSet).filter(r => !r.room_type).length; - const numSpaces = filteredRoomSet.size - numRooms - 1; // -1 at the end to exclude the space we are looking at - - let countsStr; - if (numSpaces > 1) { - countsStr = _t("%(count)s rooms and %(numSpaces)s spaces", { count: numRooms, numSpaces }); - } else if (numSpaces > 0) { - countsStr = _t("%(count)s rooms and 1 space", { count: numRooms, numSpaces }); - } else { - countsStr = _t("%(count)s rooms", { count: numRooms, numSpaces }); - } - let manageButtons; if (space.getMyMembership() === "join" && space.currentState.maySendStateEvent(EventType.SpaceChild, userId)) { const selectedRelations = Array.from(selected.keys()).flatMap(parentId => { @@ -582,7 +570,7 @@ const SpaceHierarchy = ({ content = <>
- { countsStr } +

{ query.trim() ? _t("Results") : _t("Rooms and spaces") }

{ additionalButtons } { manageButtons } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 64a3fe2951..9f41542007 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2811,10 +2811,6 @@ "This room is suggested as a good one to join": "This room is suggested as a good one to join", "Suggested": "Suggested", "Your server does not support showing space hierarchies.": "Your server does not support showing space hierarchies.", - "%(count)s rooms and %(numSpaces)s spaces|other": "%(count)s rooms and %(numSpaces)s spaces", - "%(count)s rooms and %(numSpaces)s spaces|one": "%(count)s room and %(numSpaces)s spaces", - "%(count)s rooms and 1 space|other": "%(count)s rooms and 1 space", - "%(count)s rooms and 1 space|one": "%(count)s room and 1 space", "Select a room below first": "Select a room below first", "Failed to remove some rooms. Try again later": "Failed to remove some rooms. Try again later", "Removing...": "Removing...", @@ -2822,6 +2818,8 @@ "Mark as suggested": "Mark as suggested", "No results found": "No results found", "You may want to try a different search or check for typos.": "You may want to try a different search or check for typos.", + "Results": "Results", + "Rooms and spaces": "Rooms and spaces", "Search names and descriptions": "Search names and descriptions", "Private space": "Private space", " invites you": " invites you", From ee0eda794757c426db1c55c1b9b009a36ed43f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 11 Aug 2021 17:54:18 +0200 Subject: [PATCH 071/619] Add ignoreSelfEvent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../algorithms/tag-sorting/RecentAlgorithm.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts index f47458d1b1..23fff70eef 100644 --- a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts +++ b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts @@ -20,6 +20,25 @@ import { IAlgorithm } from "./IAlgorithm"; import { MatrixClientPeg } from "../../../../MatrixClientPeg"; import * as Unread from "../../../../Unread"; import { EffectiveMembership, getEffectiveMembership } from "../../../../utils/membership"; +import { EventType } from "matrix-js-sdk/src/@types/event"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; + +const ignoreSelfEvent = (event: MatrixEvent): boolean => { + const type = event.getType(); + const content = event.getContent(); + const prevContent = event.getPrevContent(); + + // Never ignore membership changes + if (type === EventType.RoomMember && prevContent.membership !== content.membership) return false; + + // Ignore status changes + // XXX: This should be an enum + if (type === "im.vector.user_status") return true; + // Ignore display name changes + if (type === EventType.RoomMember && prevContent.displayname !== content.displayname) return true; + + return false; +}; export const sortRooms = (rooms: Room[]): Room[] => { // We cache the timestamp lookup to avoid iterating forever on the timeline From 1f98ea4562844a64157e9629b184903bc017a068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 11 Aug 2021 17:54:27 +0200 Subject: [PATCH 072/619] Use ignoreSelfEvent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../room-list/algorithms/tag-sorting/RecentAlgorithm.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts index 23fff70eef..539cfde726 100644 --- a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts +++ b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts @@ -87,7 +87,10 @@ export const sortRooms = (rooms: Room[]): Room[] => { const ev = r.timeline[i]; if (!ev.getTs()) continue; // skip events that don't have timestamps (tests only?) - if (ev.getSender() === myUserId || Unread.eventTriggersUnreadCount(ev)) { + if ( + (ev.getSender() === myUserId && !ignoreSelfEvent(ev)) || + Unread.eventTriggersUnreadCount(ev) + ) { return ev.getTs(); } } From 38645d90545d28f0726fde571b18e0b230a0f18d Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 11 Aug 2021 17:07:53 +0100 Subject: [PATCH 073/619] Fix loading state issues for spaces pagination --- src/components/structures/SpaceHierarchy.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index c55902cf70..cea6a568e7 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -441,7 +441,7 @@ const SpaceHierarchy = ({ let content: JSX.Element; let loader: JSX.Element; - if (loading) { + if (loading && !rooms.length) { content = ; } else { let manageButtons; @@ -558,9 +558,11 @@ const SpaceHierarchy = ({ /> ; - loader =
- -
; + if (hierarchy.canLoadMore) { + loader =
+ +
; + } } else { results =

{ _t("No results found") }

From 8216a35a56d8962f1d172ff43fe2a467a7677b6e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 11 Aug 2021 21:02:30 +0100 Subject: [PATCH 074/619] remove spurious mxclient stub --- test/test-utils.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/test-utils.js b/test/test-utils.js index b337828b68..11a3400fbb 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -84,9 +84,6 @@ export function createTestClient() { generateClientSecret: () => "t35tcl1Ent5ECr3T", isGuest: () => false, isCryptoEnabled: () => false, - getSpaceSummary: jest.fn().mockReturnValue({ - rooms: [], - }), getRoomHierarchy: jest.fn().mockReturnValue({ rooms: [], }), From 7265874217e7841ea1acc455026f0896c91facb8 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 11 Aug 2021 20:33:48 +0000 Subject: [PATCH 075/619] Translated using Weblate (Hungarian) Currently translated at 100.0% (3116 of 3116 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index a616d0cc23..227515c414 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3638,5 +3638,6 @@ "Stop sharing your screen": "Képernyőmegosztás kikapcsolása", "Stop the camera": "Kamera kikapcsolása", "Start the camera": "Kamera bekapcsolása", - "Surround selected text when typing special characters": "Kijelölt szöveg körülvétele speciális karakterek beírásakor" + "Surround selected text when typing special characters": "Kijelölt szöveg körülvétele speciális karakterek beírásakor", + "Don't send read receipts": "Ne küldjön olvasási visszajelzést" } From 23b59b15e23760c1adfdc581c6d11bff2b603901 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 11 Aug 2021 19:22:09 +0000 Subject: [PATCH 076/619] Translated using Weblate (Czech) Currently translated at 100.0% (3116 of 3116 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 04956ba68c..5fcd597800 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -194,7 +194,7 @@ "Return to login screen": "Vrátit k přihlašovací obrazovce", "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s není oprávněn posílat vám oznámení – zkontrolujte prosím nastavení svého prohlížeče", "%(brand)s was not given permission to send notifications - please try again": "%(brand)s nebyl oprávněn k posílání oznámení – zkuste to prosím znovu", - "%(brand)s version:": "verze %(brand)s:", + "%(brand)s version:": "Verze %(brand)s:", "Room %(roomId)s not visible": "Místnost %(roomId)s není viditelná", "Room Colour": "Barva místnosti", "%(roomName)s does not exist.": "%(roomName)s neexistuje.", From f2dccbc9f7bc58ee46609c31650d3f18af6cde28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 09:38:57 +0200 Subject: [PATCH 077/619] Use function syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../room-list/algorithms/tag-sorting/RecentAlgorithm.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts index 539cfde726..5ddfd96c8a 100644 --- a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts +++ b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts @@ -23,7 +23,7 @@ import { EffectiveMembership, getEffectiveMembership } from "../../../../utils/m import { EventType } from "matrix-js-sdk/src/@types/event"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -const ignoreSelfEvent = (event: MatrixEvent): boolean => { +export function ignoreSelfEvent(event: MatrixEvent): boolean { const type = event.getType(); const content = event.getContent(); const prevContent = event.getPrevContent(); @@ -38,7 +38,7 @@ const ignoreSelfEvent = (event: MatrixEvent): boolean => { if (type === EventType.RoomMember && prevContent.displayname !== content.displayname) return true; return false; -}; +} export const sortRooms = (rooms: Room[]): Room[] => { // We cache the timestamp lookup to avoid iterating forever on the timeline From 0a4a1506d412cdec610196af73fca6401fead15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 09:40:26 +0200 Subject: [PATCH 078/619] Use ignoreSelfEvent in the RoomListStore (which doesn't work!) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/room-list/RoomListStore.ts | 4 ++++ .../room-list/algorithms/tag-sorting/RecentAlgorithm.ts | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index 1a5ef0484e..6a80bcd1e5 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -38,6 +38,7 @@ import { SpaceWatcher } from "./SpaceWatcher"; import SpaceStore from "../SpaceStore"; import { Action } from "../../dispatcher/actions"; import { SettingUpdatedPayload } from "../../dispatcher/payloads/SettingUpdatedPayload"; +import { ignoreSelfEvent } from "./algorithms/tag-sorting/RecentAlgorithm"; interface IState { tagsEnabled?: boolean; @@ -270,6 +271,9 @@ export class RoomListStoreClass extends AsyncStoreWithClient { // Ignore non-live events (backfill) if (!eventPayload.isLiveEvent || !payload.isLiveUnfilteredRoomTimelineEvent) return; + // Avoid re-ordering on status, profile etc. changes + if (ignoreSelfEvent(eventPayload.event)) return; + const roomId = eventPayload.event.getRoomId(); const room = this.matrixClient.getRoom(roomId); const tryUpdate = async (updatedRoom: Room) => { diff --git a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts index 5ddfd96c8a..bbfac876bc 100644 --- a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts +++ b/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts @@ -87,10 +87,7 @@ export const sortRooms = (rooms: Room[]): Room[] => { const ev = r.timeline[i]; if (!ev.getTs()) continue; // skip events that don't have timestamps (tests only?) - if ( - (ev.getSender() === myUserId && !ignoreSelfEvent(ev)) || - Unread.eventTriggersUnreadCount(ev) - ) { + if (ev.getSender() === myUserId || Unread.eventTriggersUnreadCount(ev)) { return ev.getTs(); } } From dc3fd697368b8fdffbcdfa5702d8d918ad16f007 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 12 Aug 2021 03:39:58 +0000 Subject: [PATCH 079/619] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3117 of 3117 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 837e371070..b10a4c7273 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3648,5 +3648,7 @@ "Surround selected text when typing special characters": "輸入特殊字元以環繞選取的文字", "%(oneUser)schanged the pinned messages for the room %(count)s times.|other": "%(oneUser)s 變更了聊天室的釘選訊息 %(count)s 次。", "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s 變更了聊天室的釘選訊息 %(count)s 次。", - "Olm version:": "Olm 版本:" + "Olm version:": "Olm 版本:", + "Delete avatar": "刪除大頭照", + "Don't send read receipts": "不要傳送讀取回條" } From c4e4b913023497c9a4ab31bab234f44691bb764e Mon Sep 17 00:00:00 2001 From: Tirifto Date: Wed, 11 Aug 2021 23:53:52 +0000 Subject: [PATCH 080/619] Translated using Weblate (Esperanto) Currently translated at 92.7% (2891 of 3117 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index d70b933e31..c97adeb05f 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -3337,5 +3337,31 @@ "Identity server": "Identiga servilo", "Identity server (%(server)s)": "Identiga servilo (%(server)s)", "Could not connect to identity server": "Ne povis konektiĝi al identiga servilo", - "Not a valid identity server (status code %(code)s)": "Nevalida identiga servilo (statkodo %(code)s)" + "Not a valid identity server (status code %(code)s)": "Nevalida identiga servilo (statkodo %(code)s)", + "Silence call": "Silenta voko", + "Sound on": "Kun sono", + "User %(userId)s is already invited to the room": "Uzanto %(userId)s jam invitiĝis al la ĉambro", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s ŝanĝis la fiksitajn mesaĝojn de la ĉambro.", + "%(senderName)s kicked %(targetName)s": "%(senderName)s forpelis uzanton %(targetName)s", + "%(senderName)s kicked %(targetName)s: %(reason)s": "%(senderName)s forpelis uzanton %(targetName)s: %(reason)s", + "%(senderName)s unbanned %(targetName)s": "%(senderName)s malforbaris uzanton %(targetName)s", + "%(targetName)s left the room": "%(targetName)s foriris de la ĉambro", + "%(targetName)s left the room: %(reason)s": "%(targetName)s foriris de la ĉambro: %(reason)s", + "%(targetName)s rejected the invitation": "%(targetName)s rifuzis la inviton", + "%(targetName)s joined the room": "%(targetName)s aliĝis al la ĉambro", + "%(senderName)s made no change": "%(senderName)s faris nenian ŝanĝon", + "%(senderName)s set a profile picture": "%(senderName)s agordis profilbildon", + "%(senderName)s changed their profile picture": "%(senderName)s ŝanĝis sian profilbildon", + "%(senderName)s removed their profile picture": "%(senderName)s forigis sian profilbildon", + "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s forigis sian prezentan nomon (%(oldDisplayName)s)", + "%(senderName)s set their display name to %(displayName)s": "%(senderName)s ŝanĝis sian prezentan nomon al %(displayName)s", + "%(oldDisplayName)s changed their display name to %(displayName)s": "%(oldDisplayName)s ŝanĝis sian prezentan nomon al %(displayName)s", + "%(senderName)s banned %(targetName)s": "%(senderName)s forbaris uzanton %(targetName)s", + "%(senderName)s banned %(targetName)s: %(reason)s": "%(senderName)s forbaris uzanton %(targetName)s: %(reason)s", + "%(targetName)s accepted an invitation": "%(targetName)s akceptis inviton", + "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s akceptis la inviton por %(displayName)s", + "Some invites couldn't be sent": "Ne povis sendi iujn invitojn", + "We sent the others, but the below people couldn't be invited to ": "Ni sendis la aliajn, sed la ĉi-subaj personoj ne povis ricevi inviton al ", + "Transfer Failed": "Malsukcesis transdono", + "Unable to transfer call": "Ne povas transdoni vokon" } From 8f1e5b7cad9962891cf1bbc1dff7c5626d21810b Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 12 Aug 2021 05:08:17 +0000 Subject: [PATCH 081/619] Translated using Weblate (Czech) Currently translated at 100.0% (3117 of 3117 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 5fcd597800..eb9f36c9a8 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3564,5 +3564,6 @@ "%(oneUser)schanged the pinned messages for the room %(count)s times.|other": "%(oneUser)s%(count)s krát změnil(a) připnuté zprávy místnosti.", "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s%(count)s krát změnili připnuté zprávy místnosti.", "Olm version:": "Verze Olm:", - "Don't send read receipts": "Neposílat potvrzení o přečtení" + "Don't send read receipts": "Neposílat potvrzení o přečtení", + "Delete avatar": "Smazat avatar" } From d51e2e3500e3481c58d8c98d1aa9a9ca1af4187f Mon Sep 17 00:00:00 2001 From: XoseM Date: Thu, 12 Aug 2021 05:43:06 +0000 Subject: [PATCH 082/619] Translated using Weblate (Galician) Currently translated at 100.0% (3117 of 3117 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 90c120abb1..731d386b38 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3645,5 +3645,7 @@ "Stop sharing your screen": "Deixar de compartir a pantalla", "Stop the camera": "Pechar a cámara", "Start the camera": "Abrir a cámara", - "Surround selected text when typing special characters": "Rodea o texto seleccionado ao escribir caracteres especiais" + "Surround selected text when typing special characters": "Rodea o texto seleccionado ao escribir caracteres especiais", + "Delete avatar": "Eliminar avatar", + "Don't send read receipts": "Non enviar confirmación de lectura" } From 31ffe33cf3ff5d9112f533b777c3a952783a088a Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Thu, 12 Aug 2021 10:15:03 +0000 Subject: [PATCH 083/619] Translated using Weblate (Russian) Currently translated at 98.3% (3067 of 3117 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 789a38811f..6d6bf86559 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -3579,5 +3579,7 @@ "Unable to transfer call": "Не удалось перевести звонок", "Olm version:": "Версия Olm:", "%(oneUser)schanged the pinned messages for the room %(count)s times.|other": "%(oneUser)s изменил(а) прикреплённые сообщения в комнате %(count)s раз.", - "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s изменили прикреплённые сообщения в комнате %(count)s раз." + "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s изменили прикреплённые сообщения в комнате %(count)s раз.", + "Delete avatar": "Удалить аватар", + "Don't send read receipts": "Не отправлять уведомления о прочтении" } From 0f778479006f0fed737a6d8202b50eb31b16bf7b Mon Sep 17 00:00:00 2001 From: jelv Date: Thu, 12 Aug 2021 10:55:58 +0000 Subject: [PATCH 084/619] Translated using Weblate (Dutch) Currently translated at 99.4% (3124 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1dc7cd04f4..2de5479fc8 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3533,5 +3533,16 @@ "Start sharing your screen": "Schermdelen starten", "Stop sharing your screen": "Schermdelen stoppen", "Stop the camera": "Camera stoppen", - "Start the camera": "Camera starten" + "Start the camera": "Camera starten", + "If a community isn't shown you may not have permission to convert it.": "Als een gemeenschap niet zichtbaar is heeft u geen rechten om hem om te zetten.", + "Show my Communities": "Mijn gemeenschappen weergeven", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Gemeenschappen zijn gearchiveerd om ruimte te maken voor Spaces, maar u kunt uw gemeenschap omzetten naar een space hieronder. Hierdoor bent u er zeker van dat uw gesprekken de nieuwste functies krijgen.", + "Create Space": "Space aanmaken", + "Open Space": "Space openen", + "To join an existing space you'll need an invite.": "Om deel te nemen aan een bestaande space heeft u een uitnodiging nodig.", + "You can also create a Space from a community.": "U kunt ook een Space maken van een gemeenschap.", + "You can change this later.": "U kan dit later aanpassen.", + "What kind of Space do you want to create?": "Wat voor soort Space wilt u maken?", + "Delete avatar": "Afbeelding verwijderen", + "Don't send read receipts": "Geen leesbevestigingen versturen" } From 85b1f166e8fb122d7db8a69c9c659164de6e9823 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 12 Aug 2021 12:03:14 +0100 Subject: [PATCH 085/619] post-merge tidy up --- res/css/structures/_SpaceHierarchy.scss | 8 +- src/components/structures/SpaceHierarchy.tsx | 264 ++++++++++--------- src/i18n/strings/en_EN.json | 8 +- 3 files changed, 154 insertions(+), 126 deletions(-) diff --git a/res/css/structures/_SpaceHierarchy.scss b/res/css/structures/_SpaceHierarchy.scss index 0cefaf252f..74dfb5da6b 100644 --- a/res/css/structures/_SpaceHierarchy.scss +++ b/res/css/structures/_SpaceHierarchy.scss @@ -116,6 +116,12 @@ limitations under the License. } } + .mx_SpaceHierarchy_list { + list-style: none; + padding: 0; + margin: 0; + } + .mx_SpaceHierarchy_roomCount { > h3 { display: inline; @@ -264,7 +270,7 @@ limitations under the License. } } - li.mx_SpaceRoomDirectory_roomTileWrapper { + li.mx_SpaceHierarchy_roomTileWrapper { list-style: none; } diff --git a/src/components/structures/SpaceHierarchy.tsx b/src/components/structures/SpaceHierarchy.tsx index 120f82f717..a0d4d9c42a 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/src/components/structures/SpaceHierarchy.tsx @@ -23,15 +23,18 @@ import React, { useState, KeyboardEvent, KeyboardEventHandler, + useContext, + SetStateAction, + Dispatch, } from "react"; import { Room } from "matrix-js-sdk/src/models/room"; import { RoomHierarchy } from "matrix-js-sdk/src/room-hierarchy"; import { EventType, RoomType } from "matrix-js-sdk/src/@types/event"; import { IHierarchyRelation, IHierarchyRoom } from "matrix-js-sdk/src/@types/spaces"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; import classNames from "classnames"; import { sortBy } from "lodash"; -import { MatrixClientPeg } from "../../MatrixClientPeg"; import dis from "../../dispatcher/dispatcher"; import defaultDispatcher from "../../dispatcher/dispatcher"; import { _t } from "../../languageHandler"; @@ -53,12 +56,13 @@ import { Action } from "../../dispatcher/actions"; import { Key } from "../../Keyboard"; import { IState, RovingTabIndexProvider, useRovingTabIndex } from "../../accessibility/RovingTabIndex"; import { getDisplayAliasForRoom } from "./RoomDirectory"; +import MatrixClientContext from "../../contexts/MatrixClientContext"; interface IProps { space: Room; initialText?: string; additionalButtons?: ReactNode; - showRoom(hierarchy: RoomHierarchy, roomId: string, autoJoin?: boolean): void; + showRoom(cli: MatrixClient, hierarchy: RoomHierarchy, roomId: string, autoJoin?: boolean): void; } interface ITileProps { @@ -81,7 +85,7 @@ const Tile: React.FC = ({ numChildRooms, children, }) => { - const cli = MatrixClientPeg.get(); + const cli = useContext(MatrixClientContext); const joinedRoom = cli.getRoom(room.room_id)?.getMyMembership() === "join" ? cli.getRoom(room.room_id) : null; const name = joinedRoom?.name || room.name || room.canonical_alias || room.aliases?.[0] || (room.room_type === RoomType.Space ? _t("Unnamed Space") : _t("Unnamed Room")); @@ -238,7 +242,7 @@ const Tile: React.FC = ({ handled = true; if (showChildren) { const childSection = ref.current?.nextElementSibling; - childSection?.querySelector(".mx_SpaceRoomDirectory_roomTile")?.focus(); + childSection?.querySelector(".mx_SpaceHierarchy_roomTile")?.focus(); } else { toggleShowChildren(); } @@ -253,7 +257,7 @@ const Tile: React.FC = ({ } return
  • @@ -274,12 +278,12 @@ const Tile: React.FC = ({
  • ; }; -export const showRoom = (hierarchy: RoomHierarchy, roomId: string, autoJoin = false) => { +export const showRoom = (cli: MatrixClient, hierarchy: RoomHierarchy, roomId: string, autoJoin = false) => { const room = hierarchy.roomMap.get(roomId); // Don't let the user view a room they won't be able to either peek or join: // fail earlier so they don't have to click back to the directory. - if (MatrixClientPeg.get().isGuest()) { + if (cli.isGuest()) { if (!room.world_readable && !room.guest_can_join) { dis.dispatch({ action: "require_registration" }); return; @@ -322,7 +326,7 @@ export const HierarchyLevel = ({ onViewRoomClick, onToggleClick, }: IHierarchyLevelProps) => { - const cli = MatrixClientPeg.get(); + const cli = useContext(MatrixClientContext); const space = cli.getRoom(root.room_id); const hasPermissions = space?.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()); @@ -462,14 +466,107 @@ const useIntersectionObserver = (callback: () => void) => { }; }; +interface IManageButtonsProps { + hierarchy: RoomHierarchy; + selected: Map>; + setSelected: Dispatch>>>; + setError: Dispatch>; +} + +const ManageButtons = ({ hierarchy, selected, setSelected, setError }: IManageButtonsProps) => { + const cli = useContext(MatrixClientContext); + + const [removing, setRemoving] = useState(false); + const [saving, setSaving] = useState(false); + + const selectedRelations = Array.from(selected.keys()).flatMap(parentId => { + return [ + ...selected.get(parentId).values(), + ].map(childId => [parentId, childId]) as [string, string][]; + }); + + const selectionAllSuggested = selectedRelations.every(([parentId, childId]) => { + return hierarchy.isSuggested(parentId, childId); + }); + + const disabled = !selectedRelations.length || removing || saving; + + let Button: React.ComponentType> = AccessibleButton; + let props = {}; + if (!selectedRelations.length) { + Button = AccessibleTooltipButton; + props = { + tooltip: _t("Select a room below first"), + yOffset: -40, + }; + } + + return <> + + + ; +}; + const SpaceHierarchy = ({ space, initialText = "", showRoom, additionalButtons, }: IProps) => { - const cli = MatrixClientPeg.get(); - const userId = cli.getUserId(); + const cli = useContext(MatrixClientContext); const [query, setQuery] = useState(initialText); const [selected, setSelected] = useState(new Map>()); // Map> @@ -502,8 +599,6 @@ const SpaceHierarchy = ({ }, [rooms, hierarchy, query]); const [error, setError] = useState(""); - const [removing, setRemoving] = useState(false); - const [saving, setSaving] = useState(false); const loaderRef = useIntersectionObserver(loadMore); @@ -511,13 +606,29 @@ const SpaceHierarchy = ({ return

    { _t("Your server does not support showing space hierarchies.") }

    ; } - const onKeyDown = (ev: KeyboardEvent, state: IState) => { - if (ev.key === Key.ARROW_DOWN && ev.currentTarget.classList.contains("mx_SpaceRoomDirectory_search")) { + const onKeyDown = (ev: KeyboardEvent, state: IState): void => { + if (ev.key === Key.ARROW_DOWN && ev.currentTarget.classList.contains("mx_SpaceHierarchy_search")) { state.refs[0]?.current?.focus(); } }; - // TODO loading state/error state + const onToggleClick = (parentId: string, childId: string): void => { + setError(""); + if (!selected.has(parentId)) { + setSelected(new Map(selected.set(parentId, new Set([childId])))); + return; + } + + const parentSet = selected.get(parentId); + if (!parentSet.has(childId)) { + setSelected(new Map(selected.set(parentId, new Set([...parentSet, childId])))); + return; + } + + parentSet.delete(childId); + setSelected(new Map(selected.set(parentId, new Set(parentSet)))); + }; + return { ({ onKeyDownHandler }) => { let content: JSX.Element; @@ -526,93 +637,11 @@ const SpaceHierarchy = ({ if (loading && !rooms.length) { content = ; } else { - let manageButtons; - if (space.getMyMembership() === "join" && space.currentState.maySendStateEvent(EventType.SpaceChild, userId)) { - const selectedRelations = Array.from(selected.keys()).flatMap(parentId => { - return [ - ...selected.get(parentId).values(), - ].map(childId => [parentId, childId]) as [string, string][]; - }); - - const selectionAllSuggested = selectedRelations.every(([parentId, childId]) => { - return hierarchy.isSuggested(parentId, childId); - }); - - const disabled = !selectedRelations.length || removing || saving; - - let Button: React.ComponentType> = AccessibleButton; - let props = {}; - if (!selectedRelations.length) { - Button = AccessibleTooltipButton; - props = { - tooltip: _t("Select a room below first"), - yOffset: -40, - }; - } - - manageButtons = <> - - - ; - } + const hasPermissions = space?.getMyMembership() === "join" && + space.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()); let results: JSX.Element; if (filteredRoomSet.size) { - const hasPermissions = space?.currentState.maySendStateEvent(EventType.SpaceChild, cli.getUserId()); - results = <> { - setError(""); - if (!selected.has(parentId)) { - setSelected(new Map(selected.set(parentId, new Set([childId])))); - return; - } - - const parentSet = selected.get(parentId); - if (!parentSet.has(childId)) { - setSelected(new Map(selected.set(parentId, new Set([...parentSet, childId])))); - return; - } - - parentSet.delete(childId); - setSelected(new Map(selected.set(parentId, new Set(parentSet)))); - } : undefined} + onToggleClick={hasPermissions ? onToggleClick : undefined} onViewRoomClick={(roomId, autoJoin) => { - showRoom(hierarchy, roomId, autoJoin); + showRoom(cli, hierarchy, roomId, autoJoin); }} /> ; @@ -659,13 +673,25 @@ const SpaceHierarchy = ({

    { query.trim() ? _t("Results") : _t("Rooms and spaces") }

    { additionalButtons } - { manageButtons } + { hasPermissions && ( + + ) }
    { error &&
    { error }
    } -
      +
        { results }
      { loader } @@ -674,7 +700,7 @@ const SpaceHierarchy = ({ return <> create a new room.": "If you can't find the room you're looking for, ask for an invite or create a new room.", - "Create room": "Create room", "Private space": "Private space", " invites you": " invites you", "To view %(spaceName)s, turn on the Spaces beta": "To view %(spaceName)s, turn on the Spaces beta", From 8ddaa7faf1eaa705f8b8549d56a4ce114bffa4ff Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 12 Aug 2021 12:08:57 +0100 Subject: [PATCH 086/619] i18n --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 5edcd93221..0a75cb9dce 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2843,12 +2843,12 @@ "You don't have permission": "You don't have permission", "This room is suggested as a good one to join": "This room is suggested as a good one to join", "Suggested": "Suggested", - "Your server does not support showing space hierarchies.": "Your server does not support showing space hierarchies.", "Select a room below first": "Select a room below first", "Failed to remove some rooms. Try again later": "Failed to remove some rooms. Try again later", "Removing...": "Removing...", "Mark as not suggested": "Mark as not suggested", "Mark as suggested": "Mark as suggested", + "Your server does not support showing space hierarchies.": "Your server does not support showing space hierarchies.", "No results found": "No results found", "You may want to try a different search or check for typos.": "You may want to try a different search or check for typos.", "Results": "Results", From c259e25f529df698352deacf268e6d7cb0b95432 Mon Sep 17 00:00:00 2001 From: jelv Date: Thu, 12 Aug 2021 12:05:11 +0000 Subject: [PATCH 087/619] Translated using Weblate (Dutch) Currently translated at 100.0% (3141 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 493 ++++++++++++++++++++------------------- 1 file changed, 255 insertions(+), 238 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 2de5479fc8..1a51383d50 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -21,8 +21,8 @@ "Autoplay GIFs and videos": "GIF’s en video’s automatisch afspelen", "%(senderName)s banned %(targetName)s.": "%(senderName)s heeft %(targetName)s verbannen.", "Ban": "Verbannen", - "Banned users": "Verbannen gebruikers", - "Bans user with given id": "Verbant de gebruiker met de gegeven ID", + "Banned users": "Verbannen personen", + "Bans user with given id": "Verbant de persoon met de gegeven ID", "Call Timeout": "Oproeptime-out", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Kan geen verbinding maken met de homeserver via HTTP wanneer er een HTTPS-URL in uw browserbalk staat. Gebruik HTTPS of schakel onveilige scripts in.", "Change Password": "Wachtwoord veranderen", @@ -83,14 +83,14 @@ "No display name": "Geen weergavenaam", "No more results": "Geen resultaten meer", "No results": "Geen resultaten", - "No users have specific privileges in this room": "Geen enkele gebruiker heeft specifieke bevoegdheden in dit gesprek", + "No users have specific privileges in this room": "Geen enkele persoon heeft specifieke bevoegdheden in deze kamer", "olm version:": "olm-versie:", "Password": "Wachtwoord", "Passwords can't be empty": "Wachtwoorden kunnen niet leeg zijn", "Permissions": "Rechten", "Phone": "Telefoonnummer", "Private Chat": "Privégesprek", - "Privileged Users": "Bevoegde gebruikers", + "Privileged Users": "Bevoegde personen", "Profile": "Profiel", "Public Chat": "Openbaar gesprek", "Reason": "Reden", @@ -140,7 +140,7 @@ "Email address": "E-mailadres", "Custom": "Aangepast", "Custom level": "Aangepast niveau", - "Deops user with given id": "Ontmachtigt gebruiker met de gegeven ID", + "Deops user with given id": "Ontmachtigt persoon met de gegeven ID", "Default": "Standaard", "Displays action": "Toont actie", "Emoji": "Emoji", @@ -151,13 +151,13 @@ "Existing Call": "Bestaande oproep", "Export": "Wegschrijven", "Export E2E room keys": "E2E-gesprekssleutels exporteren", - "Failed to ban user": "Verbannen van gebruiker is mislukt", + "Failed to ban user": "Verbannen van persoon is mislukt", "Failed to change power level": "Wijzigen van machtsniveau is mislukt", "Failed to fetch avatar URL": "Ophalen van avatar-URL is mislukt", "Failed to join room": "Toetreden tot gesprek is mislukt", "Failed to leave room": "Verlaten van gesprek is mislukt", "Failed to load timeline position": "Laden van tijdslijnpositie is mislukt", - "Failed to mute user": "Dempen van gebruiker is mislukt", + "Failed to mute user": "Dempen van persoon is mislukt", "Failed to reject invite": "Weigeren van uitnodiging is mislukt", "Failed to reject invitation": "Weigeren van uitnodiging is mislukt", "Failed to send email": "Versturen van e-mail is mislukt", @@ -185,7 +185,7 @@ "Incoming call from %(name)s": "Inkomende oproep van %(name)s", "Incoming video call from %(name)s": "Inkomende video-oproep van %(name)s", "Incoming voice call from %(name)s": "Inkomende spraakoproep van %(name)s", - "Incorrect username and/or password.": "Onjuiste gebruikersnaam en/of wachtwoord.", + "Incorrect username and/or password.": "Onjuiste inlognaam en/of wachtwoord.", "Incorrect verification code": "Onjuiste verificatiecode", "Invalid Email Address": "Ongeldig e-mailadres", "Invalid file%(extra)s": "Ongeldig bestand %(extra)s", @@ -230,7 +230,7 @@ "Room Colour": "Gesprekskleur", "%(roomName)s does not exist.": "%(roomName)s bestaat niet.", "%(roomName)s is not accessible at this time.": "%(roomName)s is op dit moment niet toegankelijk.", - "Rooms": "Gesprekken", + "Rooms": "Kamers", "Save": "Opslaan", "Search failed": "Zoeken mislukt", "Searches DuckDuckGo for results": "Zoekt op DuckDuckGo voor resultaten", @@ -288,7 +288,7 @@ "Usage": "Gebruik", "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (macht %(powerLevelNumber)s)", "Username invalid: %(errMessage)s": "Ongeldige gebruikersnaam: %(errMessage)s", - "Users": "Gebruikers", + "Users": "Personen", "Verification Pending": "Verificatie in afwachting", "Verified key": "Geverifieerde sleutel", "Video call": "Video-oproep", @@ -311,12 +311,12 @@ "You have enabled URL previews by default.": "U heeft URL-voorvertoningen standaard ingeschakeld.", "You have no visible notifications": "U heeft geen zichtbare meldingen", "You must register to use this functionality": "U dient u te registreren om deze functie te gebruiken", - "You need to be able to invite users to do that.": "Dit vereist de bevoegdheid gebruikers uit te nodigen.", + "You need to be able to invite users to do that.": "Dit vereist de bevoegdheid om personen uit te nodigen.", "You need to be logged in.": "Hiervoor dient u ingelogd te zijn.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Zo te zien is uw e-mailadres op deze homeserver niet aan een Matrix-ID gekoppeld.", "You seem to be in a call, are you sure you want to quit?": "Het ziet er naar uit dat u in gesprek bent, weet u zeker dat u wilt afsluiten?", "You seem to be uploading files, are you sure you want to quit?": "Het ziet er naar uit dat u bestanden aan het uploaden bent, weet u zeker dat u wilt afsluiten?", - "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "U zult deze veranderingen niet terug kunnen draaien, daar u de gebruiker tot uw eigen niveau promoveert.", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "U zult deze veranderingen niet terug kunnen draaien, omdat u de persoon tot uw eigen machtsniveau promoveert.", "This server does not support authentication with a phone number.": "Deze server biedt geen ondersteuning voor authenticatie met een telefoonnummer.", "An error occurred: %(error_string)s": "Er is een fout opgetreden: %(error_string)s", "There are no visible files in this room": "Er zijn geen zichtbare bestanden in dit gesprek", @@ -338,7 +338,7 @@ "Confirm passphrase": "Wachtwoord bevestigen", "Import room keys": "Gesprekssleutels inlezen", "File to import": "In te lezen bestand", - "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Hiermee kunt u de sleutels van uw ontvangen berichten in versleutelde gesprekken naar een lokaal bestand wegschrijven. Als u dat bestand dan in een andere Matrix-cliënt inleest kan die ook die berichten ontcijferen.", + "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Hiermee kunt u de sleutels van uw ontvangen berichten in versleutelde kamers naar een lokaal bestand wegschrijven. Als u dat bestand dan in een andere Matrix-cliënt inleest kan het ook die berichten ontcijferen.", "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Het opgeslagen bestand geeft toegang tot het lezen en schrijven van uw versleutelde berichten - ga er dus zorgvuldig mee om! Bescherm uzelf door hieronder een wachtwoord in te voeren, dat dan gebruikt zal worden om het bestand te versleutelen. Het is dan alleen mogelijk de gegevens te lezen met hetzelfde wachtwoord.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven versleutelingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het weggeschreven bestand is beveiligd met een wachtwoord. Voer dat wachtwoord hier in om het bestand te ontsleutelen.", @@ -386,7 +386,7 @@ "Do you want to set an email address?": "Wilt u een e-mailadres instellen?", "This will allow you to reset your password and receive notifications.": "Zo kunt u een nieuw wachtwoord instellen en meldingen ontvangen.", "Skip": "Overslaan", - "Define the power level of a user": "Bepaal het machtsniveau van een gebruiker", + "Define the power level of a user": "Bepaal het machtsniveau van een persoon", "Add a widget": "Widget toevoegen", "Allow": "Toestaan", "Cannot add any more widgets": "Er kunnen niet nog meer widgets toegevoegd worden", @@ -403,8 +403,8 @@ "You do not have permission to do that in this room.": "U heeft geen rechten om dat in deze kamer te doen.", "Example": "Voorbeeld", "Create": "Aanmaken", - "Featured Rooms:": "Prominente gesprekken:", - "Featured Users:": "Prominente gebruikers:", + "Featured Rooms:": "Uitgelichte kamers:", + "Featured Users:": "Uitgelichte personen:", "Automatically replace plain text Emoji": "Tekst automatisch vervangen door emoji", "Failed to upload image": "Uploaden van afbeelding is mislukt", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s-widget toegevoegd door %(senderName)s", @@ -413,7 +413,7 @@ "Copied!": "Gekopieerd!", "Failed to copy": "Kopiëren mislukt", "Unpin Message": "Bericht losmaken", - "Add rooms to this community": "Voeg gesprekken toe aan deze gemeenschap", + "Add rooms to this community": "Voeg kamers toe aan deze gemeenschap", "Call Failed": "Oproep mislukt", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "Let op: elke persoon die u toevoegt aan een gemeenschap zal publiek zichtbaar zijn voor iedereen die de gemeenschaps-ID kent", "Invite new community members": "Nodig nieuwe gemeenschapsleden uit", @@ -425,14 +425,14 @@ "Show these rooms to non-members on the community page and room list?": "Deze kamers tonen aan niet-leden op de gemeenschapspagina en openbare kamerlijst?", "Add rooms to the community": "Voeg kamers toe aan de gemeenschap", "Add to community": "Toevoegen aan gemeenschap", - "Failed to invite the following users to %(groupId)s:": "Uitnodigen van volgende gebruikers tot %(groupId)s is mislukt:", - "Failed to invite users to community": "Uitnodigen van gebruikers tot de gemeenschap is mislukt", - "Failed to invite users to %(groupId)s": "Uitnodigen van gebruikers tot %(groupId)s is mislukt", + "Failed to invite the following users to %(groupId)s:": "Uitnodigen van volgende personen tot %(groupId)s is mislukt:", + "Failed to invite users to community": "Uitnodigen van personen tot de gemeenschap is mislukt", + "Failed to invite users to %(groupId)s": "Uitnodigen van personen tot %(groupId)s is mislukt", "Failed to add the following rooms to %(groupId)s:": "Toevoegen van de volgende kamers aan %(groupId)s is mislukt:", "Restricted": "Beperkte toegang", - "Ignored user": "Genegeerde gebruiker", + "Ignored user": "Genegeerde persoon", "You are now ignoring %(userId)s": "U negeert nu %(userId)s", - "Unignored user": "Niet-genegeerde gebruiker", + "Unignored user": "Niet-genegeerde persoon", "You are no longer ignoring %(userId)s": "U negeert %(userId)s niet meer", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s heeft de vastgeprikte boodschappen voor de kamer gewijzigd.", "Send": "Versturen", @@ -444,12 +444,12 @@ "%(senderName)s sent an image": "%(senderName)s heeft een afbeelding gestuurd", "%(senderName)s sent a video": "%(senderName)s heeft een video gestuurd", "%(senderName)s uploaded a file": "%(senderName)s heeft een bestand geüpload", - "Disinvite this user?": "Uitnodiging van deze gebruiker intrekken?", - "Kick this user?": "Deze gebruiker uit het gesprek zetten?", - "Unban this user?": "Deze gebruiker ontbannen?", - "Ban this user?": "Deze gebruiker verbannen?", + "Disinvite this user?": "Uitnodiging van deze persoon intrekken?", + "Kick this user?": "Deze persoon verwijderen?", + "Unban this user?": "Deze persoon ontbannen?", + "Ban this user?": "Deze persoon verbannen?", "Mirror local video feed": "Lokale videoaanvoer ook elders opslaan (spiegelen)", - "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Zelfdegradatie is onomkeerbaar. Als u de laatste bevoorrechte gebruiker in het gesprek bent zullen deze rechten voorgoed verloren gaan.", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Zelfdegradatie is onomkeerbaar. Als u de laatste gemachtigde persoon in de kamer bent zullen deze rechten voorgoed verloren gaan.", "Unignore": "Niet meer negeren", "Ignore": "Negeren", "Jump to read receipt": "Naar het laatst gelezen bericht gaan", @@ -471,7 +471,7 @@ "Unknown for %(duration)s": "Onbekend voor %(duration)s", "Unknown": "Onbekend", "Replying": "Aan het beantwoorden", - "No rooms to show": "Geen weer te geven gesprekken", + "No rooms to show": "Geen kamers om weer te geven", "Unnamed room": "Naamloos gesprek", "World readable": "Leesbaar voor iedereen", "Guests can join": "Gasten kunnen toetreden", @@ -491,10 +491,10 @@ "An email has been sent to %(emailAddress)s": "Er is een e-mail naar %(emailAddress)s verstuurd", "A text message has been sent to %(msisdn)s": "Er is een sms naar %(msisdn)s verstuurd", "Remove from community": "Verwijderen uit gemeenschap", - "Disinvite this user from community?": "Uitnodiging voor deze gebruiker tot de gemeenschap intrekken?", - "Remove this user from community?": "Deze gebruiker uit de gemeenschap verwijderen?", + "Disinvite this user from community?": "Uitnodiging voor deze persoon tot de gemeenschap intrekken?", + "Remove this user from community?": "Deze persoon uit de gemeenschap verwijderen?", "Failed to withdraw invitation": "Intrekken van uitnodiging is mislukt", - "Failed to remove user from community": "Verwijderen van gebruiker uit gemeenschap is mislukt", + "Failed to remove user from community": "Verwijderen van persoon uit gemeenschap is mislukt", "Filter community members": "Gemeenschapsleden filteren", "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Weet u zeker dat u ‘%(roomName)s’ uit %(groupId)s wilt verwijderen?", "Removing a room from the community will also remove it from the community page.": "Het gesprek uit de gemeenschap verwijderen zal dit ook van de gemeenschapspagina verwijderen.", @@ -504,9 +504,9 @@ "Visibility in Room List": "Zichtbaarheid in gesprekslijst", "Visible to everyone": "Zichtbaar voor iedereen", "Only visible to community members": "Alleen zichtbaar voor gemeenschapsleden", - "Filter community rooms": "Gemeenschapsgesprekken filteren", + "Filter community rooms": "Gemeenschapskamers filteren", "Something went wrong when trying to get your communities.": "Er ging iets mis bij het ophalen van uw gemeenschappen.", - "Display your community flair in rooms configured to show it.": "Toon uw gemeenschapsbadge in gesprekken die daarvoor ingesteld zijn.", + "Display your community flair in rooms configured to show it.": "Toon uw gemeenschapsbadge in kamers die daarvoor ingesteld zijn.", "You're not currently a member of any communities.": "U bent momenteel geen lid van een gemeenschap.", "Minimize apps": "Apps minimaliseren", "Communities": "Gemeenschappen", @@ -552,7 +552,7 @@ "was kicked %(count)s times|one": "is uit het gesprek gezet", "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s hebben hun naam %(count)s keer gewijzigd", "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s hebben hun naam gewijzigd", - "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s is %(count)s maal van naam veranderd", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s is %(count)s keer van naam veranderd", "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s is van naam veranderd", "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s hebben hun afbeelding %(count)s keer gewijzigd", "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s hebben hun afbeelding gewijzigd", @@ -577,19 +577,19 @@ "Community ID": "Gemeenschaps-ID", "example": "voorbeeld", "

      HTML for your community's page

      \n

      \n Use the long description to introduce new members to the community, or distribute\n some important links\n

      \n

      \n You can even use 'img' tags\n

      \n": "

      HTML voor uw gemeenschapspagina

      \n

      \n Gebruik de lange beschrijving om nieuwe leden in de gemeenschap te introduceren of om belangrijke koppelingen aan te bieden.\n

      \n

      \n U kunt zelfs ‘img’-tags gebruiken.\n

      \n", - "Add rooms to the community summary": "Voeg gesprekken aan het gemeenschapsoverzicht toe", - "Which rooms would you like to add to this summary?": "Welke gesprekken zou u aan dit overzicht willen toevoegen?", + "Add rooms to the community summary": "Voeg kamers aan het gemeenschapsoverzicht toe", + "Which rooms would you like to add to this summary?": "Welke kamers zou u aan dit overzicht willen toevoegen?", "Add to summary": "Toevoegen aan overzicht", - "Failed to add the following rooms to the summary of %(groupId)s:": "Kon de volgende gesprekken niet aan het overzicht van %(groupId)s toevoegen:", + "Failed to add the following rooms to the summary of %(groupId)s:": "Kon de volgende kamers niet aan het overzicht van %(groupId)s toevoegen:", "Add a Room": "Voeg een gesprek toe", "Failed to remove the room from the summary of %(groupId)s": "Kon het gesprek niet uit het overzicht van %(groupId)s verwijderen", "The room '%(roomName)s' could not be removed from the summary.": "Het gesprek ‘%(roomName)s’ kan niet uit het overzicht verwijderd worden.", - "Add users to the community summary": "Voeg gebruikers aan het gemeenschapsoverzicht toe", + "Add users to the community summary": "Voeg personen aan het gemeenschapsoverzicht toe", "Who would you like to add to this summary?": "Wie zou u aan het overzicht willen toevoegen?", - "Failed to add the following users to the summary of %(groupId)s:": "Kon de volgende gebruikers niet aan het overzicht van %(groupId)s toevoegen:", - "Add a User": "Voeg een gebruiker toe", - "Failed to remove a user from the summary of %(groupId)s": "Verwijderen van gebruiker uit het overzicht van %(groupId)s is mislukt", - "The user '%(displayName)s' could not be removed from the summary.": "De gebruiker ‘%(displayName)s’ kon niet uit het overzicht verwijderd worden.", + "Failed to add the following users to the summary of %(groupId)s:": "Kon de volgende personen niet aan het overzicht van %(groupId)s toevoegen:", + "Add a User": "Voeg een persoon toe", + "Failed to remove a user from the summary of %(groupId)s": "Verwijderen van persoon uit het overzicht van %(groupId)s is mislukt", + "The user '%(displayName)s' could not be removed from the summary.": "De persoon ‘%(displayName)s’ kon niet uit het overzicht verwijderd worden.", "Failed to update community": "Bijwerken van gemeenschap is mislukt", "Unable to accept invite": "Kan de uitnodiging niet aannemen", "Unable to reject invite": "Kan de uitnodiging niet weigeren", @@ -597,7 +597,7 @@ "Leave %(groupName)s?": "%(groupName)s verlaten?", "Leave": "Verlaten", "Community Settings": "Gemeenschapsinstellingen", - "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Op de gemeenschapspagina worden deze gesprekken getoond aan gemeenschapsleden, die er dan aan kunnen deelnemen door erop te klikken.", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Op de gemeenschapspagina worden deze kamers getoond aan gemeenschapsleden, die er dan aan kunnen deelnemen door erop te klikken.", "%(inviter)s has invited you to join this community": "%(inviter)s heeft u uitgenodigd in deze gemeenschap", "You are an administrator of this community": "U bent een beheerder van deze gemeenschap", "You are a member of this community": "U bent lid van deze gemeenschap", @@ -611,7 +611,7 @@ "Your Communities": "Uw gemeenschappen", "Error whilst fetching joined communities": "Er is een fout opgetreden bij het ophalen van de gemeenschappen waarvan u lid bent", "Create a new community": "Maak een nieuwe gemeenschap aan", - "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Maak een gemeenschap aan om gebruikers en gesprekken bijeen te brengen! Schep met een startpagina op maat uw eigen plaats in het Matrix-universum.", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Maak een gemeenschap aan om personen en kamers bijeen te brengen! Schep met een startpagina op maat uw eigen plaats in het Matrix-universum.", "%(count)s of your messages have not been sent.|one": "Uw bericht is niet verstuurd.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": "Alles nu opnieuw versturen of annuleren. U kunt ook individuele berichten selecteren om opnieuw te versturen of te annuleren.", "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": "Bericht opnieuw versturen of bericht annuleren.", @@ -622,8 +622,8 @@ "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "Er is een e-mail naar %(emailAddress)s verstuurd. Klik hieronder van zodra u de koppeling erin hebt gevolgd.", "Please note you are logging into the %(hs)s server, not matrix.org.": "Let op dat u inlogt bij de %(hs)s-server, niet matrix.org.", "This homeserver doesn't offer any login flows which are supported by this client.": "Deze homeserver heeft geen loginmethodes die door deze cliënt worden ondersteund.", - "Ignores a user, hiding their messages from you": "Negeert een gebruiker, waardoor de berichten ervan onzichtbaar voor u worden", - "Stops ignoring a user, showing their messages going forward": "Stopt het negeren van een gebruiker, hierdoor worden de berichten van de gebruiker weer zichtbaar", + "Ignores a user, hiding their messages from you": "Negeert een persoon, waardoor de berichten ervan onzichtbaar voor u worden", + "Stops ignoring a user, showing their messages going forward": "Stopt het negeren van een persoon, hierdoor worden de berichten van de persoon weer zichtbaar", "Notify the whole room": "Laat dit aan het hele groepsgesprek weten", "Room Notification": "Groepsgespreksmelding", "The information being sent to us to help make %(brand)s better includes:": "De informatie die naar ons wordt verstuurd om %(brand)s te verbeteren bevat:", @@ -653,12 +653,12 @@ "Code": "Code", "Unable to join community": "Kan niet toetreden tot de gemeenschap", "Unable to leave community": "Kan de gemeenschap niet verlaten", - "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Veranderingen aan uw gemeenschapsnaam en -afbeelding zullen mogelijk niet gezien worden door anderen tot maximaal 30 minuten.", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Veranderingen aan uw gemeenschapsnaam en -afbeelding zullen mogelijk nog niet gezien worden door anderen voor 30 minuten.", "Join this community": "Toetreden tot deze gemeenschap", "Who can join this community?": "Wie kan er tot deze gemeenschap toetreden?", "Everyone": "Iedereen", "Leave this community": "Deze gemeenschap verlaten", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Voor het oplossen van, via GitHub, gemelde bugs helpen foutenlogboeken ons enorm. Deze bevatten wel uw gebruiksgegevens, maar geen berichten. Het bevat onder meer uw gebruikersnaam, de ID’s of bijnamen van de gesprekken en groepen die u heeft bezocht en de namen van andere gebruikers.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Voor het oplossen van, via GitHub, gemelde bugs helpen foutenlogboeken ons enorm. Deze bevatten wel uw accountgegevens, maar geen berichten. Het bevat onder meer uw inlognaam, de ID’s of bijnamen van de kamers en groepen die u heeft bezocht en de namen van andere personen.", "Submit debug logs": "Foutenlogboek versturen", "Opens the Developer Tools dialog": "Opent het dialoogvenster met ontwikkelaarsgereedschap", "Fetching third party location failed": "Het ophalen van de locatie van de derde partij is mislukt", @@ -686,7 +686,7 @@ "Resend": "Opnieuw versturen", "Error saving email notification preferences": "Fout bij het opslaan van de meldingsvoorkeuren voor e-mail", "Messages containing my display name": "Berichten die mijn weergavenaam bevatten", - "Messages in one-to-one chats": "Berichten in één-op-één gesprekken", + "Messages in one-to-one chats": "Berichten in één-op-één chats", "Unavailable": "Niet beschikbaar", "View Decrypted Source": "Ontsleutelde bron bekijken", "Failed to update keywords": "Updaten van trefwoorden is mislukt", @@ -744,7 +744,7 @@ "Notify for all other messages/rooms": "Stuur een melding voor alle andere berichten/gesprekken", "Unable to look up room ID from server": "Kon de gesprek-ID niet van de server ophalen", "Couldn't find a matching Matrix room": "Kon geen bijbehorend Matrix-gesprek vinden", - "All Rooms": "Alle gesprekken", + "All Rooms": "Alle kamers", "You cannot delete this message. (%(code)s)": "U kunt dit bericht niet verwijderen. (%(code)s)", "Thursday": "Donderdag", "Forward Message": "Bericht doorsturen", @@ -779,7 +779,7 @@ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "Met uw huidige browser kan de toepassing er volledig onjuist uitzien. Tevens is het mogelijk dat niet alle functies naar behoren werken. U kunt doorgaan als u het toch wilt proberen, maar bij problemen bent u volledig op uzelf aangewezen!", "Checking for an update...": "Bezig met controleren op updates…", "Logs sent": "Logs verstuurd", - "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Foutenlogboeken bevatten gebruiksgegevens van de app inclusief uw gebruikersnaam, de ID’s of bijnamen van de gesprekken die u heeft bezocht, en de gebruikersnamen van andere gebruikers. Ze bevatten geen berichten.", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Foutenlogboeken bevatten persoonsgegevens van de app inclusief uw inlognaam, de ID’s of bijnamen van de kamers die u heeft bezocht, en de inlognamen van andere personen. Ze bevatten geen berichten.", "Failed to send logs: ": "Versturen van logs mislukt: ", "Preparing to send logs": "Logs voorbereiden voor versturen", "e.g. %(exampleValue)s": "bv. %(exampleValue)s", @@ -790,12 +790,12 @@ "Always show encryption icons": "Versleutelingspictogrammen altijd tonen", "Send analytics data": "Gebruiksgegevens delen", "Enable widget screenshots on supported widgets": "Widget-schermafbeeldingen inschakelen op ondersteunde widgets", - "Muted Users": "Gedempte gebruikers", + "Muted Users": "Gedempte personen", "Popout widget": "Widget in nieuw venster openen", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Kan de gebeurtenis waarop gereageerd was niet laden. Wellicht bestaat die niet, of u heeft geen toestemming die te bekijken.", - "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Dit zal uw account voorgoed onbruikbaar maken. U zult niet meer kunnen inloggen, en niemand anders zal zich met dezelfde gebruikers-ID kunnen registreren. Hierdoor zal uw account alle gesprekken waaraan u deelneemt verlaten, en worden de accountgegevens verwijderd van de identiteitsserver. Deze stap is onomkeerbaar.", + "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Dit zal uw account voorgoed onbruikbaar maken. U zult niet meer kunnen inloggen, en niemand anders zal zich met dezelfde persoon-ID kunnen registreren. Hierdoor zal uw account alle kamers waar u aan deelneemt verlaten, en worden de accountgegevens verwijderd van de identiteitsserver. Deze stap is onomkeerbaar.", "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Het sluiten van uw account maakt standaard niet dat wij de door u verstuurde berichten vergeten. Als u wilt dat wij uw berichten vergeten, vink dan het vakje hieronder aan.", - "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "De zichtbaarheid van berichten in Matrix is zoals bij e-mails. Het vergeten van uw berichten betekent dat berichten die u heeft verstuurd niet meer gedeeld worden met nieuwe of ongeregistreerde gebruikers, maar geregistreerde gebruikers die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie ervan.", + "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "De zichtbaarheid van berichten in Matrix is vergelijkbaar met e-mail. Het vergeten van uw berichten betekent dat berichten die u heeft verstuurd niet meer gedeeld worden met nieuwe of ongeregistreerde personen, maar geregistreerde personen die al toegang hebben tot deze berichten zullen alsnog toegang hebben tot hun eigen kopie ervan.", "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Vergeet bij het sluiten van mijn account alle door mij verstuurde berichten (Let op: hierdoor zullen personen een onvolledig beeld krijgen van gesprekken)", "To continue, please enter your password:": "Voer uw wachtwoord in om verder te gaan:", "Clear Storage and Sign Out": "Opslag wissen en uitloggen", @@ -817,10 +817,10 @@ "This event could not be displayed": "Deze gebeurtenis kon niet weergegeven worden", "Demote yourself?": "Uzelf degraderen?", "Demote": "Degraderen", - "Share Link to User": "Koppeling naar gebruiker delen", + "Share Link to User": "Koppeling naar persoon delen", "Share room": "Gesprek delen", "System Alerts": "Systeemmeldingen", - "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In versleutelde gesprekken zoals deze zijn URL-voorvertoningen standaard uitgeschakeld, om te voorkomen dat uw homeserver (waar de voorvertoningen worden gemaakt) informatie kan verzamelen over de koppelingen die u hier ziet.", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In versleutelde kamers zoals deze zijn URL-voorvertoningen standaard uitgeschakeld, om te voorkomen dat uw homeserver (waar de voorvertoningen worden gemaakt) informatie kan verzamelen over de koppelingen die u hier ziet.", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Als iemand een URL in een bericht invoegt, kan er een URL-voorvertoning weergegeven worden met meer informatie over de koppeling, zoals de titel, omschrijving en een afbeelding van de website.", "The email field must not be blank.": "Het e-mailveld mag niet leeg zijn.", "The phone number field must not be blank.": "Het telefoonnummerveld mag niet leeg zijn.", @@ -829,7 +829,7 @@ "An error ocurred whilst trying to remove the widget from the room": "Er trad een fout op bij de verwijderpoging van de widget uit dit gesprek", "Share Room": "Gesprek delen", "Link to most recent message": "Koppeling naar meest recente bericht", - "Share User": "Gebruiker delen", + "Share User": "Persoon delen", "Share Community": "Gemeenschap delen", "Share Room Message": "Bericht uit gesprek delen", "Link to selected message": "Koppeling naar geselecteerd bericht", @@ -838,14 +838,14 @@ "You can't send any messages until you review and agree to our terms and conditions.": "U kunt geen berichten sturen totdat u onze algemene voorwaarden heeft gelezen en aanvaard.", "No Audio Outputs detected": "Geen geluidsuitgangen gedetecteerd", "Audio Output": "Geluidsuitgang", - "Ignored users": "Genegeerde gebruikers", + "Ignored users": "Genegeerde personen", "Bulk options": "Bulkopties", - "This homeserver has hit its Monthly Active User limit.": "Deze homeserver heeft zijn limiet voor maandelijks actieve gebruikers bereikt.", + "This homeserver has hit its Monthly Active User limit.": "Deze homeserver heeft zijn limiet voor maandelijks actieve personen bereikt.", "This homeserver has exceeded one of its resource limits.": "Deze homeserver heeft één van zijn systeembronlimieten overschreden.", - "Whether or not you're logged in (we don't record your username)": "Of u al dan niet ingelogd bent (we slaan je gebruikersnaam niet op)", + "Whether or not you're logged in (we don't record your username)": "Of u al dan niet ingelogd bent (we slaan uw inlognaam niet op)", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Het bestand ‘%(fileName)s’ is groter dan de uploadlimiet van de homeserver", "Unable to load! Check your network connectivity and try again.": "Laden mislukt! Controleer je netwerktoegang en probeer het nogmaals.", - "Failed to invite users to the room:": "Kon de volgende gebruikers hier niet uitnodigen:", + "Failed to invite users to the room:": "Kon de volgende personen hier niet uitnodigen:", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Plakt ¯\\_(ツ)_/¯ vóór een bericht zonder opmaak", "Upgrades a room to a new version": "Upgrade deze kamer naar een nieuwere versie", "Changes your display nickname in the current room only": "Stelt uw weergavenaam alleen in de huidige kamer in", @@ -872,10 +872,10 @@ "Unable to connect to Homeserver. Retrying...": "Kon geen verbinding met de homeserver maken. Nieuwe poging…", "Unrecognised address": "Adres niet herkend", "You do not have permission to invite people to this room.": "U bent niet bevoegd anderen tot dit gesprek uit te nodigen.", - "User %(userId)s is already in the room": "De gebruiker %(userId)s is al aanwezig", - "User %(user_id)s does not exist": "Er bestaat geen gebruiker %(user_id)s", - "User %(user_id)s may or may not exist": "Er bestaat mogelijk geen gebruiker %(user_id)s", - "The user must be unbanned before they can be invited.": "De gebruiker kan niet uitgenodigd worden voordat diens ban teniet is gedaan.", + "User %(userId)s is already in the room": "De persoon %(userId)s is al aanwezig", + "User %(user_id)s does not exist": "Er bestaat geen persoon %(user_id)s", + "User %(user_id)s may or may not exist": "Er bestaat mogelijk geen persoon %(user_id)s", + "The user must be unbanned before they can be invited.": "De persoon kan niet uitgenodigd worden totdat zijn ban is verwijderd.", "Unknown server error": "Onbekende serverfout", "Use a few words, avoid common phrases": "Gebruik enkele woorden - maar geen bekende uitdrukkingen", "No need for symbols, digits, or uppercase letters": "Hoofdletters, cijfers of speciale tekens hoeven niet, mogen wel", @@ -907,34 +907,34 @@ "There was an error joining the room": "Er is een fout opgetreden bij het betreden van het gesprek", "Sorry, your homeserver is too old to participate in this room.": "Helaas - uw homeserver is te oud voor dit gesprek.", "Please contact your homeserver administrator.": "Gelieve contact op te nemen met de beheerder van uw homeserver.", - "Custom user status messages": "Aangepaste gebruikersstatusberichten", - "Group & filter rooms by custom tags (refresh to apply changes)": "Gesprekken groeperen en filteren volgens eigen labels (herlaad om de verandering te zien)", + "Custom user status messages": "Aangepaste statusberichten", + "Group & filter rooms by custom tags (refresh to apply changes)": "Kamers groeperen en filteren volgens eigen labels (herlaad om de verandering te zien)", "Render simple counters in room header": "Eenvoudige tellers bovenaan het gesprek tonen", "Enable Emoji suggestions while typing": "Emoticons voorstellen tijdens het typen", "Show a placeholder for removed messages": "Verwijderde berichten vulling tonen", "Show join/leave messages (invites/kicks/bans unaffected)": "Berichten over toe- en uittredingen tonen (dit heeft geen effect op uitnodigingen, berispingen of verbanningen)", "Show avatar changes": "Veranderingen van afbeelding tonen", "Show display name changes": "Veranderingen van weergavenamen tonen", - "Show read receipts sent by other users": "Door andere gebruikers verstuurde leesbevestigingen tonen", + "Show read receipts sent by other users": "Door andere personen verstuurde leesbevestigingen tonen", "Show a reminder to enable Secure Message Recovery in encrypted rooms": "Herinnering tonen om veilig berichtherstel in te schakelen in versleutelde gesprekken", "Show avatars in user and room mentions": "Vermelde personen- of kamerafbeelding tonen", - "Enable big emoji in chat": "Grote emoji in gesprekken inschakelen", + "Enable big emoji in chat": "Grote emoji in kamers inschakelen", "Send typing notifications": "Typmeldingen versturen", "Enable Community Filter Panel": "Gemeenschapsfilterpaneel inschakelen", "Allow Peer-to-Peer for 1:1 calls": "Peer-to-peer voor één-op-één oproepen toestaan", "Prompt before sending invites to potentially invalid matrix IDs": "Uitnodigingen naar mogelijk ongeldige Matrix-ID’s bevestigen", "Show developer tools": "Ontwikkelgereedschap tonen", - "Messages containing my username": "Berichten die mijn gebruikersnaam bevatten", + "Messages containing my username": "Berichten die mijn inlognaam bevatten", "Messages containing @room": "Berichten die ‘@room’ bevatten", - "Encrypted messages in one-to-one chats": "Versleutelde berichten in één-op-één gesprekken", + "Encrypted messages in one-to-one chats": "Versleutelde berichten in één-op-één chats", "Encrypted messages in group chats": "Versleutelde berichten in groepsgesprekken", "The other party cancelled the verification.": "De tegenpartij heeft de verificatie geannuleerd.", "Verified!": "Geverifieerd!", - "You've successfully verified this user.": "U heeft deze gebruiker geverifieerd.", - "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Beveiligde berichten met deze gebruiker zijn eind-tot-eind-versleuteld en kunnen niet door derden worden gelezen.", + "You've successfully verified this user.": "U heeft deze persoon geverifieerd.", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Beveiligde berichten met deze persoon zijn eind-tot-eind-versleuteld en kunnen niet door derden worden gelezen.", "Got It": "Ik snap het", - "Verify this user by confirming the following emoji appear on their screen.": "Verifieer deze gebruiker door te bevestigen dat hun scherm de volgende emoji toont.", - "Verify this user by confirming the following number appears on their screen.": "Verifieer deze gebruiker door te bevestigen dat hun scherm het volgende getal toont.", + "Verify this user by confirming the following emoji appear on their screen.": "Verifieer deze persoon door te bevestigen dat hun scherm de volgende emoji toont.", + "Verify this user by confirming the following number appears on their screen.": "Verifieer deze persoon door te bevestigen dat hun scherm het volgende getal toont.", "Unable to find a supported verification method.": "Kan geen ondersteunde verificatiemethode vinden.", "Dog": "Hond", "Cat": "Kat", @@ -1066,17 +1066,17 @@ "Modify widgets": "Widgets aanpassen", "Default role": "Standaardrol", "Send messages": "Berichten versturen", - "Invite users": "Gebruikers uitnodigen", + "Invite users": "Personen uitnodigen", "Change settings": "Instellingen wijzigen", - "Kick users": "Gebruikers uit het gesprek verwijderen", - "Ban users": "Gebruikers verbannen", + "Kick users": "Personen verwijderen", + "Ban users": "Personen verbannen", "Remove messages": "Berichten verwijderen", "Notify everyone": "Iedereen melden", "Send %(eventType)s events": "%(eventType)s-gebeurtenissen versturen", "Roles & Permissions": "Rollen & rechten", "Select the roles required to change various parts of the room": "Selecteer de vereiste rollen om verschillende delen van het gesprek te wijzigen", "Enable encryption?": "Versleuteling inschakelen?", - "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Gespreksversleuteling is onomkeerbaar. Berichten in versleutelde gesprekken zijn niet leesbaar voor de server; enkel voor de gespreksdeelnemers. Veel robots en overbruggingen werken niet correct in versleutelde gesprekken. Lees meer over versleuteling.", + "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Kamerversleuteling is onomkeerbaar. Berichten in versleutelde kamers zijn niet leesbaar voor de server; enkel voor de deelnemers. Veel robots en bruggen werken niet correct in versleutelde kamers. Lees meer over versleuteling.", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Wijzigingen aan wie de geschiedenis kan lezen gelden enkel voor toekomstige berichten in dit gesprek. De zichtbaarheid van de bestaande geschiedenis blijft ongewijzigd.", "Encryption": "Versleuteling", "Once enabled, encryption cannot be disabled.": "Eenmaal ingeschakeld kan versleuteling niet meer worden uitgeschakeld.", @@ -1104,7 +1104,7 @@ "Join": "Deelnemen", "Power level": "Machtsniveau", "That doesn't look like a valid email address": "Dit is geen geldig e-mailadres", - "The following users may not exist": "Volgende gebruikers bestaan mogelijk niet", + "The following users may not exist": "Volgende personen bestaan mogelijk niet", "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Kan geen profielen voor de Matrix-ID’s hieronder vinden - wilt u ze toch uitnodigen?", "Invite anyway and never warn me again": "Alsnog uitnodigen en mij nooit meer waarschuwen", "Invite anyway": "Alsnog uitnodigen", @@ -1113,14 +1113,14 @@ "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Om uw gespreksgeschiedenis niet te verliezen vóór het uitloggen dient u uw veiligheidssleutel te exporteren. Dat moet vanuit de nieuwere versie van %(brand)s", "Incompatible Database": "Incompatibele database", "Continue With Encryption Disabled": "Verdergaan met versleuteling uitgeschakeld", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifieer deze gebruiker om hem/haar als vertrouwd te markeren. Gebruikers vertrouwen geeft u extra gemoedsrust bij het gebruik van eind-tot-eind-versleutelde berichten.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verifieer deze persoon om als vertrouwd te markeren. Personen vertrouwen geeft u extra zekerheid bij het gebruik van eind-tot-eind-versleutelde berichten.", "Waiting for partner to confirm...": "Wachten op bevestiging van partner…", "Incoming Verification Request": "Inkomend verificatieverzoek", "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "U heeft voorheen %(brand)s op %(host)s gebruikt met lui laden van leden ingeschakeld. In deze versie is lui laden uitgeschakeld. De lokale cache is niet compatibel tussen deze twee instellingen, zodat %(brand)s uw account moet hersynchroniseren.", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Indien de andere versie van %(brand)s nog open staat in een ander tabblad kunt u dat beter sluiten, want het geeft problemen als %(brand)s op dezelfde host gelijktijdig met lui laden ingeschakeld en uitgeschakeld draait.", "Incompatible local cache": "Incompatibele lokale cache", "Clear cache and resync": "Cache wissen en hersynchroniseren", - "%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s verbruikt nu 3-5x minder geheugen, door informatie over andere gebruikers enkel te laden wanneer nodig. Even geduld, we hersynchroniseren met de server!", + "%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s verbruikt nu 3-5x minder geheugen, door informatie over andere personen enkel te laden wanneer nodig. Even geduld, we synchroniseren met de server!", "Updating %(brand)s": "%(brand)s wordt bijgewerkt", "I don't want my encrypted messages": "Ik wil mijn versleutelde berichten niet", "Manually export keys": "Sleutels handmatig wegschrijven", @@ -1131,13 +1131,13 @@ "Report bugs & give feedback": "Fouten melden & feedback geven", "Go back": "Terug", "Room Settings - %(roomName)s": "Gespreksinstellingen - %(roomName)s", - "Failed to upgrade room": "Gesprek upgraden mislukt", - "The room upgrade could not be completed": "Het upgraden van het gesprek kon niet voltooid worden", - "Upgrade this room to version %(version)s": "Upgrade dit gesprek tot versie %(version)s", + "Failed to upgrade room": "Kamerupgrade mislukt", + "The room upgrade could not be completed": "Het upgraden van de kamer kon niet worden voltooid", + "Upgrade this room to version %(version)s": "Upgrade de kamer naar versie %(version)s", "Upgrade Room Version": "Gespreksversie upgraden", "Create a new room with the same name, description and avatar": "Een nieuw kamer aanmaken met dezelfde naam, beschrijving en afbeelding", "Update any local room aliases to point to the new room": "Alle lokale gespreksbijnamen naar het nieuwe gesprek laten verwijzen", - "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Mensen verhinderen aan de oude versie van het gesprek bij te dragen en daar een bericht te plaatsen dat de gebruikers verwijst naar het nieuwe gesprek", + "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Personen verhinderen om aan de oude versie van de kamer bij te dragen en plaats een bericht te dat de personen verwijst naar de nieuwe kamer", "Put a link back to the old room at the start of the new room so people can see old messages": "Bovenaan het nieuwe gesprek naar het oude verwijzen, om oude berichten te lezen", "A username can only contain lower case letters, numbers and '=_-./'": "Een gebruikersnaam mag enkel kleine letters, cijfers en ‘=_-./’ bevatten", "Checking...": "Bezig met controleren…", @@ -1165,7 +1165,7 @@ "Enter the location of your Modular homeserver. It may use your own domain name or be a subdomain of modular.im.": "Voer de locatie van uw Modular-thuisserver in. Deze kan uw eigen domeinnaam gebruiken, of een subdomein van modular.im zijn.", "Server Name": "Servernaam", "The username field must not be blank.": "Het gebruikersnaamveld mag niet leeg zijn.", - "Username": "Gebruikersnaam", + "Username": "Inlognaam", "Not sure of your password? Set a new one": "Onzeker over uw wachtwoord? Stel een nieuw in", "Sign in to your Matrix account on %(serverName)s": "Aanmelden met uw Matrix-account op %(serverName)s", "Change": "Wijzigen", @@ -1187,10 +1187,10 @@ "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "U bent een beheerder van deze gemeenschap. U zult niet opnieuw kunnen toetreden zonder een uitnodiging van een andere beheerder.", "Want more than a community? Get your own server": "Wilt u meer dan een gemeenschap? Verkrijg uw eigen server", "This homeserver does not support communities": "Deze homeserver biedt geen ondersteuning voor gemeenschappen", - "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Uw bericht is niet verstuurd omdat deze homeserver zijn limiet voor maandelijks actieve gebruikers heeft bereikt. Neem contact op met uw dienstbeheerder om de dienst te blijven gebruiken.", + "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Uw bericht is niet verstuurd omdat deze homeserver zijn limiet voor maandelijks actieve personen heeft bereikt. Neem contact op met uw beheerder om de dienst te blijven gebruiken.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Uw bericht is niet verstuurd omdat deze homeserver een systeembronlimiet heeft overschreden. Neem contact op met uw dienstbeheerder om de dienst te blijven gebruiken.", "Guest": "Gast", - "Could not load user profile": "Kon gebruikersprofiel niet laden", + "Could not load user profile": "Kon persoonsprofiel niet laden", "Your Matrix account on %(serverName)s": "Uw Matrix-account op %(serverName)s", "A verification email will be sent to your inbox to confirm setting your new password.": "Er is een verificatie-e-mail naar u gestuurd om het instellen van uw nieuwe wachtwoord te bevestigen.", "Sign in instead": "In plaats daarvan inloggen", @@ -1233,7 +1233,7 @@ "Set up Secure Messages": "Beveiligde berichten instellen", "Recovery Method Removed": "Herstelmethode verwijderd", "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Als u de herstelmethode niet heeft verwijderd, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw wachtwoord en stel bij instellingen een nieuwe herstelmethode in.", - "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Let op: gesprekken bijwerken voegt gespreksleden niet automatisch toe aan de nieuwe versie van het gesprek. Er komt in het oude gesprek een koppeling naar het nieuwe, waarop gespreksleden moeten klikken om aan het nieuwe gesprek deel te nemen.", + "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Let op: kamers bijwerken voegt leden niet automatisch toe aan de nieuwe versie van de kamer. Er komt in de oude kamer een koppeling naar de nieuwe, waarop leden moeten klikken om aan de nieuwe kamer deel te nemen.", "Adds a custom widget by URL to the room": "Voegt met een URL een aangepaste widget toe aan de kamer", "Please supply a https:// or http:// widget URL": "Voer een https://- of http://-widget-URL in", "You cannot modify widgets in this room.": "U kunt de widgets in deze kamer niet aanpassen.", @@ -1251,7 +1251,7 @@ "Remember my selection for this widget": "Onthoud mijn keuze voor deze widget", "Deny": "Weigeren", "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s kon de protocollijst niet ophalen van de homeserver. Mogelijk is de homeserver te oud om derde-partij-netwerken te ondersteunen.", - "%(brand)s failed to get the public room list.": "%(brand)s kon de lijst met openbare gesprekken niet verkrijgen.", + "%(brand)s failed to get the public room list.": "%(brand)s kon de lijst met publieke kamers niet verkrijgen.", "The homeserver may be unavailable or overloaded.": "De homeserver is mogelijk onbereikbaar of overbelast.", "You have %(count)s unread notifications in a prior version of this room.|other": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.", "You have %(count)s unread notifications in a prior version of this room.|one": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.", @@ -1263,7 +1263,7 @@ "Rotate clockwise": "Met de klok mee draaien", "GitHub issue": "GitHub-melding", "Notes": "Opmerkingen", - "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Gelieve alle verdere informatie die zou kunnen helpen het probleem te analyseren (wat u aan het doen was, relevante gespreks-ID’s, gebruikers-ID’s, enz.) bij te voegen.", + "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "Alle verdere informatie die zou kunnen helpen het probleem te analyseren graag toevoegen (wat u aan het doen was, relevante kamer-ID’s, persoon-ID’s, etc.).", "Sign out and remove encryption keys?": "Uitloggen en versleutelingssleutels verwijderen?", "To help us prevent this in future, please send us logs.": "Stuur ons uw logs om dit in de toekomst te helpen voorkomen.", "Missing session data": "Sessiegegevens ontbreken", @@ -1282,14 +1282,14 @@ "The server does not support the room version specified.": "De server ondersteunt deze versie van kamers niet.", "Name or Matrix ID": "Naam of Matrix-ID", "Changes your avatar in this current room only": "Verandert uw afbeelding alleen in de huidige kamer", - "Unbans user with given ID": "Ontbant de gebruiker met de gegeven ID", + "Unbans user with given ID": "Ontbant de persoon met de gegeven ID", "Sends the given message coloured as a rainbow": "Verstuurt het gegeven bericht in regenboogkleuren", "Sends the given emote coloured as a rainbow": "Verstuurt de gegeven emoticon in regenboogkleuren", "No homeserver URL provided": "Geen homeserver-URL opgegeven", "Unexpected error resolving homeserver configuration": "Onverwachte fout bij het controleren van de homeserverconfiguratie", - "The user's homeserver does not support the version of the room.": "De homeserver van de gebruiker biedt geen ondersteuning voor de gespreksversie.", + "The user's homeserver does not support the version of the room.": "De homeserver van de persoon biedt geen ondersteuning voor deze kamerversie.", "Show hidden events in timeline": "Verborgen gebeurtenissen op de tijdslijn weergeven", - "When rooms are upgraded": "Wanneer gesprekken geüpgraded worden", + "When rooms are upgraded": "Wanneer kamers geüpgraded worden", "this room": "dit gesprek", "View older messages in %(roomName)s.": "Bekijk oudere berichten in %(roomName)s.", "Joining room …": "Deelnemen aan gesprek…", @@ -1332,10 +1332,10 @@ "Password is allowed, but unsafe": "Wachtwoord is toegestaan, maar onveilig", "Nice, strong password!": "Dit is een sterk wachtwoord!", "Passwords don't match": "Wachtwoorden komen niet overeen", - "Other users can invite you to rooms using your contact details": "Andere gebruikers kunnen u in gesprekken uitnodigen op basis van uw contactgegevens", + "Other users can invite you to rooms using your contact details": "Andere personen kunnen u in kamers uitnodigen op basis van uw contactgegevens", "Enter phone number (required on this homeserver)": "Voer telefoonnummer in (vereist op deze homeserver)", "Doesn't look like a valid phone number": "Dit lijkt geen geldig telefoonnummer", - "Enter username": "Voer gebruikersnaam in", + "Enter username": "Voer inlognaam in", "Some characters not allowed": "Sommige tekens zijn niet toegestaan", "Create your Matrix account on ": "Maak uw Matrix-account op aan", "Add room": "Gesprek toevoegen", @@ -1472,7 +1472,7 @@ "Error changing power level requirement": "Fout bij wijzigen van machtsniveauvereiste", "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "Er is een fout opgetreden bij het wijzigen van de machtsniveauvereisten van het gesprek. Zorg ervoor dat u over voldoende machtigingen beschikt en probeer het opnieuw.", "Error changing power level": "Fout bij wijzigen van machtsniveau", - "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Er is een fout opgetreden bij het wijzigen van het machtsniveau van de gebruiker. Zorg ervoor dat u over voldoende machtigingen beschikt en probeer het opnieuw.", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "Er is een fout opgetreden bij het wijzigen van het machtsniveau van de persoon. Zorg ervoor dat u over voldoende machtigingen beschikt en probeer het opnieuw.", "Verify the link in your inbox": "Verifieer de koppeling in uw postvak", "Complete": "Voltooien", "No recent messages by %(user)s found": "Geen recente berichten door %(user)s gevonden", @@ -1481,9 +1481,9 @@ "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "U staat op het punt %(count)s berichten van %(user)s te verwijderen. Dit kan niet teruggedraaid worden. Wilt u doorgaan?", "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "Bij een groot aantal berichten kan dit even duren. Herlaad uw cliënt niet gedurende deze tijd.", "Remove %(count)s messages|other": "%(count)s berichten verwijderen", - "Deactivate user?": "Gebruiker deactiveren?", - "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Deze gebruiker deactiveren zal deze gebruiker uitloggen en verhinderen dat de gebruiker weer inlogt. Bovendien zal de gebruiker alle gesprekken waaraan de gebruiker deelneemt verlaten. Deze actie is niet terug te draaien. Weet u zeker dat u deze gebruiker wilt deactiveren?", - "Deactivate user": "Gebruiker deactiveren", + "Deactivate user?": "Persoon deactiveren?", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Deze persoon deactiveren zal deze persoon uitloggen en verhinderen dat de persoon weer inlogt. Bovendien zal de persoon alle kamers waaraan de persoon deelneemt verlaten. Deze actie is niet terug te draaien. Weet u zeker dat u deze persoon wilt deactiveren?", + "Deactivate user": "Persoon deactiveren", "Remove recent messages": "Recente berichten verwijderen", "Bold": "Vet", "Italics": "Cursief", @@ -1541,8 +1541,8 @@ "Community Autocomplete": "Gemeenschappen autoaanvullen", "Emoji Autocomplete": "Emoji autoaanvullen", "Notification Autocomplete": "Meldingen autoaanvullen", - "Room Autocomplete": "Gesprekken autoaanvullen", - "User Autocomplete": "Gebruikers autoaanvullen", + "Room Autocomplete": "Kamers autoaanvullen", + "User Autocomplete": "Personen autoaanvullen", "Add Email Address": "E-mailadres toevoegen", "Add Phone Number": "Telefoonnummer toevoegen", "Your email address hasn't been verified yet": "Uw e-mailadres is nog niet geverifieerd", @@ -1559,8 +1559,8 @@ "Custom (%(level)s)": "Aangepast (%(level)s)", "Error upgrading room": "Upgraden van gesprek mislukt", "Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen gespreksversie ondersteunt, en probeer het dan opnieuw.", - "Verifies a user, session, and pubkey tuple": "Verifieert een combinatie van gebruiker+sessie+publieke sleutel", - "Unknown (user, session) pair:": "Onbekende combinatie gebruiker+sessie:", + "Verifies a user, session, and pubkey tuple": "Verifieert de combinatie van persoon, sessie en publieke sleutel", + "Unknown (user, session) pair:": "Onbekende combinatie persoon en sessie:", "Session already verified!": "Sessie al geverifieerd!", "WARNING: Session already verified, but keys do NOT MATCH!": "PAS OP: de sessie is al geverifieerd, maar de sleutels komen NIET OVEREEN!", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "PAS OP: sleutelverificatie MISLUKT! De combinatie %(userId)s + sessie %(deviceId)s is ondertekend met ‘%(fprint)s’ - maar de opgegeven sleutel is ‘%(fingerprint)s’. Wellicht worden uw berichten onderschept!", @@ -1569,20 +1569,20 @@ "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s poogt u te bellen, maar uw browser ondersteunt dat niet", "%(senderName)s placed a video call.": "%(senderName)s doet een video-oproep.", "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s doet een video-oproep, maar uw browser ondersteunt dat niet", - "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s heeft de banregel voor gebruikers die met %(glob)s stroken verwijderd", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s heeft de banregel voor personen die met %(glob)s stroken verwijderd", "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s heeft de banregel voor kamers met %(glob)s verwijderd", "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s heeft de banregel voor servers die met %(glob)s stroken verwijderd", "%(senderName)s removed a ban rule matching %(glob)s": "%(senderName)s heeft een banregel die met %(glob)s strookt verwijderd", "%(senderName)s updated an invalid ban rule": "%(senderName)s heeft een ongeldige banregel bijgewerkt", - "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die gebruikers die met %(glob)s sporen verbant vanwege %(reason)s", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die personen die met %(glob)s sporen verbant vanwege %(reason)s", "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die kamers met %(glob)s verbant vanwege %(reason)s", "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s heeft de regel bijgewerkt die servers die met %(glob)s sporen verbant vanwege %(reason)s", "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s heeft een banregel vanwege %(reason)s die met %(glob)s spoort bijgewerkt", - "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat gebruikers die met %(glob)s sporen verbannen worden vanwege %(reason)s", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat personen die met %(glob)s sporen verbannen worden vanwege %(reason)s", "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat kamers met %(glob)s verbannen worden vanwege %(reason)s", "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat servers die met %(glob)s sporen verbannen worden vanwege %(reason)s", "%(senderName)s created a ban rule matching %(glob)s for %(reason)s": "%(senderName)s heeft geregeld dat alles wat met %(glob)s spoort verbannen wordt vanwege %(reason)s", - "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor gebruikers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor personen wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor kamers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel voor servers wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s heeft het patroon van een banregel wegens %(reason)s aangepast van %(oldGlob)s tot %(newGlob)s", @@ -1607,10 +1607,10 @@ "Match system theme": "Aanpassen aan systeemthema", "Never send encrypted messages to unverified sessions from this session": "Vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies versturen", "Never send encrypted messages to unverified sessions in this room from this session": "Vanaf deze sessie nooit versleutelde berichten naar ongeverifieerde sessies in dit gesprek versturen", - "Enable message search in encrypted rooms": "Zoeken in versleutelde gesprekken inschakelen", + "Enable message search in encrypted rooms": "Zoeken in versleutelde kamers inschakelen", "How fast should messages be downloaded.": "Ophaalfrequentie van berichten.", "My Ban List": "Mijn banlijst", - "This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!", + "This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/personen. Verlaat deze kamer niet!", "Waiting for %(displayName)s to verify…": "Wachten tot %(displayName)s geverifieerd heeft…", "They match": "Ze komen overeen", "They don't match": "Ze komen niet overeen", @@ -1638,7 +1638,7 @@ "Delete %(count)s sessions|one": "%(count)s sessie verwijderen", "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Of u %(brand)s op een apparaat gebruikt waarop een aanraakscherm de voornaamste invoermethode is", "Whether you're using %(brand)s as an installed Progressive Web App": "Of u %(brand)s gebruikt als een geïnstalleerde Progressieve Web-App", - "Your user agent": "Jouw gebruikersagent", + "Your user agent": "Uw persoonsagent", "If you cancel now, you won't complete verifying the other user.": "Als u nu annuleert zult u de andere gebruiker niet verifiëren.", "If you cancel now, you won't complete verifying your other session.": "Als u nu annuleert zult u uw andere sessie niet verifiëren.", "Cancel entering passphrase?": "Wachtwoord annuleren?", @@ -1658,10 +1658,10 @@ "not stored": "niet opgeslagen", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Uw wachtwoord is gewijzigd. U zult geen pushmeldingen op uw andere sessies meer ontvangen, totdat u zichzelf daar opnieuw inlogt", "Ignored/Blocked": "Genegeerd/geblokkeerd", - "Error adding ignored user/server": "Fout bij het toevoegen van een genegeerde gebruiker/server", + "Error adding ignored user/server": "Fout bij het toevoegen van een genegeerde persoon/server", "Something went wrong. Please try again or view your console for hints.": "Er is iets fout gegaan. Probeer het opnieuw of bekijk de console om voor meer informatie.", "Error subscribing to list": "Fout bij het abonneren op de lijst", - "Error removing ignored user/server": "Fout bij het verwijderen van genegeerde gebruiker/server", + "Error removing ignored user/server": "Fout bij het verwijderen van genegeerde persoon/server", "Error unsubscribing from list": "Fout bij het opzeggen van een abonnement op de lijst", "Please try again or view your console for hints.": "Probeer het opnieuw of bekijk de console voor meer informatie.", "None": "Geen", @@ -1671,15 +1671,15 @@ "Unsubscribe": "Abonnement opzeggen", "View rules": "Bekijk regels", "You are currently subscribed to:": "U heeft een abonnement op:", - "⚠ These settings are meant for advanced users.": "⚠ Deze instellingen zijn bedoeld voor gevorderde gebruikers.", - "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Het negeren van gebruikers gaat via banlijsten. Deze bevatten regels over wie verbannen moet worden. Het abonneren op een banlijst betekent dat u de gebruikers/servers die op de lijst staan niet meer zult zien.", + "⚠ These settings are meant for advanced users.": "⚠ Deze instellingen zijn bedoeld voor gevorderde personen.", + "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Het negeren van personen gaat via banlijsten. Deze bevatten regels over wie verbannen moet worden. Het abonneren op een banlijst betekent dat u de personen/servers die op de lijst staan niet meer zult zien.", "Personal ban list": "Persoonlijke banlijst", - "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Uw persoonlijke banlijst bevat alle gebruikers/server waar u geen berichten meer van wilt zien. Nadat u een gebruiker/server heeft genegeerd, zal er een nieuw gesprek worden aangemaakt met de naam ‘Mijn banlijst’. Om de lijst actief te houden dient u het gesprek niet te verlaten.", - "Server or user ID to ignore": "Server of gebruikers-ID om te negeren", + "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Uw persoonlijke banlijst bevat alle personen/servers waar u geen berichten meer van wilt zien. Nadat u een persoon/server heeft genegeerd, zal er een nieuw kamer worden aangemaakt met de naam ‘Mijn banlijst’. Om de lijst actief te houden dient u de kamer niet te verlaten.", + "Server or user ID to ignore": "Server of persoon-ID om te negeren", "eg: @bot:* or example.org": "bijvoorbeeld: @bot:* of voorbeeld.org", "Subscribed lists": "Abonnementen op lijsten", "Subscribing to a ban list will cause you to join it!": "Wanneer u zich abonneert op een banlijst zal u eraan worden toegevoegd!", - "If this isn't what you want, please use a different tool to ignore users.": "Als u dit niet wilt kunt u een andere methode gebruiken om gebruikers te negeren.", + "If this isn't what you want, please use a different tool to ignore users.": "Als u dit niet wilt kunt u een andere methode gebruiken om personen te negeren.", "Subscribe": "Abonneren", "Enable desktop notifications for this session": "Bureaubladmeldingen voor deze sessie inschakelen", "Enable audible notifications for this session": "Meldingen met geluid voor deze sessie inschakelen", @@ -1693,7 +1693,7 @@ "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integratiebeheerders ontvangen configuratie-informatie en kunnen widgets aanpassen, gespreksuitnodigingen versturen en machtsniveau’s namens u aanpassen.", "Ban list rules - %(roomName)s": "Banlijstregels - %(roomName)s", "Server rules": "Serverregels", - "User rules": "Gebruikersregels", + "User rules": "Persoonsregels", "Show tray icon and minimize window to it on close": "Geef een pictogram weer in de systeembalk en minimaliseer het venster wanneer het wordt gesloten", "Session ID:": "Sessie-ID:", "Session key:": "Sessiesleutel:", @@ -1702,9 +1702,9 @@ "This room is bridging messages to the following platforms. Learn more.": "Dit gesprek wordt overbrugd naar de volgende platformen. Lees meer", "This room isn’t bridging messages to any platforms. Learn more.": "Dit gesprek wordt niet overbrugd naar andere platformen. Lees meer.", "Bridges": "Bruggen", - "This user has not verified all of their sessions.": "Deze gebruiker heeft niet al zijn sessies geverifieerd.", - "You have not verified this user.": "U heeft deze gebruiker niet geverifieerd.", - "You have verified this user. This user has verified all of their sessions.": "U heeft deze gebruiker geverifieerd. Deze gebruiker heeft al zijn sessies geverifieerd.", + "This user has not verified all of their sessions.": "Deze persoon heeft niet al zijn sessies geverifieerd.", + "You have not verified this user.": "U heeft deze persoon niet geverifieerd.", + "You have verified this user. This user has verified all of their sessions.": "U heeft deze persoon geverifieerd. Deze persoon heeft al zijn sessies geverifieerd.", "Someone is using an unknown session": "Iemand gebruikt een onbekende sessie", "This room is end-to-end encrypted": "Dit gesprek is eind-tot-eind-versleuteld", "Everyone in this room is verified": "Iedereen in dit gesprek is geverifieerd", @@ -1712,8 +1712,8 @@ "rooms.": "gesprekken.", "Recent rooms": "Actuele gesprekken", "Direct Messages": "Direct gesprek", - "If disabled, messages from encrypted rooms won't appear in search results.": "Dit moet aan staan om te kunnen zoeken in versleutelde gesprekken.", - "Indexed rooms:": "Geïndexeerde gesprekken:", + "If disabled, messages from encrypted rooms won't appear in search results.": "Dit moet aan staan om te kunnen zoeken in versleutelde kamers.", + "Indexed rooms:": "Geïndexeerde kamers:", "Cross-signing and secret storage are enabled.": "Kruiselings ondertekenen en sleutelopslag zijn ingeschakeld.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Uw account heeft een identiteit voor kruiselings ondertekenen in de sleutelopslag, maar die wordt nog niet vertrouwd door de huidige sessie.", "Cross-signing and secret storage are not yet set up.": "Kruiselings ondertekenen en sleutelopslag zijn nog niet ingesteld.", @@ -1729,9 +1729,9 @@ "Manage": "Beheren", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Verbind deze sessie met de sleutelback-up voordat u zich afmeldt. Dit voorkomt dat u sleutels verliest die alleen op deze sessie voorkomen.", "Connect this session to Key Backup": "Verbind deze sessie met de sleutelback-up", - "Backup has a valid signature from this user": "De back-up heeft een geldige ondertekening van deze gebruiker", - "Backup has a invalid signature from this user": "De back-up heeft een ongeldige ondertekening van deze gebruiker", - "Backup has a signature from unknown user with ID %(deviceId)s": "De back-up heeft een ondertekening van een onbekende gebruiker met ID %(deviceId)s", + "Backup has a valid signature from this user": "De back-up heeft een geldige ondertekening van deze persoon", + "Backup has a invalid signature from this user": "De back-up heeft een ongeldige ondertekening van deze persoon", + "Backup has a signature from unknown user with ID %(deviceId)s": "De back-up heeft een ondertekening van een onbekende persoon met ID %(deviceId)s", "Backup has a signature from unknown session with ID %(deviceId)s": "De back-up heeft een ondertekening van een onbekende sessie met ID %(deviceId)s", "Backup has a valid signature from this session": "De back-up heeft een geldige ondertekening van deze sessie", "Backup has an invalid signature from this session": "De back-up heeft een ongeldige ondertekening van deze sessie", @@ -1751,10 +1751,10 @@ "Sign In or Create Account": "Meld u aan of maak een account aan", "Use your account or create a new one to continue.": "Gebruik uw bestaande account of maak een nieuwe aan om verder te gaan.", "Create Account": "Registreren", - "Displays information about a user": "Geeft informatie weer over een gebruiker", - "Order rooms by name": "Gesprekken sorteren op naam", - "Show rooms with unread notifications first": "Gesprekken met ongelezen meldingen eerst tonen", - "Show shortcuts to recently viewed rooms above the room list": "Snelkoppelingen naar de gesprekken die u recent heeft bekeken bovenaan de gesprekslijst weergeven", + "Displays information about a user": "Geeft informatie weer over een persoon", + "Order rooms by name": "Kamers sorteren op naam", + "Show rooms with unread notifications first": "Kamers met ongelezen meldingen eerst tonen", + "Show shortcuts to recently viewed rooms above the room list": "Snelkoppelingen naar de kamers die u recent heeft bekeken bovenaan de kamerlijst weergeven", "Cancelling…": "Bezig met annuleren…", "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop die de zoekmodulen bevat.", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Deze sessie maakt geen back-ups van uw sleutels, maar u beschikt over een reeds bestaande back-up waaruit u kunt herstellen en waaraan u nieuwe sleutels vanaf nu kunt toevoegen.", @@ -1770,13 +1770,13 @@ "Encrypted by a deleted session": "Versleuteld door een verwijderde sessie", "Invite only": "Enkel op uitnodiging", "Close preview": "Voorbeeld sluiten", - "Failed to deactivate user": "Deactiveren van gebruiker is mislukt", + "Failed to deactivate user": "Deactiveren van persoon is mislukt", "Send a reply…": "Verstuur een antwoord…", "Send a message…": "Verstuur een bericht…", "Room %(name)s": "Gesprek %(name)s", - " wants to chat": " wil een gesprek met u beginnen", + " wants to chat": " wil een chat met u beginnen", "Start chatting": "Gesprek beginnen", - "Reject & Ignore user": "Weigeren en gebruiker negeren", + "Reject & Ignore user": "Weigeren en persoon negeren", "%(count)s unread messages including mentions.|one": "1 ongelezen vermelding.", "%(count)s unread messages.|one": "1 ongelezen bericht.", "Unread messages.": "Ongelezen berichten.", @@ -1790,17 +1790,17 @@ "Start Verification": "Verificatie beginnen", "Messages in this room are end-to-end encrypted.": "De berichten in dit gesprek worden eind-tot-eind-versleuteld.", "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Uw berichten zijn beveiligd, en enkel de ontvanger en u hebben de unieke sleutels om ze te ontsleutelen.", - "Verify User": "Gebruiker verifiëren", - "For extra security, verify this user by checking a one-time code on both of your devices.": "Als extra beveiliging kunt u deze gebruiker verifiëren door een eenmalige code op uw toestellen te controleren.", + "Verify User": "Persoon verifiëren", + "For extra security, verify this user by checking a one-time code on both of your devices.": "Als extra beveiliging kunt u deze persoon verifiëren door een eenmalige code op jullie toestellen te controleren.", "Your messages are not secure": "Uw berichten zijn niet veilig", "One of the following may be compromised:": "Eén van volgende onderdelen kan gecompromitteerd zijn:", "Your homeserver": "Uw homeserver", - "The homeserver the user you’re verifying is connected to": "De homeserver waarmee de gebruiker die u probeert te verifiëren verbonden is", - "Yours, or the other users’ internet connection": "De internetverbinding van uzelf of de andere gebruiker", - "Yours, or the other users’ session": "De sessie van uzelf of de andere gebruiker", + "The homeserver the user you’re verifying is connected to": "De homeserver waarmee de persoon die u probeert te verifiëren verbonden is", + "Yours, or the other users’ internet connection": "De internetverbinding van uzelf of de andere persoon", + "Yours, or the other users’ session": "De sessie van uzelf of de andere persoon", "Not Trusted": "Niet vertrouwd", "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s%(userId)s heeft zich aangemeld bij een nieuwe sessie zonder deze te verifiëren:", - "Ask this user to verify their session, or manually verify it below.": "Vraag deze gebruiker haar/zijn sessie te verifiëren, of verifieer die hieronder handmatig.", + "Ask this user to verify their session, or manually verify it below.": "Vraag deze persoon de sessie te verifiëren, of verifieer het handmatig hieronder.", "Done": "Klaar", "Trusted": "Vertrouwd", "Not trusted": "Niet vertrouwd", @@ -1829,7 +1829,7 @@ "The encryption used by this room isn't supported.": "De versleuteling gebruikt in dit gesprek wordt niet ondersteund.", "React": "Reageren", "Message Actions": "Berichtacties", - "You have ignored this user, so their message is hidden. Show anyways.": "U heeft deze gebruiker genegeerd, dus zijn/haar berichten worden verborgen. Toch tonen?", + "You have ignored this user, so their message is hidden. Show anyways.": "U heeft deze persoon genegeerd, dus de berichten worden verborgen. Toch tonen?", "You verified %(name)s": "U heeft %(name)s geverifieerd", "You cancelled verifying %(name)s": "U heeft de verificatie van %(name)s geannuleerd", "%(name)s cancelled verifying": "%(name)s heeft de verificatie geannuleerd", @@ -1859,7 +1859,7 @@ "Any of the following data may be shared:": "De volgende gegevens worden mogelijk gedeeld:", "Your display name": "Uw weergavenaam", "Your avatar URL": "De URL van uw afbeelding", - "Your user ID": "Uw gebruikers-ID", + "Your user ID": "Uw persoon-ID", "Your theme": "Uw thema", "%(brand)s URL": "%(brand)s-URL", "Room ID": "Gespreks-ID", @@ -1880,22 +1880,22 @@ "Session name": "Sessienaam", "Session key": "Sessiesleutel", "Verification Requests": "Verificatieverzoeken", - "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Deze gebruiker verifiëren zal de sessie als vertrouwd markeren voor u en voor hem/haar.", - "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifieer dit apparaat om het als vertrouwd te markeren. Door dit apparaat te vertrouwen geeft u extra gemoedsrust aan uzelf en andere gebruikers bij het gebruik van eind-tot-eind-versleutelde berichten.", - "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Dit apparaat verifiëren zal het als vertrouwd markeren, en gebruikers die met u geverifieerd hebben zullen het vertrouwen.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Deze persoon verifiëren zal de sessie als vertrouwd markeren voor u beide.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifieer dit apparaat om het als vertrouwd te markeren. Door dit apparaat te vertrouwen geeft u extra zekerheid aan uzelf en andere personen bij het gebruik van eind-tot-eind-versleutelde berichten.", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Dit apparaat verifiëren zal het als vertrouwd markeren, en personen die met u geverifieerd hebben zullen het vertrouwen.", "Integrations are disabled": "Integraties zijn uitgeschakeld", "Enable 'Manage Integrations' in Settings to do this.": "Schakel de ‘Integratiebeheerder’ in in uw Instellingen om dit te doen.", "Integrations not allowed": "Integraties niet toegestaan", "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", "Failed to invite the following users to chat: %(csvUsers)s": "Het uitnodigen van volgende gebruikers voor gesprek is mislukt: %(csvUsers)s", "We couldn't create your DM. Please check the users you want to invite and try again.": "Uw direct gesprek kon niet aangemaakt worden. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.", - "Something went wrong trying to invite the users.": "Er is een fout opgetreden bij het uitnodigen van de gebruikers.", - "We couldn't invite those users. Please check the users you want to invite and try again.": "Deze gebruikers konden niet uitgenodigd worden. Controleer de gebruikers die u wilt uitnodigen en probeer het opnieuw.", - "Failed to find the following users": "Kon volgende gebruikers niet vinden", - "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Volgende gebruikers bestaan mogelijk niet of zijn ongeldig, en kunnen dan ook niet uitgenodigd worden: %(csvNames)s", + "Something went wrong trying to invite the users.": "Er is een fout opgetreden bij het uitnodigen van de personen.", + "We couldn't invite those users. Please check the users you want to invite and try again.": "Deze personen konden niet uitgenodigd worden. Controleer de personen die u wilt uitnodigen en probeer het opnieuw.", + "Failed to find the following users": "Kon volgende personen niet vinden", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Volgende personen bestaan mogelijk niet of zijn ongeldig, en kunnen niet uitgenodigd worden: %(csvNames)s", "Recent Conversations": "Recente gesprekken", "Suggestions": "Suggesties", - "Recently Direct Messaged": "Recente gesprekken", + "Recently Direct Messaged": "Recente directe gesprekken", "Go": "Start", "Your account is not secure": "Uw account is onveilig", "Your password": "Uw wachtwoord", @@ -1911,7 +1911,7 @@ "Upgrade public room": "Openbaar gesprek upgraden", "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "Het bijwerken van een gesprek is een gevorderde actie en wordt meestal aanbevolen wanneer een gesprek onstabiel is door bugs, ontbrekende functies of problemen met de beveiliging.", "This usually only affects how the room is processed on the server. If you're having problems with your %(brand)s, please report a bug.": "Dit heeft meestal enkel een invloed op de manier waarop het gesprek door de server verwerkt wordt. Als u problemen met uw %(brand)s ondervindt, dien dan een foutmelding in.", - "You'll upgrade this room from to .": "U upgrade dit gesprek van naar .", + "You'll upgrade this room from to .": "U upgrade deze kamer van naar .", "This will allow you to return to your account after signing out, and sign in on other sessions.": "Daardoor kunt u na afmelding terugkeren tot uw account, en u bij andere sessies aanmelden.", "Verification Request": "Verificatieverzoek", "Recovery key mismatch": "Herstelsleutel komt niet overeen", @@ -1925,15 +1925,15 @@ "Take picture": "Neem een foto", "Remove for everyone": "Verwijderen voor iedereen", "Remove for me": "Verwijderen voor mezelf", - "User Status": "Gebruikersstatus", + "User Status": "Persoonsstatus", "Country Dropdown": "Landselectie", "Confirm your identity by entering your account password below.": "Bevestig uw identiteit door hieronder uw wachtwoord in te voeren.", "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Er is geen identiteitsserver geconfigureerd, dus u kunt geen e-mailadres toevoegen om in de toekomst een nieuw wachtwoord in te stellen.", "Jump to first unread room.": "Ga naar het eerste ongelezen gesprek.", "Jump to first invite.": "Ga naar de eerste uitnodiging.", "Session verified": "Sessie geverifieerd", - "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Uw nieuwe sessie is nu geverifieerd. U heeft nu toegang tot uw versleutelde berichten en deze sessie zal voor andere gebruikers als vertrouwd gemarkeerd worden.", - "Your new session is now verified. Other users will see it as trusted.": "Uw nieuwe sessie is nu geverifieerd. Ze zal voor andere gebruikers als vertrouwd gemarkeerd worden.", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Uw nieuwe sessie is nu geverifieerd. U heeft nu toegang tot uw versleutelde berichten en deze sessie zal voor andere personen als vertrouwd gemarkeerd worden.", + "Your new session is now verified. Other users will see it as trusted.": "Uw nieuwe sessie is nu geverifieerd. Deze zal voor andere personen als vertrouwd gemarkeerd worden.", "Without completing security on this session, it won’t have access to encrypted messages.": "Als u de beveiliging van deze sessie niet vervolledigt, zal ze geen toegang hebben tot uw versleutelde berichten.", "Go Back": "Terugkeren", "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "Door uw wachtwoord te wijzigen stelt u alle eind-tot-eind-versleutelingssleutels op al uw sessies opnieuw in, waardoor uw versleutelde gespreksgeschiedenis onleesbaar wordt. Stel uw sleutelback-up in of sla uw gesprekssleutels van een andere sessie op voor u een nieuw wachtwoord instelt.", @@ -1946,7 +1946,7 @@ "Restore your key backup to upgrade your encryption": "Herstel uw sleutelback-up om uw versleuteling te upgraden", "Restore": "Herstellen", "You'll need to authenticate with the server to confirm the upgrade.": "U zult moeten inloggen bij de server om het upgraden te bevestigen.", - "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade deze sessie om er andere sessies mee te verifiëren, waardoor deze ook de toegang verkrijgen tot uw versleutelde berichten en deze voor andere gebruikers als vertrouwd gemarkeerd worden.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade deze sessie om er andere sessies mee te verifiëren. Hiermee krijgen de andere sessies toegang tot uw versleutelde berichten en is het voor andere personen als vertrouwd gemarkeerd .", "Set up with a recovery key": "Instellen met een herstelsleutel", "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Bewaar een kopie op een veilige plaats, zoals in een wachtwoordbeheerder of een kluis.", "Your recovery key": "Uw herstelsleutel", @@ -2004,7 +2004,7 @@ "Interactively verify by Emoji": "Interactief middels emojis", "Support adding custom themes": "Sta maatwerkthema's toe", "Opens chat with the given user": "Start een chat met die persoon", - "Sends a message to the given user": "Zendt die gebruiker een bericht", + "Sends a message to the given user": "Zendt die persoon een bericht", "Font scaling": "Lettergrootte", "Verify all your sessions to ensure your account & messages are safe": "Controleer al uw sessies om zeker te zijn dat uw account & berichten veilig zijn", "Verify the new login accessing your account: %(name)s": "Verifieer de nieuwe login op uw account: %(name)s", @@ -2017,7 +2017,7 @@ "Help us improve %(brand)s": "Help ons %(brand)s nog beter te maken", "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Stuur anonieme gebruiksinformatie waarmee we %(brand)s kunnen verbeteren. Dit plaatst een cookie.", "I want to help": "Ik wil helpen", - "Your homeserver has exceeded its user limit.": "Uw homeserver heeft het maximaal aantal gebruikers overschreden.", + "Your homeserver has exceeded its user limit.": "Uw homeserver heeft het maximaal aantal personen overschreden.", "Your homeserver has exceeded one of its resource limits.": "Uw homeserver heeft een van zijn limieten overschreden.", "Ok": "Oké", "Light": "Helder", @@ -2319,15 +2319,15 @@ "We couldn't log you in": "We konden u niet inloggen", "Room Info": "Gespreksinfo", "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org is de grootste openbare homeserver van de wereld, dus het is een goede plek voor vele.", - "Explore Public Rooms": "Verken openbare gesprekken", - "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Privégesprekken zijn alleen zichtbaar en toegankelijk met een uitnodiging. Openbare gesprekken zijn zichtbaar en toegankelijk voor iedereen in deze gemeenschap.", + "Explore Public Rooms": "Ontdek publieke kamers", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Privékamers zijn alleen zichtbaar en toegankelijk met een uitnodiging. Publieke kamers zijn zichtbaar en toegankelijk voor iedereen in deze gemeenschap.", "This room is public": "Dit gesprek is openbaar", "Show previews of messages": "Voorvertoning van berichten inschakelen", "Show message previews for reactions in all rooms": "Berichtvoorbeelden voor reacties in alle kamers tonen", - "Explore public rooms": "Verken openbare gesprekken", + "Explore public rooms": "Ontdek publieke kamers", "Leave Room": "Gesprek verlaten", "Room options": "Gesprekopties", - "Start a conversation with someone using their name, email address or username (like ).": "Start een gesprek met iemand door hun naam, emailadres of gebruikersnaam (zoals ) te typen.", + "Start a conversation with someone using their name, email address or username (like ).": "Start een gesprek met iemand door hun naam, e-mailadres of inlognaam (zoals ) te typen.", "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Berichten hier zijn eind-tot-eind versleuteld. Verifieer %(displayName)s op hun profiel - klik op hun afbeelding.", "%(creator)s created this DM.": "%(creator)s maakte deze DM.", "Switch to dark mode": "Naar donkere modus wisselen", @@ -2346,14 +2346,14 @@ "Use default": "Gebruik standaardinstelling", "Show %(count)s more|one": "Toon %(count)s meer", "Show %(count)s more|other": "Toon %(count)s meer", - "Show rooms with unread messages first": "Gesprekken met ongelezen berichten als eerste tonen", + "Show rooms with unread messages first": "Kamers met ongelezen berichten als eerste tonen", "%(count)s results|one": "%(count)s resultaten", "%(count)s results|other": "%(count)s resultaten", "Explore all public rooms": "Verken alle openbare gespreken", "Start a new chat": "Nieuw gesprek beginnen", "Can't see what you’re looking for?": "Niet kunnen vinden waar u naar zocht?", "Custom Tag": "Aangepast label", - "Explore community rooms": "Gemeenschapsgesprekken verkennen", + "Explore community rooms": "Gemeenschapskamers verkennen", "Start a Conversation": "Begin een gesprek", "Show Widgets": "Widgets tonen", "Hide Widgets": "Widgets verbergen", @@ -2363,7 +2363,7 @@ "Topic: %(topic)s ": "Onderwerp: %(topic)s ", "Topic: %(topic)s (edit)": "Onderwerp: %(topic)s (bewerken)", "This is the beginning of your direct message history with .": "Dit is het begin van de geschiedenis van uw direct gesprek met .", - "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "De beheerder van uw server heeft eind-tot-eind-versleuteling standaard uitgeschakeld in alle privégesprekken en directe gesprekken.", + "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "De beheerder van uw server heeft eind-tot-eind-versleuteling standaard uitgeschakeld in alle privékamers en directe gesprekken.", "Scroll to most recent messages": "Spring naar meest recente bericht", "The authenticity of this encrypted message can't be guaranteed on this device.": "De echtheid van dit versleutelde bericht kan op dit apparaat niet worden gegarandeerd.", "To link to this room, please add an address.": "Voeg een adres toe om naar dit gesprek te kunnen verwijzen.", @@ -2425,7 +2425,7 @@ "Use a more compact ‘Modern’ layout": "Compacte 'Modern'-layout inschakelen", "Use custom size": "Aangepaste lettergrootte gebruiken", "Font size": "Lettergrootte", - "Enable advanced debugging for the room list": "Geavanceerde bugopsporing voor de gesprekkenlijst inschakelen", + "Enable advanced debugging for the room list": "Geavanceerde bugopsporing voor de kamerlijst inschakelen", "Render LaTeX maths in messages": "Weergeef LaTeX-wiskundenotatie in berichten", "Change notification settings": "Meldingsinstellingen wijzigen", "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", @@ -2474,7 +2474,7 @@ "Matrix": "Matrix", "Are you sure you want to remove %(serverName)s": "Weet u zeker dat u %(serverName)s wilt verwijderen", "Your server": "Uw server", - "Can't find this server or its room list": "Kan deze server of de gesprekkenlijst niet vinden", + "Can't find this server or its room list": "Kan de server of haar kamerlijst niet vinden", "Looks good": "Ziet er goed uit", "Enter a server name": "Geef een servernaam", "Continue with %(provider)s": "Doorgaan met %(provider)s", @@ -2515,7 +2515,7 @@ "Unpin a widget to view it in this panel": "Maak een widget los om het in dit deel te weergeven", "Unpin": "Losmaken", "You can only pin up to %(count)s widgets|other": "U kunt maar %(count)s widgets vastzetten", - "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "In versleutelde gesprekken zijn uw berichten beveiligd, enkel de ontvanger en u hebben de unieke sleutels om ze te ontsleutelen.", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "In versleutelde kamers zijn uw berichten beveiligd, enkel de ontvanger en u hebben de unieke sleutels om ze te ontsleutelen.", "Waiting for you to accept on your other session…": "Wachten totdat u uw uitnodiging in uw andere sessie aanneemt…", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Stel een adres in zodat personen dit gesprek via uw homeserver (%(localDomain)s) kunnen vinden", "Local Addresses": "Lokale adressen", @@ -2529,12 +2529,12 @@ "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Let op, wanneer u geen e-mailadres toevoegt en uw wachtwoord vergeet, kunt u toegang tot uw account permanent verliezen.", "Continuing without email": "Doorgaan zonder e-mail", "If they don't match, the security of your communication may be compromised.": "Als deze niet overeenkomen, dan wordt deze sessie mogelijk door iemand anders onderschept.", - "Confirm by comparing the following with the User Settings in your other session:": "Om te verifiëren dat deze sessie vertrouwd kan worden, contacteert u de eigenaar via een andere methode (bv. persoonlijk of via een telefoontje) en vraagt u hem/haar of de sleutel die hij/zij ziet in zijn/haar Gebruikersinstellingen van deze sessie overeenkomt met de sleutel hieronder:", + "Confirm by comparing the following with the User Settings in your other session:": "Bevestig door het volgende te vergelijken met de persoonsinstellingen in uw andere sessie:", "Signature upload failed": "Versturen van ondertekening mislukt", "Signature upload success": "Ondertekening succesvol verstuurd", "Unable to upload": "Versturen niet mogelijk", "Transfer": "Doorschakelen", - "Start a conversation with someone using their name or username (like ).": "Start een gesprek met iemand door hun naam of gebruikersnaam (zoals ) te typen.", + "Start a conversation with someone using their name or username (like ).": "Start een gesprek met iemand door hun naam of inlognaam (zoals ) te typen.", "May include members not in %(communityName)s": "Mag deelnemers bevatten die geen deel uitmaken van %(communityName)s", "Invite by email": "Via e-mail uitnodigen", "Click the button below to confirm your identity.": "Druk op de knop hieronder om uw identiteit te bevestigen.", @@ -2634,15 +2634,15 @@ "Oman": "Oman", "Theme added!": "Thema toegevoegd!", "Add theme": "Thema toevoegen", - "No recently visited rooms": "Geen onlangs bezochte gesprekken", + "No recently visited rooms": "Geen onlangs bezochte kamers", "Use the Desktop app to see all encrypted files": "Gebruik de Desktop-app om alle versleutelde bestanden te zien", "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "Herinnering: Uw browser wordt niet ondersteund. Dit kan een negatieve impact hebben op uw ervaring.", "Use this when referencing your community to others. The community ID cannot be changed.": "Gebruik dit om anderen naar uw gemeenschap te verwijzen. De gemeenschaps-ID kan later niet meer veranderd worden.", "Please go into as much detail as you like, so we can track down the problem.": "Gebruik a.u.b. zoveel mogelijk details, zodat wij uw probleem kunnen vinden.", "There are two ways you can provide feedback and help us improve %(brand)s.": "U kunt op twee manieren feedback geven en ons helpen %(brand)s te verbeteren.", "Please view existing bugs on Github first. No match? Start a new one.": "Bekijk eerst de bestaande bugs op GitHub. Maak een nieuwe aan wanneer u uw bugs niet heeft gevonden.", - "Invite someone using their name, email address, username (like ) or share this room.": "Nodig iemand uit door gebruik te maken van hun naam, e-mailadres, gebruikersnaam (zoals ) of deel dit gesprek.", - "Invite someone using their name, username (like ) or share this room.": "Nodig iemand uit door gebruik te maken van hun naam, gebruikersnaam (zoals ) of deel dit gesprek.", + "Invite someone using their name, email address, username (like ) or share this room.": "Nodig iemand uit door gebruik te maken van hun naam, e-mailadres, inlognaam (zoals ) of deel dit gesprek.", + "Invite someone using their name, username (like ) or share this room.": "Nodig iemand uit door gebruik te maken van hun naam, inlognaam (zoals ) of deel dit gesprek.", "Send feedback": "Feedback versturen", "Feedback": "Feedback", "Feedback sent": "Feedback verstuurd", @@ -2741,29 +2741,29 @@ "Already have an account? Sign in here": "Heeft u al een account? Inloggen", "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s of %(usernamePassword)s", "Continue with %(ssoButtons)s": "Ga verder met %(ssoButtons)s", - "That username already exists, please try another.": "Die gebruikersnaam bestaat al, probeer een andere.", + "That username already exists, please try another.": "Die inlognaam bestaat al, probeer een andere.", "New? Create account": "Nieuw? Maak een account aan", - "If you've joined lots of rooms, this might take a while": "Als u zich bij veel gesprekken heeft aangesloten, kan dit een tijdje duren", + "If you've joined lots of rooms, this might take a while": "Als u zich bij veel kamers heeft aangesloten, kan dit een tijdje duren", "Signing In...": "Inloggen...", "Syncing...": "Synchroniseren...", "There was a problem communicating with the homeserver, please try again later.": "Er was een communicatieprobleem met de homeserver, probeer het later opnieuw.", - "Community and user menu": "Gemeenschaps- en gebruikersmenu", - "User menu": "Gebruikersmenu", + "Community and user menu": "Gemeenschaps- en persoonsmenu", + "User menu": "Persoonsmenu", "Switch theme": "Thema wisselen", "Community settings": "Gemeenschapsinstellingen", - "User settings": "Gebruikersinstellingen", + "User settings": "Persoonsinstellingen", "Security & privacy": "Veiligheid & privacy", "New here? Create an account": "Nieuw hier? Maak een account", "Got an account? Sign in": "Heeft u een account? Inloggen", "Failed to find the general chat for this community": "De algemene chat voor deze gemeenschap werd niet gevonden", "Filter rooms and people": "Gespreken en personen filteren", - "Explore rooms in %(communityName)s": "Ontdek de gesprekken van %(communityName)s", + "Explore rooms in %(communityName)s": "Ontdek de kamers van %(communityName)s", "delete the address.": "het adres verwijderen.", "Delete the room address %(alias)s and remove %(name)s from the directory?": "Het kameradres %(alias)s en %(name)s uit de gids verwijderen?", "You have no visible notifications.": "U hebt geen zichtbare meldingen.", "You’re all caught up": "U bent helemaal bij", "Self-verification request": "Verzoek om zelfverificatie", - "You do not have permission to create rooms in this community.": "U hebt geen toestemming om gesprekken te maken in deze gemeenschap.", + "You do not have permission to create rooms in this community.": "U hebt geen toestemming om kamers te maken in deze gemeenschap.", "Cannot create rooms in this community": "Kan geen gesprek maken in deze gemeenschap", "Upgrade to pro": "Upgrade naar pro", "Now, let's help you get started": "Laten we u helpen om te beginnen", @@ -2821,7 +2821,7 @@ "Looks good!": "Ziet er goed uit!", "Wrong file type": "Verkeerd bestandstype", "Remember this": "Onthoud dit", - "The widget will verify your user ID, but won't be able to perform actions for you:": "De widget zal uw gebruikers-ID verifiëren, maar zal geen acties voor u kunnen uitvoeren:", + "The widget will verify your user ID, but won't be able to perform actions for you:": "De widget zal uw persoon-ID verifiëren, maar zal geen acties voor u kunnen uitvoeren:", "Allow this widget to verify your identity": "Sta deze widget toe om uw identiteit te verifiëren", "Decline All": "Alles weigeren", "Approve": "Goedkeuren", @@ -2838,7 +2838,7 @@ "We recommend you change your password and Security Key in Settings immediately": "Wij raden u aan uw wachtwoord en veiligheidssleutel in de instellingen onmiddellijk te wijzigen", "Data on this screen is shared with %(widgetDomain)s": "Gegevens op dit scherm worden gedeeld met %(widgetDomain)s", "Modal Widget": "Modale widget", - "Confirm this user's session by comparing the following with their User Settings:": "Bevestig de sessie van deze gebruiker door het volgende te vergelijken met zijn gebruikersinstellingen:", + "Confirm this user's session by comparing the following with their User Settings:": "Bevestig de sessie van deze persoon door het volgende te vergelijken met zijn persoonsinstellingen:", "Cancelled signature upload": "Geannuleerde ondertekening upload", "%(brand)s encountered an error during upload of:": "%(brand)s is een fout tegengekomen tijdens het uploaden van:", "a key signature": "een sleutel ondertekening", @@ -2847,7 +2847,7 @@ "a new master key signature": "een nieuwe hoofdsleutel ondertekening", "This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here": "Dit zal ze niet uitnodigen voor %(communityName)s. Als u iemand wilt uitnodigen voor %(communityName)s, klik hier", "Failed to transfer call": "Oproep niet doorverbonden", - "A call can only be transferred to a single user.": "Een oproep kan slechts naar één gebruiker worden doorverbonden.", + "A call can only be transferred to a single user.": "Een oproep kan slechts naar één personen worden doorverbonden.", "Learn more in our , and .": "Meer informatie vindt u in onze , en .", "Continuing temporarily allows the %(hostSignupBrand)s setup process to access your account to fetch verified email addresses. This data is not stored.": "Door tijdelijk door te gaan, krijgt het installatieproces van %(hostSignupBrand)s toegang tot uw account om geverifieerde e-mailadressen op te halen. Deze gegevens worden niet opgeslagen.", "Failed to connect to your homeserver. Please close this dialog and try again.": "Kan geen verbinding maken met uw homeserver. Sluit dit dialoogvenster en probeer het opnieuw.", @@ -2878,18 +2878,18 @@ "You can’t disable this later. Bridges & most bots won’t work yet.": "U kunt dit later niet uitschakelen. Bruggen en de meeste bots zullen nog niet werken.", "There was an error creating your community. The name may be taken or the server is unable to process your request.": "Er is een fout opgetreden bij het aanmaken van uw gemeenschap. De naam kan bezet zijn of de server is niet in staat om uw aanvraag te verwerken.", "Preparing to download logs": "Klaarmaken om logs te downloaden", - "Matrix rooms": "Matrix-gesprekken", - "%(networkName)s rooms": "%(networkName)s gesprekken", + "Matrix rooms": "Matrix-kamers", + "%(networkName)s rooms": "%(networkName)s kamers", "Enter the name of a new server you want to explore.": "Voer de naam in van een nieuwe server die u wilt verkennen.", "Remove server": "Server verwijderen", - "All rooms": "Alle gesprekken", + "All rooms": "Alle kamers", "Windows": "Windows", "Screens": "Schermen", "Share your screen": "Uw scherm delen", "Submit logs": "Logs versturen", "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Berichten in deze kamer zijn eind-tot-eind-versleuteld. Als personen deelnemen, kan u ze verifiëren in hun profiel, tik hiervoor op hun afbeelding.", - "In encrypted rooms, verify all users to ensure it’s secure.": "Controleer alle gebruikers in versleutelde gesprekken om er zeker van te zijn dat het veilig is.", - "Verify all users in a room to ensure it's secure.": "Controleer alle gebruikers in een gesprek om er zeker van te zijn dat het veilig is.", + "In encrypted rooms, verify all users to ensure it’s secure.": "Controleer alle personen in versleutelde kamers om er zeker van te zijn dat het veilig is.", + "Verify all users in a room to ensure it's secure.": "Controleer alle personen in een kamer om er zeker van te zijn dat het veilig is.", "%(count)s people|one": "%(count)s persoon", "Add widgets, bridges & bots": "Widgets, bruggen & bots toevoegen", "Edit widgets, bridges & bots": "Widgets, bruggen & bots bewerken", @@ -2900,14 +2900,14 @@ "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Gepubliceerde adressen kunnen door iedereen op elke server gebruikt worden om aan je groep deel te nemen. Om een adres te publiceren moet het eerste ingesteld worden als lokaaladres.", "Published Addresses": "Gepubliceerde adressen", "Mentions & Keywords": "Vermeldingen & Trefwoorden", - "Use the + to make a new room or explore existing ones below": "Gebruik de + om een nieuw gesprek te beginnen of ontdek de bestaande gesprekken hieronder", + "Use the + to make a new room or explore existing ones below": "Gebruik de + om een nieuwe kamer te beginnen of ontdek de bestaande kamers hieronder", "Open dial pad": "Kiestoetsen openen", - "Recently visited rooms": "Onlangs geopende gesprekken", + "Recently visited rooms": "Onlangs geopende kamers", "Add a photo, so people can easily spot your room.": "Voeg een foto toe, zodat personen u gemakkelijk kunnen herkennen in het gesprek.", "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Alleen u beiden nemen deel aan dit gesprek, tenzij een van u beiden iemand uitnodigt om deel te nemen.", "Emoji picker": "Emoji kiezer", "Room ID or address of ban list": "Gesprek-ID of het adres van de banlijst", - "Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Voeg hier gebruikers en servers toe die u wilt negeren. Gebruik asterisken om %(brand)s met alle tekens te laten overeenkomen. Bijvoorbeeld, @bot:* zou alle gebruikers negeren die de naam 'bot' hebben op elke server.", + "Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "Voeg hier personen en servers toe die u wilt negeren. Gebruik asterisken om %(brand)s met alle tekens te laten overeenkomen. Bijvoorbeeld, @bot:* zou alle personen negeren die de naam 'bot' hebben op elke server.", "Please verify the room ID or address and try again.": "Controleer het gesprek-ID of het adres en probeer het opnieuw.", "Message layout": "Berichtlayout", "Custom theme URL": "Aangepaste thema-URL", @@ -2920,9 +2920,9 @@ "well formed": "goed gevormd", "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s kan versleutelde berichten niet veilig lokaal opslaan in een webbrowser. Gebruik %(brand)s Desktop om versleutelde berichten in zoekresultaten te laten verschijnen.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Veilig lokaal opslaan van versleutelde berichten zodat ze in de zoekresultaten verschijnen, gebruik %(size)s voor het opslaan van berichten uit %(rooms)s gesprek.", - "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Veilig lokaal opslaan van versleutelde berichten zodat ze in de zoekresultaten verschijnen, gebruik %(size)s voor het opslaan van berichten uit %(rooms)s gesprekken.", - "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifieer elke sessie die door een gebruiker wordt gebruikt afzonderlijk. Dit markeert hem als vertrouwd zonder te vertrouwen op kruislings ondertekende apparaten.", - "User signing private key:": "Gebruikerondertekening-privésleutel:", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Veilig lokaal opslaan van versleutelde berichten zodat ze in de zoekresultaten verschijnen, gebruik %(size)s voor het opslaan van berichten uit %(rooms)s kamers.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifieer elke sessie die door een persoon wordt gebruikt afzonderlijk. Dit markeert hem als vertrouwd zonder te vertrouwen op kruislings ondertekende apparaten.", + "User signing private key:": "Persoonsondertekening-privésleutel:", "Master private key:": "Hoofdprivésleutel:", "Self signing private key:": "Zelfondertekening-privésleutel:", "Cross-signing is not set up.": "Kruiselings ondertekenen is niet ingesteld.", @@ -2951,7 +2951,7 @@ "Send a Direct Message": "Start een direct gesprek", "Welcome to %(appName)s": "Welkom bij %(appName)s", "Add a topic to help people know what it is about.": "Stel een gespreksonderwerp in zodat de personen weten waar het over gaat.", - "Upgrade to %(hostSignupBrand)s": "Upgrade naar %(hostSignupBrand)s", + "Upgrade to %(hostSignupBrand)s": "%(hostSignupBrand)s upgrade", "Edit Values": "Waarde wijzigen", "Values at explicit levels in this room:": "Waarde op expliciete niveaus in dit gesprek:", "Values at explicit levels:": "Waardes op expliciete niveaus:", @@ -2981,9 +2981,9 @@ "We'll create rooms for each topic.": "We maken gesprekken voor elk onderwerp.", "What are some things you want to discuss?": "Wat zijn dingen die u wilt bespreken?", "Inviting...": "Uitnodigen...", - "Invite by username": "Op gebruikersnaam uitnodigen", + "Invite by username": "Op inlognaam uitnodigen", "Invite your teammates": "Uw teamgenoten uitnodigen", - "Failed to invite the following users to your space: %(csvUsers)s": "Het uitnodigen van de volgende gebruikers voor uw space is mislukt: %(csvUsers)s", + "Failed to invite the following users to your space: %(csvUsers)s": "Het uitnodigen van de volgende personen voor uw space is mislukt: %(csvUsers)s", "A private space for you and your teammates": "Een privé space voor u en uw teamgenoten", "Me and my teammates": "Ik en mijn teamgenoten", "A private space just for you": "Een privé space alleen voor u", @@ -2992,9 +2992,9 @@ "Who are you working with?": "Met wie werkt u samen?", "Finish": "Voltooien", "At the moment only you can see it.": "Op dit moment kan u deze alleen zien.", - "Creating rooms...": "Gesprekken aanmaken...", + "Creating rooms...": "Kamers aanmaken...", "Skip for now": "Voorlopig overslaan", - "Failed to create initial space rooms": "Het maken van de space gesprekken is mislukt", + "Failed to create initial space rooms": "Het maken van de space kamers is mislukt", "Room name": "Gespreksnaam", "Support": "Ondersteuning", "Random": "Willekeurig", @@ -3032,8 +3032,8 @@ "Failed to save space settings.": "Het opslaan van de space-instellingen is mislukt.", "Space settings": "Space-instellingen", "Edit settings relating to your space.": "Bewerk instellingen gerelateerd aan uw space.", - "Invite someone using their name, username (like ) or share this space.": "Nodig iemand uit per naam, gebruikersnaam (zoals ) of deel deze space.", - "Invite someone using their name, email address, username (like ) or share this space.": "Nodig iemand uit per naam, e-mailadres, gebruikersnaam (zoals ) of deel deze space.", + "Invite someone using their name, username (like ) or share this space.": "Nodig iemand uit per naam, inlognaam (zoals ) of deel deze space.", + "Invite someone using their name, email address, username (like ) or share this space.": "Nodig iemand uit per naam, e-mailadres, inlognaam (zoals ) of deel deze space.", "Unnamed Space": "Naamloze space", "Invite to %(spaceName)s": "Voor %(spaceName)s uitnodigen", "Failed to add rooms to space": "Het toevoegen van gesprekken aan de space is mislukt", @@ -3045,13 +3045,13 @@ "Filter your rooms and spaces": "Gesprekken en spaces filteren", "Add existing spaces/rooms": "Bestaande spaces/gesprekken toevoegen", "Space selection": "Space-selectie", - "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the space it will be impossible to regain privileges.": "U kunt deze wijziging niet ongedaan maken omdat u uzelf rechten ontneemt, als u de laatste bevoegde gebruiker in de ruimte bent zal het onmogelijk zijn om weer rechten te krijgen.", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the space it will be impossible to regain privileges.": "U kunt deze wijziging niet ongedaan maken, omdat u uzelf rechten ontneemt. Als u de laatste bevoegde persoon in de space bent zal het onmogelijk zijn om weer rechten te krijgen.", "Empty room": "Leeg gesprek", "Suggested Rooms": "Gespreksuggesties", "Explore space rooms": "Space-gesprekken ontdekken", - "You do not have permissions to add rooms to this space": "U hebt geen toestemming om gesprekken toe te voegen in deze space", - "Add existing room": "Bestaande gesprekken toevoegen", - "You do not have permissions to create new rooms in this space": "U hebt geen toestemming om gesprekken te maken in deze space", + "You do not have permissions to add rooms to this space": "U hebt geen toestemming om kamers toe te voegen in deze space", + "Add existing room": "Bestaande kamers toevoegen", + "You do not have permissions to create new rooms in this space": "U hebt geen toestemming om kamers te maken in deze space", "Send message": "Bericht versturen", "Invite to this space": "Uitnodigen voor deze space", "Your message was sent": "Uw bericht is verstuurd", @@ -3090,10 +3090,10 @@ "You're already in a call with this person.": "U bent al een oproep met deze persoon.", "Verify this login to access your encrypted messages and prove to others that this login is really you.": "Verifieer deze login om toegang te krijgen tot uw versleutelde berichten en om anderen te bewijzen dat deze login echt van u is.", "Verify with another session": "Verifieer met een andere sessie", - "We'll create rooms for each of them. You can add more later too, including already existing ones.": "We zullen voor elk een gesprek maken. U kunt er later meer toevoegen, inclusief al bestaande gesprekken.", + "We'll create rooms for each of them. You can add more later too, including already existing ones.": "We zullen voor elk een kamer maken. U kunt er later meer toevoegen, inclusief al bestaande kamers.", "Let's create a room for each of them. You can add more later too, including already existing ones.": "Laten we voor elk een gesprek maken. U kunt er later meer toevoegen, inclusief al bestaande gesprekken.", "Make sure the right people have access. You can invite more later.": "Controleer of de juiste mensen toegang hebben. U kunt later meer mensen uitnodigen.", - "A private space to organise your rooms": "Een privé space om uw gesprekken te organiseren", + "A private space to organise your rooms": "Een privé space om uw kamers te organiseren", "Just me": "Alleen ik", "Make sure the right people have access to %(name)s": "Controleer of de juiste mensen toegang hebben tot %(name)s", "Go to my first room": "Ga naar mijn eerste gesprek", @@ -3109,16 +3109,16 @@ "Mark as suggested": "Markeer als aanbeveling", "Mark as not suggested": "Markeer als geen aanbeveling", "Removing...": "Verwijderen...", - "Failed to remove some rooms. Try again later": "Het verwijderen van sommige gesprekken is mislukt. Probeer het opnieuw", + "Failed to remove some rooms. Try again later": "Het verwijderen van sommige kamers is mislukt. Probeer het opnieuw", "%(count)s rooms and 1 space|one": "%(count)s gesprek en 1 space", - "%(count)s rooms and 1 space|other": "%(count)s gesprekken en 1 space", + "%(count)s rooms and 1 space|other": "%(count)s kamers en 1 space", "%(count)s rooms and %(numSpaces)s spaces|one": "%(count)s gesprek en %(numSpaces)s spaces", - "%(count)s rooms and %(numSpaces)s spaces|other": "%(count)s gesprekken en %(numSpaces)s spaces", + "%(count)s rooms and %(numSpaces)s spaces|other": "%(count)s kamers en %(numSpaces)s spaces", "If you can't find the room you're looking for, ask for an invite or create a new room.": "Als u uw gesprek niet kan vinden, vraag dan om een uitnodiging of maak een nieuw gesprek.", "Suggested": "Aanbevolen", "This room is suggested as a good one to join": "Dit is een aanbevolen gesprek om aan deel te nemen", "%(count)s rooms|one": "%(count)s gesprek", - "%(count)s rooms|other": "%(count)s gesprekken", + "%(count)s rooms|other": "%(count)s kamers", "You don't have permission": "U heeft geen toestemming", "Open": "Openen", "%(count)s messages deleted.|one": "%(count)s bericht verwijderd.", @@ -3127,7 +3127,7 @@ "Invite to %(roomName)s": "Uitnodiging voor %(roomName)s", "Edit devices": "Apparaten bewerken", "Invite People": "Mensen uitnodigen", - "Invite with email or username": "Uitnodigen per e-mail of gebruikersnaam", + "Invite with email or username": "Uitnodigen per e-mail of inlognaam", "You can change these anytime.": "U kan dit elk moment nog aanpassen.", "Add some details to help people recognise it.": "Voeg details toe zodat mensen het herkennen.", "Spaces are new ways to group rooms and people. To join an existing space you'll need an invite.": "Spaces zijn een nieuwe manier voor het groeperen van gesprekken. Voor deelname aan een bestaande space heeft u een uitnodiging nodig.", @@ -3139,7 +3139,7 @@ "Verify your identity to access encrypted messages and prove your identity to others.": "Verifeer uw identiteit om toegang te krijgen tot uw versleutelde berichten en om uw identiteit te bewijzen voor anderen.", "Use another login": "Gebruik andere login", "Please choose a strong password": "Kies een sterk wachtwoord", - "You can add more later too, including already existing ones.": "U kunt er later nog meer toevoegen, inclusief al bestaande gesprekken.", + "You can add more later too, including already existing ones.": "U kunt er later nog meer toevoegen, inclusief al bestaande kamers.", "Let's create a room for each of them.": "Laten we voor elk een los gesprek maken.", "What are some things you want to discuss in %(spaceName)s?": "Wat wilt u allemaal bespreken in %(spaceName)s?", "Verification requested": "Verificatieverzocht", @@ -3153,7 +3153,7 @@ "Invited people will be able to read old messages.": "Uitgenodigde personen kunnen de oude berichten lezen.", "We couldn't create your DM.": "We konden uw DM niet aanmaken.", "Adding...": "Toevoegen...", - "Add existing rooms": "Bestaande gesprekken toevoegen", + "Add existing rooms": "Bestaande kamers toevoegen", "%(count)s people you know have already joined|one": "%(count)s persoon die u kent is al geregistreerd", "%(count)s people you know have already joined|other": "%(count)s personen die u kent hebben zijn al geregistreerd", "Accept on your other login…": "Accepteer op uw andere login…", @@ -3164,7 +3164,7 @@ "Invite to just this room": "Uitnodigen voor alleen dit gesprek", "Warn before quitting": "Waarschuwen voordat u afsluit", "Message search initilisation failed": "Zoeken in berichten opstarten is mislukt", - "Manage & explore rooms": "Beheer & ontdek gesprekken", + "Manage & explore rooms": "Beheer & ontdek kamers", "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Overleggen met %(transferTarget)s. Verstuur naar %(transferee)s", "unknown person": "onbekend persoon", "Share decryption keys for room history when inviting users": "Deel ontsleutelsleutels voor de gespreksgeschiedenis wanneer u personen uitnodigd", @@ -3173,7 +3173,7 @@ "Review to ensure your account is safe": "Controleer ze zodat uw account veilig is", "Sends the given message as a spoiler": "Verstuurt het bericht als een spoiler", "You are the only person here. If you leave, no one will be able to join in the future, including you.": "U bent de enige persoon hier. Als u weggaat, zal niemand in de toekomst kunnen toetreden, u ook niet.", - "If you reset everything, you will restart with no trusted sessions, no trusted users, and might not be able to see past messages.": "Als u alles reset, zult u opnieuw opstarten zonder vertrouwde sessies, zonder vertrouwde gebruikers, en zult u misschien geen vroegere berichten meer kunnen zien.", + "If you reset everything, you will restart with no trusted sessions, no trusted users, and might not be able to see past messages.": "Als u alles reset zult u opnieuw opstarten zonder vertrouwde sessies, zonder vertrouwde personen, en zult u misschien geen oude berichten meer kunnen zien.", "Only do this if you have no other device to complete verification with.": "Doe dit alleen als u geen ander apparaat hebt om de verificatie mee uit te voeren.", "Reset everything": "Alles opnieuw instellen", "Forgotten or lost all recovery methods? Reset all": "Alles vergeten en alle herstelmethoden verloren? Alles opnieuw instellen", @@ -3203,7 +3203,7 @@ "Stop the recording": "Opname stoppen", "%(count)s results in all spaces|one": "%(count)s resultaat in alle spaces", "%(count)s results in all spaces|other": "%(count)s resultaten in alle spaces", - "You have no ignored users.": "U heeft geen gebruiker genegeerd.", + "You have no ignored users.": "U heeft geen persoon genegeerd.", "Play": "Afspelen", "Pause": "Pauze", "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Dit is een experimentele functie. Voorlopig moeten nieuwe personen die een uitnodiging krijgen de gebruiken om daadwerkelijk deel te nemen.", @@ -3218,11 +3218,11 @@ "Spaces is a beta feature": "Spaces zijn in beta", "Want to add a new room instead?": "Wilt u anders een nieuw gesprek toevoegen?", "Adding rooms... (%(progress)s out of %(count)s)|one": "Gesprek toevoegen...", - "Adding rooms... (%(progress)s out of %(count)s)|other": "Gesprekken toevoegen... (%(progress)s van %(count)s)", + "Adding rooms... (%(progress)s out of %(count)s)|other": "Kamers toevoegen... (%(progress)s van %(count)s)", "Not all selected were added": "Niet alle geselecteerden zijn toegevoegd", "You can add existing spaces to a space.": "U kunt bestaande spaces toevoegen aan een space.", "Feeling experimental?": "Zin in een experiment?", - "You are not allowed to view this server's rooms list": "U heeft geen toegang tot deze server zijn gesprekkenlijst", + "You are not allowed to view this server's rooms list": "U heeft geen toegang tot deze server zijn kamerlijst", "Error processing voice message": "Fout bij verwerking spraakbericht", "We didn't find a microphone on your device. Please check your settings and try again.": "We hebben geen microfoon gevonden op uw apparaat. Controleer uw instellingen en probeer het opnieuw.", "No microphone found": "Geen microfoon gevonden", @@ -3240,13 +3240,13 @@ "%(brand)s will reload with Spaces enabled. Communities and custom tags will be hidden.": "%(brand)s zal herladen met Spaces ingeschakeld. Gemeenschappen en labels worden verborgen.", "Beta available for web, desktop and Android. Thank you for trying the beta.": "De beta is beschikbaar voor web, desktop en Android. Bedankt dat u de beta wilt proberen.", "%(brand)s will reload with Spaces disabled. Communities and custom tags will be visible again.": "%(brand)s zal herladen met Spaces uitgeschakeld. Gemeenschappen en labels zullen weer zichtbaar worden.", - "Spaces are a new way to group rooms and people.": "Spaces zijn de nieuwe manier om gesprekken en personen te groeperen.", + "Spaces are a new way to group rooms and people.": "Spaces zijn de nieuwe manier om kamers en personen te groeperen.", "Message search initialisation failed": "Zoeken in berichten opstarten is mislukt", "Spaces are a beta feature.": "Spaces zijn een beta functie.", "Search names and descriptions": "Namen en beschrijvingen zoeken", "You may contact me if you have any follow up questions": "U mag contact met mij opnemen als u nog vervolg vragen heeft", "To leave the beta, visit your settings.": "Om de beta te verlaten, ga naar uw instellingen.", - "Your platform and username will be noted to help us use your feedback as much as we can.": "Uw platform en gebruikersnaam zullen worden opgeslagen om onze te helpen uw feedback zo goed mogelijk te gebruiken.", + "Your platform and username will be noted to help us use your feedback as much as we can.": "Uw platform en inlognaam zullen worden opgeslagen om onze te helpen uw feedback zo goed mogelijk te gebruiken.", "%(featureName)s beta feedback": "%(featureName)s beta feedback", "Thank you for your feedback, we really appreciate it.": "Bedankt voor uw feedback, we waarderen het enorm.", "Beta feedback": "Beta feedback", @@ -3263,17 +3263,17 @@ "See when people join, leave, or are invited to this room": "Zie wanneer personen deelnemen, vertrekken of worden uitgenodigd voor deze kamer", "Kick, ban, or invite people to this room, and make you leave": "Verwijder, verban of verwijder personen uit deze kamer en uzelf laten vertrekken", "Currently joining %(count)s rooms|one": "Momenteel aan het toetreden tot %(count)s gesprek", - "Currently joining %(count)s rooms|other": "Momenteel aan het toetreden tot %(count)s gesprekken", + "Currently joining %(count)s rooms|other": "Momenteel aan het toetreden tot %(count)s kamers", "Try different words or check for typos. Some results may not be visible as they're private and you need an invite to join them.": "Probeer andere woorden of controleer op typefouten. Sommige resultaten zijn mogelijk niet zichtbaar omdat ze privé zijn of u een uitnodiging nodig heeft om deel te nemen.", "No results for \"%(query)s\"": "Geen resultaten voor \"%(query)s\"", - "The user you called is busy.": "De gebruiker die u belde is bezet.", - "User Busy": "Gebruiker Bezet", + "The user you called is busy.": "De persoon die u belde is bezet.", + "User Busy": "Persoon Bezet", "We're working on this as part of the beta, but just want to let you know.": "We werken hieraan als onderdeel van de beta, maar we willen het u gewoon laten weten.", - "Teammates might not be able to view or join any private rooms you make.": "Teamgenoten zijn mogelijk niet in staat zijn om privégesprekken die u maakt te bekijken of er lid van te worden.", + "Teammates might not be able to view or join any private rooms you make.": "Teamgenoten zijn mogelijk niet in staat zijn om privékamers die u maakt te bekijken of er lid van te worden.", "Or send invite link": "Of verstuur uw uitnodigingslink", "If you can't see who you’re looking for, send them your invite link below.": "Als u niet kunt vinden wie u zoekt, stuur ze dan uw uitnodigingslink hieronder.", "Some suggestions may be hidden for privacy.": "Sommige suggesties kunnen om privacyredenen verborgen zijn.", - "Search for rooms or people": "Zoek naar gesprekken of personen", + "Search for rooms or people": "Zoek naar kamers of personen", "Message preview": "Voorbeeld van bericht", "Forward message": "Bericht doorsturen", "Open link": "Koppeling openen", @@ -3344,8 +3344,8 @@ "Show notification badges for People in Spaces": "Toon meldingsbadge voor personen in spaces", "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Indien uitgeschakeld, kunt u nog steeds directe gesprekken toevoegen aan persoonlijke spaces. Indien ingeschakeld, ziet u automatisch iedereen die lid is van de space.", "Show people in spaces": "Toon personen in spaces", - "Show all rooms in Home": "Alle gesprekken in Thuis tonen", - "Report to moderators prototype. In rooms that support moderation, the `report` button will let you report abuse to room moderators": "Meld aan moderators prototype. In gesprekken die moderatie ondersteunen, kunt u met de `melden` knop misbruik melden aan de gesprekmoderators", + "Show all rooms in Home": "Alle kamers in Thuis tonen", + "Report to moderators prototype. In rooms that support moderation, the `report` button will let you report abuse to room moderators": "Meld aan moderators prototype. In kamers die moderatie ondersteunen, kunt u met de `melden` knop misbruik melden aan de kamermoderators", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s heeft de vastgeprikte berichten voor de kamer gewijzigd.", "%(senderName)s kicked %(targetName)s": "%(senderName)s heeft %(targetName)s verwijderd", "%(senderName)s kicked %(targetName)s: %(reason)s": "%(senderName)s heeft %(targetName)s verbannen: %(reason)s", @@ -3381,7 +3381,7 @@ "Keyboard shortcuts": "Sneltoetsen", "Use Ctrl + F to search timeline": "Gebruik Ctrl +F om te zoeken in de tijdlijn", "Use Command + F to search timeline": "Gebruik Command + F om te zoeken in de tijdlijn", - "User %(userId)s is already invited to the room": "De gebruiker %(userId)s is al uitgenodigd voor dit gesprek", + "User %(userId)s is already invited to the room": "De persoon %(userId)s is al uitgenodigd voor deze kamer", "Integration manager": "Integratiebeheerder", "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Met het gebruik van deze widget deelt u mogelijk gegevens met %(widgetDomain)s & uw integratiebeheerder.", @@ -3394,7 +3394,7 @@ "Could not connect to identity server": "Kon geen verbinding maken met de identiteitsserver", "Not a valid identity server (status code %(code)s)": "Geen geldige identiteitsserver (statuscode %(code)s)", "Identity server URL must be HTTPS": "Identiteitsserver-URL moet HTTPS zijn", - "User Directory": "Gebruikersgids", + "User Directory": "Personengids", "Copy Link": "Link kopieren", "There was an error loading your notification settings.": "Er was een fout bij het laden van uw meldingsvoorkeuren.", "Mentions & keywords": "Vermeldingen & trefwoorden", @@ -3436,10 +3436,10 @@ "Only invited people can join.": "Alleen uitgenodigde personen kunnen deelnemen.", "Private (invite only)": "Privé (alleen op uitnodiging)", "This upgrade will allow members of selected spaces access to this room without an invite.": "Deze upgrade maakt het mogelijk voor leden van geselecteerde spaces om toegang te krijgen tot dit gesprek zonder een uitnodiging.", - "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Dit maakt het makkelijk om gesprekken privé te houden voor een space, terwijl personen in de space hem kunnen vinden en aan deelnemen. Alle nieuwe gesprekken in deze space hebben deze optie beschikbaar.", - "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Om space leden te helpen met het vinden van en deel te nemen aan privégesprekken, ga naar uw gespreksinstellingen voor veiligheid & privacy.", - "Help space members find private rooms": "Help space leden privégesprekken te vinden", - "Help people in spaces to find and join private rooms": "Help personen in spaces om privégesprekken te vinden en aan deel te nemen", + "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Dit maakt het makkelijk om kamers privé te houden voor een space, terwijl personen in de space hem kunnen vinden en aan deelnemen. Alle nieuwe kamers in deze space hebben deze optie beschikbaar.", + "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Om space leden te helpen met het vinden van en deel te nemen aan privékamers, ga naar uw kamerinstellingen voor veiligheid & privacy.", + "Help space members find private rooms": "Help space leden privékamers te vinden", + "Help people in spaces to find and join private rooms": "Help personen in spaces om privékamers te vinden en aan deel te nemen", "New in the Spaces beta": "Nieuw in de spaces beta", "Everyone in will be able to find and join this room.": "Iedereen in kan dit gesprek vinden en aan deelnemen.", "Image": "Afbeelding", @@ -3450,7 +3450,7 @@ "You declined this call": "U heeft deze oproep geweigerd", "The voice message failed to upload.": "Het spraakbericht versturen is mislukt.", "Access": "Toegang", - "People with supported clients will be able to join the room without having a registered account.": "Personen met geschikte apps zullen aan de gesprekken kunnen deelnemen zonder een account te hebben.", + "People with supported clients will be able to join the room without having a registered account.": "Personen met geschikte apps zullen aan de kamer kunnen deelnemen zonder een account te hebben.", "Decide who can join %(roomName)s.": "Kies wie kan deelnemen aan %(roomName)s.", "Space members": "Space leden", "Anyone in a space can find and join. You can select multiple spaces.": "Iedereen in een space kan zoeken en deelnemen. U kunt meerdere spaces selecteren.", @@ -3465,8 +3465,8 @@ "Error downloading audio": "Fout bij downloaden van audio", "Please note upgrading will make a new version of the room. All current messages will stay in this archived room.": "Let op bijwerken maakt een nieuwe versie van dit gesprek. Alle huidige berichten blijven in dit gearchiveerde gesprek.", "Automatically invite members from this room to the new one": "Automatisch leden uitnodigen van dit gesprek in de nieuwe", - "These are likely ones other room admins are a part of.": "Er zijn waarschijnlijk gesprekken waar andere gespreksbeheerders deel van uitmaken.", - "Other spaces or rooms you might not know": "Andere spaces of gesprekken die u misschien niet kent", + "These are likely ones other room admins are a part of.": "Dit zijn waarschijnlijk kamers waar andere kamerbeheerders deel van uitmaken.", + "Other spaces or rooms you might not know": "Andere spaces of kamers die u misschien niet kent", "Spaces you know that contain this room": "Spaces die u kent met dit gesprek", "Search spaces": "Spaces zoeken", "Decide which spaces can access this room. If a space is selected, its members can find and join .": "Kies welke spaces toegang hebben tot dit gesprek. Als een space is geselecteerd kunnen deze leden vinden en aan deelnemen.", @@ -3544,5 +3544,22 @@ "You can change this later.": "U kan dit later aanpassen.", "What kind of Space do you want to create?": "Wat voor soort Space wilt u maken?", "Delete avatar": "Afbeelding verwijderen", - "Don't send read receipts": "Geen leesbevestigingen versturen" + "Don't send read receipts": "Geen leesbevestigingen versturen", + "Created from ": "Gemaakt van ", + "Communities won't receive further updates.": "Gemeenschappen zullen geen updates meer krijgen.", + "Spaces are a new way to make a community, with new features coming.": "Spaces zijn de nieuwe gemeenschappen, met binnenkort meer nieuwe functies.", + "Communities can now be made into Spaces": "Gemeenschappen kunnen nu omgezet worden in Spaces", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Vraag een beheerder van deze gemeenschap om hem om te zetten in een Space en kijk uit naar de uitnodiging.", + "You can create a Space from this community here.": "U kunt hier een Space maken van uw gemeenschap.", + "This description will be shown to people when they view your space": "Deze omschrijving zal getoond worden aan personen die uw space bekijken", + "Flair won't be available in Spaces for the foreseeable future.": "Badges zijn niet beschikbaar in Spaces in de nabije toekomst.", + "All rooms will be added and all community members will be invited.": "Alle kamers zullen worden toegevoegd en alle gemeenschapsleden zullen worden uitgenodigd.", + "A link to the Space will be put in your community description.": "Een link naar deze Space zal geplaatst worden in de gemeenschapsomschrijving.", + "Create Space from community": "Space van gemeenschap maken", + "Failed to migrate community": "Omzetten van de gemeenschap is mislukt", + "To create a Space from another community, just pick the community in Preferences.": "Om een Space te maken van een gemeenschap kiest u de gemeenschap in Instellingen.", + " has been made and everyone who was a part of the community has been invited to it.": " is gemaakt en iedereen die lid was van de gemeenschap is ervoor uitgenodigd.", + "Space created": "Space aangemaakt", + "To view Spaces, hide communities in Preferences": "Om Spaces te zien, verberg gemeenschappen in uw Instellingen", + "This community has been upgraded into a Space": "Deze gemeenschap is geupgrade naar een Space" } From 1f406d646e3d0fd27d96607a4fd7eec00e3fb352 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Thu, 12 Aug 2021 14:01:07 +0000 Subject: [PATCH 088/619] Translated using Weblate (Esperanto) Currently translated at 93.3% (2931 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 44 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index c97adeb05f..e86b58dbab 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -3363,5 +3363,47 @@ "Some invites couldn't be sent": "Ne povis sendi iujn invitojn", "We sent the others, but the below people couldn't be invited to ": "Ni sendis la aliajn, sed la ĉi-subaj personoj ne povis ricevi inviton al ", "Transfer Failed": "Malsukcesis transdono", - "Unable to transfer call": "Ne povas transdoni vokon" + "Unable to transfer call": "Ne povas transdoni vokon", + "Preview Space": "Antaŭrigardi aron", + "only invited people can view and join": "nur invititoj povas rigardi kaj aliĝi", + "anyone with the link can view and join": "ĉiu kun ligilo povas rigardi kaj aliĝi", + "Decide who can view and join %(spaceName)s.": "Decidu, kiu povas rigardi kaj aliĝi aron %(spaceName)s.", + "Visibility": "Videbleco", + "This may be useful for public spaces.": "Tio povas esti utila por publikaj aroj.", + "Guests can join a space without having an account.": "Gastoj povas aliĝi al aro sen konto.", + "Enable guest access": "Ŝalti aliron de gastoj", + "Failed to update the history visibility of this space": "Malsukcesis ĝisdatigi videblecon de historio de ĉi tiu aro", + "Failed to update the guest access of this space": "Malsukcesis ĝisdatigi aliron de gastoj al ĉi tiu aro", + "Failed to update the visibility of this space": "Malsukcesis ĝisdatigi la videblecon de ĉi tiu aro", + "Show all rooms": "Montri ĉiujn ĉambrojn", + "Address": "Adreso", + "e.g. my-space": "ekz. mia-aro", + "Give feedback.": "Prikomentu.", + "Thank you for trying Spaces. Your feedback will help inform the next versions.": "Dankon ĉar vi provas arojn. Viaj prikomentoj helpos al ni evoluigi la venontajn versiojn.", + "Spaces feedback": "Prikomentoj pri aroj", + "Spaces are a new feature.": "Aroj estas nova funkcio.", + "Delete avatar": "Forigi profilbildon", + "Mute the microphone": "Silentigi la mikrofonon", + "Unmute the microphone": "Malsilentigi la mikrofonon", + "Dialpad": "Ciferplato", + "More": "Pli", + "Show sidebar": "Montri flankan breton", + "Hide sidebar": "Kaŝi flankan breton", + "Start sharing your screen": "Ŝalti ekranvidadon", + "Stop sharing your screen": "Malŝalti ekranvidadon", + "Stop the camera": "Malŝalti la filmilon", + "Start the camera": "Ŝalti la filmilon", + "Your camera is still enabled": "Via filmilo ankoraŭ estas ŝaltita", + "Your camera is turned off": "Via filmilo estas malŝaltita", + "%(sharerName)s is presenting": "%(sharerName)s prezentas", + "You are presenting": "Vi prezentas", + "Surround selected text when typing special characters": "Ĉirkaŭi elektitan tekston dum tajpado de specialaj signoj", + "Don't send read receipts": "Ne sendi legokonfirmojn", + "New layout switcher (with message bubbles)": "Nova baskulo de aranĝo (kun mesaĝaj vezikoj)", + "Report to moderators prototype. In rooms that support moderation, the `report` button will let you report abuse to room moderators": "Pratipo de raportado al reguligistoj. En ĉambroj, kiuj subtenas reguligadon, la butono «raporti» povigos vin raporti misuzon al reguligistoj de ĉambro", + "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Tio faciligas, ke ĉambroj restu privataj por aro, sed ebligas serĉadon kaj aliĝadon al personoj en tiu sama aro. Ĉiuj novaj ĉambroj en aro havos tiun ĉi elekteblon.", + "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Por helpi al aranoj trovi kaj aliĝi privatan ĉambron, iru al la agordoj de Sekureco kaj Privateco de tiu ĉambro.", + "Help space members find private rooms": "Helpu aranojn trovi privatajn ĉambrojn", + "Help people in spaces to find and join private rooms": "Helpu al personoj en aroj trovi kaj aliĝi privatajn ĉambrojn", + "New in the Spaces beta": "Nove en beta-versio de aroj" } From d465d6c9c669097c5b30e5816f95ee1573fef25c Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 12 Aug 2021 14:29:55 +0000 Subject: [PATCH 089/619] Translated using Weblate (Czech) Currently translated at 100.0% (3141 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index eb9f36c9a8..c09493fa23 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3565,5 +3565,31 @@ "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s%(count)s krát změnili připnuté zprávy místnosti.", "Olm version:": "Verze Olm:", "Don't send read receipts": "Neposílat potvrzení o přečtení", - "Delete avatar": "Smazat avatar" + "Delete avatar": "Smazat avatar", + "Created from ": "Vytvořeno z ", + "Communities won't receive further updates.": "Skupiny nebudou dostávat další aktualizace.", + "Spaces are a new way to make a community, with new features coming.": "Prostory jsou novým způsobem vytváření komunit a přibývají nové funkce.", + "Communities can now be made into Spaces": "Ze skupin lze nyní vytvořit prostory", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Požádejte správce této skupiny, aby z ní udělali prostor a počkejte na pozvánku.", + "You can create a Space from this community here.": "Zde můžete vytvořit prostor z této skupiny.", + "This description will be shown to people when they view your space": "Tento popis se zobrazí lidem při prohlížení vašeho prostoru", + "Flair won't be available in Spaces for the foreseeable future.": "Symbol příslušnosti ke skupině nebude v dohledné době dostupný ve Spaces.", + "All rooms will be added and all community members will be invited.": "Všechny místnosti budou přidány a všichni členové skupiny budou pozváni.", + "To create a Space from another community, just pick the community in Preferences.": "Chcete-li vytvořit prostor z jiné skupiny, vyberte ji v Předvolbách.", + "Show my Communities": "Zobrazit moje Skupiny", + "A link to the Space will be put in your community description.": "Odkaz na prostor bude vložen do popisu vaší skupiny.", + "Create Space from community": "Vytvořit prostor ze skupiny", + "Failed to migrate community": "Nepodařilo se převést skupinu", + " has been made and everyone who was a part of the community has been invited to it.": " byl vytvořen a všichni, kteří byli součástí skupiny, do něj byli pozváni.", + "Space created": "Prostor byl vytvořen", + "To view Spaces, hide communities in Preferences": "Chcete-li zobrazit Prostory, skryjte skupiny v Předvolbách", + "This community has been upgraded into a Space": "Tato skupina byla převedena na prostor", + "If a community isn't shown you may not have permission to convert it.": "Pokud skupina není zobrazena, nemusíte mít povolení k její konverzi.", + "You can also create a Space from a community.": "Prostor můžete vytvořit také ze skupiny.", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Skupiny byly archivovány, aby uvolnily místo pro Prostory, ale níže můžete své skupiny převést na prostory. Převedení zajistí, že vaše konverzace budou mít nejnovější funkce.", + "Create Space": "Vytvořit prostor", + "What kind of Space do you want to create?": "Jaký druh prostoru chcete vytvořit?", + "Open Space": "Otevřít prostor", + "To join an existing space you'll need an invite.": "Chcete-li se připojit k existujícímu prostoru, potřebujete pozvánku.", + "You can change this later.": "Toto můžete změnit později." } From 300a1b12e72f959593872293ac754f737284bbb6 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 12 Aug 2021 11:23:34 +0000 Subject: [PATCH 090/619] Translated using Weblate (Albanian) Currently translated at 99.7% (3132 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 97fdc998dc..44462fadfb 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3633,5 +3633,32 @@ "Stop sharing your screen": "Reshtni dhënien e ekranit tuaj", "Stop the camera": "Ndale kamerën", "Start the camera": "Nise kamerën", - "Surround selected text when typing special characters": "Rrethoje tekstin e përzgjedhur, kur shtypen shenja speciale" + "Surround selected text when typing special characters": "Rrethoje tekstin e përzgjedhur, kur shtypen shenja speciale", + "Created from ": "Krijuar prej ", + "Communities won't receive further updates.": "Për bashkësitë s’do të ketë përditësime të mëtejshme.", + "Spaces are a new way to make a community, with new features coming.": "Hapësirat janë një rrugë e re për të krijuar një bashkësi, me veçori të reja së afërmi.", + "Communities can now be made into Spaces": "Tanimë bashkësitë mund të shndërrohen në Hapësira", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Kërkojini përgjegjësve të kësaj bashkësie ta shndërrojnë në një Hapësirë dhe hapni sytë për ftesën.", + "You can create a Space from this community here.": "Këtu mund të krijoni një Hapësirë prej kësaj bashkësie.", + "This description will be shown to people when they view your space": "Ky përshkrim do t’u tregohet personave kur shohin hapësirën tuaj", + "All rooms will be added and all community members will be invited.": "Do të shtohen krejt dhomat dhe do të ftohen krejt anëtarët e bashkësisë.", + "A link to the Space will be put in your community description.": "Një lidhje për te Hapësira do të vendoset te përshkrimi i bashkësisë tuaj.", + "Create Space from community": "Krijo Hapësirë prej bashkësie", + "Failed to migrate community": "S’u arrit të migrohej bashkësia", + "To create a Space from another community, just pick the community in Preferences.": "Që të krijoni një Hapësirë prej një bashkësie tjetër, thjesht zgjidhni bashkësinë te Parapëlqimet.", + " has been made and everyone who was a part of the community has been invited to it.": " është krijuar dhe cilido që qe pjesë e bashkësisë është ftuar në të.", + "Space created": "Hapësira u krijua", + "To view Spaces, hide communities in Preferences": "Që të shihni Hapësira, fshini bashkësitë te Parapëlqime", + "This community has been upgraded into a Space": "Kjo bashkësi është përmirësuar në një Hapësirë", + "If a community isn't shown you may not have permission to convert it.": "Nëse një bashkësi s’është shfaqur, mund të mos keni leje për ta shndërruar atë.", + "Show my Communities": "Shfaqi Bashkësitë e mia", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Bashkësitë janë arkivuar, për t’ua lënë vendin Hapësirave, por mundeni, më poshtë, të shndërroni bashkësitë tuaja në Hapësira. Shndërrimi do të garantojë që bisedat tuaja të marrin veçoritë më të reja.", + "Create Space": "Krijo Hapësirë", + "Open Space": "Hap Hapësirë", + "To join an existing space you'll need an invite.": "Që të hyni në një hapësirë ekzistuese, ju duhet një ftesë.", + "You can also create a Space from a community.": "Mundeni të krijoni një Hapësirë edhe prej një bashkësie.", + "You can change this later.": "Këtë mund ta ndryshoni më vonë.", + "What kind of Space do you want to create?": "Ç’lloj Hapësire doni të krijoni?", + "Delete avatar": "Fshije avatarin", + "Don't send read receipts": "Mos dërgo dëftesa leximi" } From 5c808eaba00ccaf35bfb83ed79c1f46360a8b34a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 12 Aug 2021 11:54:32 +0000 Subject: [PATCH 091/619] Translated using Weblate (Estonian) Currently translated at 97.9% (3078 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index c76fdbe727..17e6e87936 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3579,5 +3579,11 @@ "More": "Veel", "Dialpad": "Numbriklahvistik", "Unmute the microphone": "Eemalda mikrofoni summutamine", - "Mute the microphone": "Summuta mikrofon" + "Mute the microphone": "Summuta mikrofon", + "You can create a Space from this community here.": "Sellest vana tüüpi kogukonnast saad luua uue kogukonnakeskuse siin.", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Palu et haldaja muudaks vana kogukonna uueks kogukonnakeskuseks ja oota liitumiskutset.", + "Communities can now be made into Spaces": "Vanad kogukonnad saab nüüd muuta uuteks kogukonnakeskusteks", + "Spaces are a new way to make a community, with new features coming.": "Kogukonnakeskused on nüüd uus ja pidevalt täienev lahendus seniste kogukondade jaoks.", + "Communities won't receive further updates.": "Kogukondade vana funktsionaalsus enam ei uuene.", + "Created from ": "Loodud kogukonnas: " } From 2afee596a9ed021508ac539a1c1a16fee6ebe9d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:10:47 +0200 Subject: [PATCH 092/619] $primary-bg-color -> $background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/_common.scss | 8 ++++---- res/css/structures/_GroupFilterPanel.scss | 2 +- res/css/structures/_MatrixChat.scss | 2 +- res/css/structures/_NotificationPanel.scss | 2 +- res/css/structures/_RightPanel.scss | 2 +- res/css/structures/_RoomStatusBar.scss | 4 ++-- res/css/structures/_RoomView.scss | 8 ++++---- res/css/structures/_SpaceRoomDirectory.scss | 2 +- res/css/views/auth/_AuthButtons.scss | 2 +- .../views/context_menus/_StatusMessageContextMenu.scss | 2 +- res/css/views/dialogs/_ConfirmUserActionDialog.scss | 2 +- res/css/views/dialogs/_CreateGroupDialog.scss | 2 +- res/css/views/dialogs/_CreateRoomDialog.scss | 2 +- res/css/views/dialogs/_SetEmailDialog.scss | 2 +- res/css/views/directory/_NetworkDropdown.scss | 2 +- res/css/views/elements/_AddressSelector.scss | 6 +++--- res/css/views/elements/_Dropdown.scss | 2 +- res/css/views/elements/_FacePile.scss | 2 +- res/css/views/elements/_Field.scss | 2 +- res/css/views/elements/_MiniAvatarUploader.scss | 2 +- res/css/views/emojipicker/_EmojiPicker.scss | 2 +- res/css/views/messages/_MImageBody.scss | 2 +- res/css/views/messages/_MessageActionBar.scss | 2 +- res/css/views/right_panel/_PinnedMessagesCard.scss | 2 +- res/css/views/rooms/_Autocomplete.scss | 2 +- res/css/views/rooms/_BasicMessageComposer.scss | 2 +- res/css/views/rooms/_EditMessageComposer.scss | 2 +- res/css/views/rooms/_JumpToBottomButton.scss | 2 +- res/css/views/rooms/_MessageComposer.scss | 4 ++-- res/css/views/rooms/_ReplyPreview.scss | 2 +- res/css/views/rooms/_RoomHeader.scss | 2 +- res/css/views/rooms/_TopUnreadMessagesBar.scss | 4 ++-- res/css/views/rooms/_WhoIsTypingTile.scss | 4 ++-- res/css/views/spaces/_SpaceCreateMenu.scss | 2 +- res/themes/dark/css/_dark.scss | 1 - res/themes/light-custom/css/_custom.scss | 2 +- res/themes/light/css/_light.scss | 9 ++++----- 37 files changed, 51 insertions(+), 53 deletions(-) diff --git a/res/css/_common.scss b/res/css/_common.scss index fa925eba5b..7439b36218 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -53,7 +53,7 @@ html { body { font-family: $font-family; font-size: $font-15px; - background-color: $primary-bg-color; + background-color: $background; color: $primary-fg-color; border: 0px; margin: 0px; @@ -209,7 +209,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { :not(.mx_textinput):not(.mx_Field):not(.mx_no_textinput) > input[type=search], .mx_textinput { color: $input-darker-fg-color; - background-color: $primary-bg-color; + background-color: $background; border: none; } } @@ -271,7 +271,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { } .mx_Dialog { - background-color: $primary-bg-color; + background-color: $background; color: $light-fg-color; z-index: 4012; font-weight: 300; @@ -489,7 +489,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { border: 1px solid $input-border-color; padding: 9px; color: $primary-fg-color; - background-color: $primary-bg-color; + background-color: $background; } .mx_textButton { diff --git a/res/css/structures/_GroupFilterPanel.scss b/res/css/structures/_GroupFilterPanel.scss index 444435dd57..6ff4fb5c3e 100644 --- a/res/css/structures/_GroupFilterPanel.scss +++ b/res/css/structures/_GroupFilterPanel.scss @@ -75,7 +75,7 @@ limitations under the License. } .mx_GroupFilterPanel .mx_TagTile.mx_TagTile_selected_prototype { - background-color: $primary-bg-color; + background-color: $background; border-radius: 6px; } diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index a220c5d505..b660a6446c 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -67,7 +67,7 @@ limitations under the License. /* not the left panel, and not the resize handle, so the roomview/groupview/... */ .mx_MatrixChat > :not(.mx_LeftPanel):not(.mx_SpacePanel):not(.mx_ResizeHandle) { - background-color: $primary-bg-color; + background-color: $background; flex: 1 1 0; min-width: 0; diff --git a/res/css/structures/_NotificationPanel.scss b/res/css/structures/_NotificationPanel.scss index d271cd2bcc..be2cbaef1d 100644 --- a/res/css/structures/_NotificationPanel.scss +++ b/res/css/structures/_NotificationPanel.scss @@ -118,7 +118,7 @@ limitations under the License. } .mx_NotificationPanel .mx_EventTile:hover .mx_EventTile_line { - background-color: $primary-bg-color; + background-color: $background; } .mx_NotificationPanel .mx_EventTile_content { diff --git a/res/css/structures/_RightPanel.scss b/res/css/structures/_RightPanel.scss index 3222fe936c..5316cba61d 100644 --- a/res/css/structures/_RightPanel.scss +++ b/res/css/structures/_RightPanel.scss @@ -43,7 +43,7 @@ limitations under the License. .mx_RightPanel_headerButtonGroup { height: 100%; display: flex; - background-color: $primary-bg-color; + background-color: $background; padding: 0 9px; align-items: center; } diff --git a/res/css/structures/_RoomStatusBar.scss b/res/css/structures/_RoomStatusBar.scss index de9e049165..89cb8c0ba3 100644 --- a/res/css/structures/_RoomStatusBar.scss +++ b/res/css/structures/_RoomStatusBar.scss @@ -27,7 +27,7 @@ limitations under the License. .mx_RoomStatusBar_typingIndicatorAvatars .mx_BaseAvatar_image { margin-right: -12px; - border: 1px solid $primary-bg-color; + border: 1px solid $background; } .mx_RoomStatusBar_typingIndicatorAvatars .mx_BaseAvatar_initial { @@ -39,7 +39,7 @@ limitations under the License. display: inline-block; color: #acacac; background-color: #ddd; - border: 1px solid $primary-bg-color; + border: 1px solid $background; border-radius: 40px; width: 24px; height: 24px; diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss index 831f186ed4..cc61b65d96 100644 --- a/res/css/structures/_RoomView.scss +++ b/res/css/structures/_RoomView.scss @@ -40,7 +40,7 @@ limitations under the License. pointer-events: none; - background-color: $primary-bg-color; + background-color: $background; opacity: 0.95; position: absolute; @@ -87,7 +87,7 @@ limitations under the License. left: 0; right: 0; z-index: 3000; - background-color: $primary-bg-color; + background-color: $background; } .mx_RoomView_auxPanel_hiddenHighlights { @@ -161,7 +161,7 @@ limitations under the License. flex: 0 0 auto; max-height: 0px; - background-color: $primary-bg-color; + background-color: $background; z-index: 1000; overflow: hidden; @@ -246,7 +246,7 @@ hr.mx_RoomView_myReadMarker { } .mx_RoomView_callStatusBar .mx_UploadBar_uploadProgressInner { - background-color: $primary-bg-color; + background-color: $background; } .mx_RoomView_callStatusBar .mx_UploadBar_uploadFilename { diff --git a/res/css/structures/_SpaceRoomDirectory.scss b/res/css/structures/_SpaceRoomDirectory.scss index 88e6a3f494..d251e48947 100644 --- a/res/css/structures/_SpaceRoomDirectory.scss +++ b/res/css/structures/_SpaceRoomDirectory.scss @@ -160,7 +160,7 @@ limitations under the License. height: 16px; width: 16px; border-radius: 4px; - background-color: $primary-bg-color; + background-color: $background; &::before { content: ''; diff --git a/res/css/views/auth/_AuthButtons.scss b/res/css/views/auth/_AuthButtons.scss index 8deb0f80ac..3a2ad2adf8 100644 --- a/res/css/views/auth/_AuthButtons.scss +++ b/res/css/views/auth/_AuthButtons.scss @@ -39,7 +39,7 @@ limitations under the License. min-width: 80px; background-color: $accent-color; - color: $primary-bg-color; + color: $background; cursor: pointer; diff --git a/res/css/views/context_menus/_StatusMessageContextMenu.scss b/res/css/views/context_menus/_StatusMessageContextMenu.scss index fceb7fba34..1a97fb56c7 100644 --- a/res/css/views/context_menus/_StatusMessageContextMenu.scss +++ b/res/css/views/context_menus/_StatusMessageContextMenu.scss @@ -27,7 +27,7 @@ input.mx_StatusMessageContextMenu_message { border-radius: 4px; border: 1px solid $input-border-color; padding: 6.5px 11px; - background-color: $primary-bg-color; + background-color: $background; font-weight: normal; margin: 0 0 10px; } diff --git a/res/css/views/dialogs/_ConfirmUserActionDialog.scss b/res/css/views/dialogs/_ConfirmUserActionDialog.scss index 284c171f4e..c390398020 100644 --- a/res/css/views/dialogs/_ConfirmUserActionDialog.scss +++ b/res/css/views/dialogs/_ConfirmUserActionDialog.scss @@ -36,7 +36,7 @@ limitations under the License. .mx_ConfirmUserActionDialog_reasonField { font-size: $font-14px; color: $primary-fg-color; - background-color: $primary-bg-color; + background-color: $background; border-radius: 3px; border: solid 1px $input-border-color; diff --git a/res/css/views/dialogs/_CreateGroupDialog.scss b/res/css/views/dialogs/_CreateGroupDialog.scss index f7bfc61a98..58045e1d7f 100644 --- a/res/css/views/dialogs/_CreateGroupDialog.scss +++ b/res/css/views/dialogs/_CreateGroupDialog.scss @@ -30,7 +30,7 @@ limitations under the License. border: 1px solid $input-border-color; padding: 9px; color: $primary-fg-color; - background-color: $primary-bg-color; + background-color: $background; } .mx_CreateGroupDialog_input_hasPrefixAndSuffix { diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index e7cfbf6050..818c93073a 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -56,7 +56,7 @@ limitations under the License. border: 1px solid $input-border-color; padding: 9px; color: $primary-fg-color; - background-color: $primary-bg-color; + background-color: $background; width: 100%; } diff --git a/res/css/views/dialogs/_SetEmailDialog.scss b/res/css/views/dialogs/_SetEmailDialog.scss index 37bee7a9ff..a39d51dfce 100644 --- a/res/css/views/dialogs/_SetEmailDialog.scss +++ b/res/css/views/dialogs/_SetEmailDialog.scss @@ -19,7 +19,7 @@ limitations under the License. border: 1px solid $input-border-color; padding: 9px; color: $input-fg-color; - background-color: $primary-bg-color; + background-color: $background; font-size: $font-15px; width: 100%; max-width: 280px; diff --git a/res/css/views/directory/_NetworkDropdown.scss b/res/css/views/directory/_NetworkDropdown.scss index ae0927386a..eb24cb0107 100644 --- a/res/css/views/directory/_NetworkDropdown.scss +++ b/res/css/views/directory/_NetworkDropdown.scss @@ -34,7 +34,7 @@ limitations under the License. box-sizing: border-box; border-radius: 4px; border: 1px solid $dialog-close-fg-color; - background-color: $primary-bg-color; + background-color: $background; max-height: calc(100vh - 20px); // allow 10px padding on both top and bottom overflow-y: auto; } diff --git a/res/css/views/elements/_AddressSelector.scss b/res/css/views/elements/_AddressSelector.scss index 087504390c..a7d463353b 100644 --- a/res/css/views/elements/_AddressSelector.scss +++ b/res/css/views/elements/_AddressSelector.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_AddressSelector { position: absolute; - background-color: $primary-bg-color; + background-color: $background; width: 485px; max-height: 116px; overflow-y: auto; @@ -31,8 +31,8 @@ limitations under the License. } .mx_AddressSelector_addressListElement .mx_AddressTile { - background-color: $primary-bg-color; - border: solid 1px $primary-bg-color; + background-color: $background; + border: solid 1px $background; } .mx_AddressSelector_addressListElement.mx_AddressSelector_selected { diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss index 3b67e0191e..1844f2ccd3 100644 --- a/res/css/views/elements/_Dropdown.scss +++ b/res/css/views/elements/_Dropdown.scss @@ -111,7 +111,7 @@ input.mx_Dropdown_option:focus { padding: 0px; border-radius: 4px; border: 1px solid $input-focused-border-color; - background-color: $primary-bg-color; + background-color: $background; max-height: 200px; overflow-y: auto; } diff --git a/res/css/views/elements/_FacePile.scss b/res/css/views/elements/_FacePile.scss index c691baffb5..5f6f473081 100644 --- a/res/css/views/elements/_FacePile.scss +++ b/res/css/views/elements/_FacePile.scss @@ -25,7 +25,7 @@ limitations under the License. } .mx_BaseAvatar_image { - border: 1px solid $primary-bg-color; + border: 1px solid $background; } .mx_BaseAvatar_initial { diff --git a/res/css/views/elements/_Field.scss b/res/css/views/elements/_Field.scss index 50cd14c4da..afd5eeacdc 100644 --- a/res/css/views/elements/_Field.scss +++ b/res/css/views/elements/_Field.scss @@ -47,7 +47,7 @@ limitations under the License. border-radius: 4px; padding: 8px 9px; color: $primary-fg-color; - background-color: $primary-bg-color; + background-color: $background; flex: 1; min-width: 0; } diff --git a/res/css/views/elements/_MiniAvatarUploader.scss b/res/css/views/elements/_MiniAvatarUploader.scss index df4676ab56..7ba86de16f 100644 --- a/res/css/views/elements/_MiniAvatarUploader.scss +++ b/res/css/views/elements/_MiniAvatarUploader.scss @@ -37,7 +37,7 @@ limitations under the License. right: -6px; bottom: -6px; - background-color: $primary-bg-color; + background-color: $background; border-radius: 50%; z-index: 1; diff --git a/res/css/views/emojipicker/_EmojiPicker.scss b/res/css/views/emojipicker/_EmojiPicker.scss index 400e40e233..05a21b933a 100644 --- a/res/css/views/emojipicker/_EmojiPicker.scss +++ b/res/css/views/emojipicker/_EmojiPicker.scss @@ -89,7 +89,7 @@ limitations under the License. margin: 8px; border-radius: 4px; border: 1px solid $input-border-color; - background-color: $primary-bg-color; + background-color: $background; display: flex; input { diff --git a/res/css/views/messages/_MImageBody.scss b/res/css/views/messages/_MImageBody.scss index 765c74a36d..ab7ab14772 100644 --- a/res/css/views/messages/_MImageBody.scss +++ b/res/css/views/messages/_MImageBody.scss @@ -96,5 +96,5 @@ $timelineImageBorderRadius: 4px; } .mx_EventTile:hover .mx_HiddenImagePlaceholder { - background-color: $primary-bg-color; + background-color: $background; } diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index 69f3c672b7..ba2f320729 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -23,7 +23,7 @@ limitations under the License. height: 32px; line-height: $font-24px; border-radius: 8px; - background: $primary-bg-color; + background: $background; border: 1px solid $input-border-color; top: -32px; right: 8px; diff --git a/res/css/views/right_panel/_PinnedMessagesCard.scss b/res/css/views/right_panel/_PinnedMessagesCard.scss index 785aee09ca..933f7f0d2c 100644 --- a/res/css/views/right_panel/_PinnedMessagesCard.scss +++ b/res/css/views/right_panel/_PinnedMessagesCard.scss @@ -48,7 +48,7 @@ limitations under the License. height: 32px; line-height: $font-24px; border-radius: 8px; - background: $primary-bg-color; + background: $background; border: 1px solid $input-border-color; padding: 1px; width: max-content; diff --git a/res/css/views/rooms/_Autocomplete.scss b/res/css/views/rooms/_Autocomplete.scss index f8e0a382b1..5a9ec4362b 100644 --- a/res/css/views/rooms/_Autocomplete.scss +++ b/res/css/views/rooms/_Autocomplete.scss @@ -4,7 +4,7 @@ z-index: 1001; width: 100%; border: 1px solid $primary-hairline-color; - background: $primary-bg-color; + background: $background; border-bottom: none; border-radius: 8px 8px 0 0; max-height: 50vh; diff --git a/res/css/views/rooms/_BasicMessageComposer.scss b/res/css/views/rooms/_BasicMessageComposer.scss index 544a96daba..752d3b0a54 100644 --- a/res/css/views/rooms/_BasicMessageComposer.scss +++ b/res/css/views/rooms/_BasicMessageComposer.scss @@ -31,7 +31,7 @@ limitations under the License. @keyframes visualbell { from { background-color: $visual-bell-bg-color; } - to { background-color: $primary-bg-color; } + to { background-color: $background; } } &.mx_BasicMessageComposer_input_error { diff --git a/res/css/views/rooms/_EditMessageComposer.scss b/res/css/views/rooms/_EditMessageComposer.scss index 214bfc4a1a..bf3c7c9b42 100644 --- a/res/css/views/rooms/_EditMessageComposer.scss +++ b/res/css/views/rooms/_EditMessageComposer.scss @@ -28,7 +28,7 @@ limitations under the License. .mx_BasicMessageComposer_input { border-radius: 4px; border: solid 1px $primary-hairline-color; - background-color: $primary-bg-color; + background-color: $background; max-height: 200px; padding: 3px 6px; diff --git a/res/css/views/rooms/_JumpToBottomButton.scss b/res/css/views/rooms/_JumpToBottomButton.scss index a8dc2ce11c..2b38b509de 100644 --- a/res/css/views/rooms/_JumpToBottomButton.scss +++ b/res/css/views/rooms/_JumpToBottomButton.scss @@ -56,7 +56,7 @@ limitations under the License. height: 38px; border-radius: 19px; box-sizing: border-box; - background: $primary-bg-color; + background: $background; border: 1.3px solid $muted-fg-color; cursor: pointer; } diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index 5e2eff4047..9dd04d739b 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -130,7 +130,7 @@ limitations under the License. @keyframes visualbell { from { background-color: $visual-bell-bg-color; } - to { background-color: $primary-bg-color; } + to { background-color: $background; } } .mx_MessageComposer_input_error { @@ -161,7 +161,7 @@ limitations under the License. outline: none; box-shadow: none; color: $primary-fg-color; - background-color: $primary-bg-color; + background-color: $background; font-size: $font-14px; max-height: 120px; overflow: auto; diff --git a/res/css/views/rooms/_ReplyPreview.scss b/res/css/views/rooms/_ReplyPreview.scss index 60feb39d11..f6dc298563 100644 --- a/res/css/views/rooms/_ReplyPreview.scss +++ b/res/css/views/rooms/_ReplyPreview.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_ReplyPreview { border: 1px solid $primary-hairline-color; - background: $primary-bg-color; + background: $background; border-bottom: none; border-radius: 8px 8px 0 0; max-height: 50vh; diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 4142b0a2ef..0b73dcfcf2 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -74,7 +74,7 @@ limitations under the License. .mx_RoomHeader_buttons { display: flex; - background-color: $primary-bg-color; + background-color: $background; } .mx_RoomHeader_info { diff --git a/res/css/views/rooms/_TopUnreadMessagesBar.scss b/res/css/views/rooms/_TopUnreadMessagesBar.scss index 8841b042a0..7c7d96e713 100644 --- a/res/css/views/rooms/_TopUnreadMessagesBar.scss +++ b/res/css/views/rooms/_TopUnreadMessagesBar.scss @@ -41,7 +41,7 @@ limitations under the License. height: 38px; border-radius: 19px; box-sizing: border-box; - background: $primary-bg-color; + background: $background; border: 1.3px solid $muted-fg-color; cursor: pointer; } @@ -62,7 +62,7 @@ limitations under the License. display: block; width: 18px; height: 18px; - background: $primary-bg-color; + background: $background; border: 1.3px solid $muted-fg-color; border-radius: 10px; margin: 5px auto; diff --git a/res/css/views/rooms/_WhoIsTypingTile.scss b/res/css/views/rooms/_WhoIsTypingTile.scss index 1c0dabbeb5..49655742bb 100644 --- a/res/css/views/rooms/_WhoIsTypingTile.scss +++ b/res/css/views/rooms/_WhoIsTypingTile.scss @@ -36,7 +36,7 @@ limitations under the License. } .mx_WhoIsTypingTile_avatars .mx_BaseAvatar { - border: 1px solid $primary-bg-color; + border: 1px solid $background; border-radius: 40px; } @@ -45,7 +45,7 @@ limitations under the License. display: inline-block; color: #acacac; background-color: #ddd; - border: 1px solid $primary-bg-color; + border: 1px solid $background; border-radius: 40px; width: 24px; height: 24px; diff --git a/res/css/views/spaces/_SpaceCreateMenu.scss b/res/css/views/spaces/_SpaceCreateMenu.scss index 41536bc8b1..e4d5170924 100644 --- a/res/css/views/spaces/_SpaceCreateMenu.scss +++ b/res/css/views/spaces/_SpaceCreateMenu.scss @@ -28,7 +28,7 @@ $spacePanelWidth: 71px; padding: 24px; width: 480px; box-sizing: border-box; - background-color: $primary-bg-color; + background-color: $background; position: relative; > div { diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 8c305b9828..4f9b52ed8f 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -36,7 +36,6 @@ $room-highlight-color: #343a46; // typical text (dark-on-white in light skin) $primary-fg-color: $text-primary-color; -$primary-bg-color: $bg-color; $muted-fg-color: $header-panel-text-primary-color; // additional text colors diff --git a/res/themes/light-custom/css/_custom.scss b/res/themes/light-custom/css/_custom.scss index 6c37351414..d8530a8f59 100644 --- a/res/themes/light-custom/css/_custom.scss +++ b/res/themes/light-custom/css/_custom.scss @@ -38,7 +38,7 @@ $lightbox-border-color: var(--timeline-background-color); $menu-bg-color: var(--timeline-background-color); $avatar-bg-color: var(--timeline-background-color); $message-action-bar-bg-color: var(--timeline-background-color); -$primary-bg-color: var(--timeline-background-color); +$background: var(--timeline-background-color); $togglesw-ball-color: var(--timeline-background-color); $droptarget-bg-color: var(--timeline-background-color-50pct); //still needs alpha at .5 $authpage-modal-bg-color: var(--timeline-background-color-50pct); //still needs alpha at .59 diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index e64fe12d3b..576602c133 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -44,7 +44,6 @@ $quaternary-fg-color: $quaternary-content; $header-panel-bg-color: #f3f8fd; // typical text (dark-on-white in light skin) -$primary-bg-color: $background; $muted-fg-color: #61708b; // Commonly used in headings and relevant alt text // used for dialog box text @@ -59,7 +58,7 @@ $accent-color-50pct: rgba($accent-color, 0.5); $accent-color-darker: #92caad; $accent-color-alt: #238CF5; -$selection-fg-color: $primary-bg-color; +$selection-fg-color: $background; $focus-brightness: 105%; @@ -173,7 +172,7 @@ $rte-group-pill-color: #aaa; $topleftmenu-color: #212121; $roomheader-color: #45474a; -$roomheader-bg-color: $primary-bg-color; +$roomheader-bg-color: $background; $roomheader-addroom-bg-color: rgba(92, 100, 112, 0.2); $roomheader-addroom-fg-color: #5c6470; $groupFilterPanel-button-color: #91A1C0; @@ -318,7 +317,7 @@ $authpage-secondary-color: #61708b; $dark-panel-bg-color: $secondary-accent-color; $panel-gradient: rgba(242, 245, 248, 0), rgba(242, 245, 248, 1); -$message-action-bar-bg-color: $primary-bg-color; +$message-action-bar-bg-color: $background; $message-action-bar-fg-color: $primary-fg-color; $message-action-bar-border-color: #e9edf1; $message-action-bar-hover-border-color: $focus-bg-color; @@ -371,7 +370,7 @@ $composer-shadow-color: rgba(0, 0, 0, 0.04); $eventbubble-self-bg: #F0FBF8; $eventbubble-others-bg: $system; $eventbubble-bg-hover: #FAFBFD; -$eventbubble-avatar-outline: $primary-bg-color; +$eventbubble-avatar-outline: $background; $eventbubble-reply-color: $quaternary-content; // ***** Mixins! ***** From 04bb07cdada5817dc19447f278d0d89e8e430e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:12:10 +0200 Subject: [PATCH 093/619] $base-color -> $background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/themes/dark/css/_dark.scss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 4f9b52ed8f..4e06c7ae75 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -21,7 +21,6 @@ $space-nav: rgba($panel-base, 0.1); // unified palette // try to use these colors when possible $bg-color: $background; -$base-color: $bg-color; $base-text-color: $primary-content; $header-panel-bg-color: #20252B; $header-panel-border-color: #000000; @@ -60,7 +59,7 @@ $info-plinth-fg-color: #888; $preview-bar-bg-color: $header-panel-bg-color; $groupFilterPanel-bg-color: rgba(38, 39, 43, 0.82); -$inverted-bg-color: $base-color; +$inverted-bg-color: $background; // used by AddressSelector $selected-color: $room-highlight-color; @@ -216,7 +215,7 @@ $kbd-border-color: #000000; $tooltip-timeline-bg-color: $groupFilterPanel-bg-color; $tooltip-timeline-fg-color: $primary-content; -$interactive-tooltip-bg-color: $base-color; +$interactive-tooltip-bg-color: $background; $interactive-tooltip-fg-color: $primary-content; $breadcrumb-placeholder-bg-color: #272c35; From eea3b31993532eae2f9bdc4d5505d367ad082db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:14:11 +0200 Subject: [PATCH 094/619] $bg-color -> $background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/themes/dark/css/_dark.scss | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 4e06c7ae75..56adaf7513 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -20,7 +20,6 @@ $space-nav: rgba($panel-base, 0.1); // unified palette // try to use these colors when possible -$bg-color: $background; $base-text-color: $primary-content; $header-panel-bg-color: #20252B; $header-panel-border-color: #000000; @@ -80,7 +79,7 @@ $input-focused-border-color: #238cf5; $input-valid-border-color: $accent-color; $input-invalid-border-color: $warning-color; -$field-focused-label-bg-color: $bg-color; +$field-focused-label-bg-color: $background; $resend-button-divider-color: #b9bec64a; // muted-text with a 4A opacity. @@ -91,11 +90,11 @@ $scrollbar-track-color: transparent; // context menus $menu-border-color: $header-panel-border-color; $menu-bg-color: $header-panel-bg-color; -$menu-box-shadow-color: $bg-color; +$menu-box-shadow-color: $background; $menu-selected-color: $room-highlight-color; $avatar-initial-color: #ffffff; -$avatar-bg-color: $bg-color; +$avatar-bg-color: $background; $h3-color: $primary-fg-color; @@ -117,7 +116,7 @@ $settings-subsection-fg-color: $text-secondary-color; $topleftmenu-color: $text-primary-color; $roomheader-color: $text-primary-color; -$roomheader-bg-color: $bg-color; +$roomheader-bg-color: $background; $roomheader-addroom-bg-color: rgba(92, 100, 112, 0.3); $roomheader-addroom-fg-color: $text-primary-color; $groupFilterPanel-button-color: $header-panel-text-primary-color; @@ -136,7 +135,7 @@ $theme-button-bg-color: #e3e8f0; $dialpad-button-bg-color: $quinary-content; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons -$roomlist-filter-active-bg-color: $bg-color; +$roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(33, 38, 44, 0.90); $roomlist-header-color: $tertiary-fg-color; $roomsublist-divider-color: $primary-fg-color; @@ -246,7 +245,7 @@ $composer-shadow-color: rgba(0, 0, 0, 0.28); $eventbubble-self-bg: #14322E; $eventbubble-others-bg: $event-selected-color; $eventbubble-bg-hover: #1C2026; -$eventbubble-avatar-outline: $bg-color; +$eventbubble-avatar-outline: $background; $eventbubble-reply-color: #C1C6CD; // ***** Mixins! ***** From 79d76d8b493d9cb46d62d57a8d456dde1b458c2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:17:04 +0200 Subject: [PATCH 095/619] $base-text-color -> $primary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/themes/dark/css/_dark.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 56adaf7513..e30979f1ea 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -20,7 +20,6 @@ $space-nav: rgba($panel-base, 0.1); // unified palette // try to use these colors when possible -$base-text-color: $primary-content; $header-panel-bg-color: #20252B; $header-panel-border-color: #000000; $header-panel-text-primary-color: #B9BEC6; @@ -98,7 +97,7 @@ $avatar-bg-color: $background; $h3-color: $primary-fg-color; -$dialog-title-fg-color: $base-text-color; +$dialog-title-fg-color: $primary-content; $dialog-backdrop-color: #000; $dialog-shadow-color: rgba(0, 0, 0, 0.48); $dialog-close-fg-color: #9fa9ba; From 57ce89544589e3610df742d454cdfbf762639137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:18:40 +0200 Subject: [PATCH 096/619] $text-primary-color -> $primary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/themes/dark/css/_dark.scss | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index e30979f1ea..d1fc31da97 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -24,7 +24,6 @@ $header-panel-bg-color: #20252B; $header-panel-border-color: #000000; $header-panel-text-primary-color: #B9BEC6; $header-panel-text-secondary-color: #c8c8cd; -$text-primary-color: $primary-content; $text-secondary-color: #B9BEC6; $quaternary-fg-color: $quaternary-content; $search-bg-color: #181b21; @@ -32,7 +31,7 @@ $search-placeholder-color: #61708b; $room-highlight-color: #343a46; // typical text (dark-on-white in light skin) -$primary-fg-color: $text-primary-color; +$primary-fg-color: $primary-content; $muted-fg-color: $header-panel-text-primary-color; // additional text colors @@ -113,11 +112,11 @@ $settings-profile-button-bg-color: #e7e7e7; $settings-profile-button-fg-color: $settings-profile-overlay-placeholder-fg-color; $settings-subsection-fg-color: $text-secondary-color; -$topleftmenu-color: $text-primary-color; -$roomheader-color: $text-primary-color; +$topleftmenu-color: $primary-content; +$roomheader-color: $primary-content; $roomheader-bg-color: $background; $roomheader-addroom-bg-color: rgba(92, 100, 112, 0.3); -$roomheader-addroom-fg-color: $text-primary-color; +$roomheader-addroom-fg-color: $primary-content; $groupFilterPanel-button-color: $header-panel-text-primary-color; $groupheader-button-color: $header-panel-text-primary-color; $rightpanel-button-color: $header-panel-text-primary-color; @@ -166,12 +165,12 @@ $event-highlight-bg-color: #25271F; $event-timestamp-color: $text-secondary-color; // Tabbed views -$tab-label-fg-color: $text-primary-color; -$tab-label-active-fg-color: $text-primary-color; +$tab-label-fg-color: $primary-content; +$tab-label-active-fg-color: $primary-content; $tab-label-bg-color: transparent; $tab-label-active-bg-color: $accent-color; -$tab-label-icon-bg-color: $text-primary-color; -$tab-label-active-icon-bg-color: $text-primary-color; +$tab-label-icon-bg-color: $primary-content; +$tab-label-active-icon-bg-color: $primary-content; // Buttons $button-primary-fg-color: $primary-content; From 9ecd3b03f1c8eced8a0b0b9ac0ea91932190c0d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:20:30 +0200 Subject: [PATCH 097/619] $quaternary-fg-color -> $quaternary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/audio_messages/_SeekBar.scss | 2 +- res/css/views/dialogs/_InviteDialog.scss | 2 +- res/css/views/voip/_DialPadContextMenu.scss | 2 +- res/css/views/voip/_DialPadModal.scss | 2 +- res/themes/dark/css/_dark.scss | 7 +++---- res/themes/light/css/_light.scss | 3 +-- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/res/css/views/audio_messages/_SeekBar.scss b/res/css/views/audio_messages/_SeekBar.scss index d13fe4ac6a..783a3c50ee 100644 --- a/res/css/views/audio_messages/_SeekBar.scss +++ b/res/css/views/audio_messages/_SeekBar.scss @@ -27,7 +27,7 @@ limitations under the License. width: 100%; height: 1px; - background: $quaternary-fg-color; + background: $quaternary-content; outline: none; // remove blue selection border position: relative; // for before+after pseudo elements later on diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index 9fc4b7a15c..c4ad9c6171 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -352,7 +352,7 @@ limitations under the License. border-right: 0; border-radius: 0; margin-top: 0; - border-color: $quaternary-fg-color; + border-color: $quaternary-content; input { font-size: 18px; diff --git a/res/css/views/voip/_DialPadContextMenu.scss b/res/css/views/voip/_DialPadContextMenu.scss index 527d223ffc..d2014241e9 100644 --- a/res/css/views/voip/_DialPadContextMenu.scss +++ b/res/css/views/voip/_DialPadContextMenu.scss @@ -30,7 +30,7 @@ limitations under the License. margin-right: 20px; /* a separator between the input line and the dial buttons */ - border-bottom: 1px solid $quaternary-fg-color; + border-bottom: 1px solid $quaternary-content; transition: border-bottom 0.25s; } diff --git a/res/css/views/voip/_DialPadModal.scss b/res/css/views/voip/_DialPadModal.scss index b8042f77ae..f378507f90 100644 --- a/res/css/views/voip/_DialPadModal.scss +++ b/res/css/views/voip/_DialPadModal.scss @@ -30,7 +30,7 @@ limitations under the License. margin-right: 40px; /* a separator between the input line and the dial buttons */ - border-bottom: 1px solid $quaternary-fg-color; + border-bottom: 1px solid $quaternary-content; transition: border-bottom 0.25s; } diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index d1fc31da97..416098d151 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -25,7 +25,6 @@ $header-panel-border-color: #000000; $header-panel-text-primary-color: #B9BEC6; $header-panel-text-secondary-color: #c8c8cd; $text-secondary-color: #B9BEC6; -$quaternary-fg-color: $quaternary-content; $search-bg-color: #181b21; $search-placeholder-color: #61708b; $room-highlight-color: #343a46; @@ -224,9 +223,9 @@ $message-body-panel-bg-color: $quinary-content; $message-body-panel-icon-fg-color: $secondary-fg-color; $message-body-panel-icon-bg-color: $system; // "System Dark" -$voice-record-stop-border-color: $quaternary-fg-color; -$voice-record-waveform-incomplete-fg-color: $quaternary-fg-color; -$voice-record-icon-color: $quaternary-fg-color; +$voice-record-stop-border-color: $quaternary-content; +$voice-record-waveform-incomplete-fg-color: $quaternary-content; +$voice-record-icon-color: $quaternary-content; $voice-playback-button-bg-color: $message-body-panel-icon-bg-color; $voice-playback-button-fg-color: $message-body-panel-icon-fg-color; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 576602c133..de87fe9e1f 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -40,7 +40,6 @@ $notice-primary-bg-color: rgba(255, 75, 85, 0.16); $primary-fg-color: #2e2f32; $secondary-fg-color: $secondary-content; $tertiary-fg-color: #8D99A5; -$quaternary-fg-color: $quaternary-content; $header-panel-bg-color: #f3f8fd; // typical text (dark-on-white in light skin) @@ -352,7 +351,7 @@ $voice-record-stop-symbol-color: #ff4b55; $voice-record-live-circle-color: #ff4b55; $voice-record-stop-border-color: $quinary-content; -$voice-record-waveform-incomplete-fg-color: $quaternary-fg-color; +$voice-record-waveform-incomplete-fg-color: $quaternary-content; $voice-record-icon-color: $tertiary-fg-color; $voice-playback-button-bg-color: $message-body-panel-icon-bg-color; $voice-playback-button-fg-color: $message-body-panel-icon-fg-color; From e5fd19c33229895f4aac362a5cb6c9a61fb7fc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:27:12 +0200 Subject: [PATCH 098/619] $primary-fg-color -> $primary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/_common.scss | 16 ++++++++-------- res/css/structures/_ContextualMenu.scss | 2 +- res/css/structures/_CreateRoom.scss | 2 +- res/css/structures/_GroupFilterPanel.scss | 2 +- res/css/structures/_GroupView.scss | 2 +- res/css/structures/_LeftPanelWidget.scss | 2 +- res/css/structures/_MainSplit.scss | 2 +- res/css/structures/_MatrixChat.scss | 2 +- res/css/structures/_NotificationPanel.scss | 4 ++-- res/css/structures/_RoomDirectory.scss | 6 +++--- res/css/structures/_RoomSearch.scss | 2 +- res/css/structures/_RoomStatusBar.scss | 6 +++--- res/css/structures/_SpacePanel.scss | 2 +- res/css/structures/_SpaceRoomDirectory.scss | 6 +++--- res/css/structures/_SpaceRoomView.scss | 8 ++++---- res/css/structures/_ToastContainer.scss | 6 +++--- res/css/structures/_UserMenu.scss | 6 +++--- res/css/structures/_ViewSource.scss | 2 +- res/css/views/audio_messages/_AudioPlayer.scss | 2 +- res/css/views/beta/_BetaCard.scss | 4 ++-- .../context_menus/_IconizedContextMenu.scss | 6 +++--- .../views/context_menus/_MessageContextMenu.scss | 2 +- .../views/dialogs/_AddExistingToSpaceDialog.scss | 8 ++++---- .../dialogs/_CommunityPrototypeInviteDialog.scss | 2 +- .../views/dialogs/_ConfirmUserActionDialog.scss | 2 +- res/css/views/dialogs/_CreateGroupDialog.scss | 2 +- res/css/views/dialogs/_CreateRoomDialog.scss | 2 +- .../dialogs/_CreateSpaceFromCommunityDialog.scss | 8 ++++---- res/css/views/dialogs/_CreateSubspaceDialog.scss | 2 +- res/css/views/dialogs/_ForwardDialog.scss | 2 +- .../dialogs/_GenericFeatureFeedbackDialog.scss | 2 +- res/css/views/dialogs/_HostSignupDialog.scss | 2 +- res/css/views/dialogs/_InviteDialog.scss | 10 +++++----- res/css/views/dialogs/_JoinRuleDropdown.scss | 2 +- res/css/views/dialogs/_LeaveSpaceDialog.scss | 2 +- .../dialogs/_ManageRestrictedJoinRuleDialog.scss | 2 +- .../views/dialogs/_MessageEditHistoryDialog.scss | 2 +- .../dialogs/_RoomSettingsDialogBridges.scss | 4 ++-- res/css/views/dialogs/_ServerOfflineDialog.scss | 4 ++-- res/css/views/dialogs/_SpaceSettingsDialog.scss | 4 ++-- .../security/_AccessSecretStorageDialog.scss | 2 +- .../security/_CreateSecretStorageDialog.scss | 4 ++-- .../dialogs/security/_KeyBackupFailedDialog.scss | 2 +- res/css/views/directory/_NetworkDropdown.scss | 2 +- res/css/views/elements/_AddressTile.scss | 2 +- res/css/views/elements/_Dropdown.scss | 4 ++-- res/css/views/elements/_Field.scss | 6 +++--- res/css/views/elements/_RichText.scss | 2 +- res/css/views/elements/_SSOButtons.scss | 2 +- res/css/views/elements/_Spinner.scss | 2 +- res/css/views/elements/_Tooltip.scss | 2 +- res/css/views/emojipicker/_EmojiPicker.scss | 4 ++-- res/css/views/groups/_GroupRoomList.scss | 2 +- res/css/views/messages/_MessageActionBar.scss | 2 +- res/css/views/messages/_ReactionsRow.scss | 6 +++--- .../views/right_panel/_PinnedMessagesCard.scss | 4 ++-- res/css/views/right_panel/_RoomSummaryCard.scss | 2 +- res/css/views/right_panel/_UserInfo.scss | 2 +- res/css/views/rooms/_AppsDrawer.scss | 4 ++-- res/css/views/rooms/_Autocomplete.scss | 6 +++--- res/css/views/rooms/_EntityTile.scss | 6 +++--- res/css/views/rooms/_EventTile.scss | 4 ++-- res/css/views/rooms/_MemberInfo.scss | 2 +- res/css/views/rooms/_MessageComposer.scss | 2 +- res/css/views/rooms/_NotificationBadge.scss | 2 +- res/css/views/rooms/_ReplyPreview.scss | 2 +- res/css/views/rooms/_ReplyTile.scss | 2 +- res/css/views/rooms/_RoomList.scss | 4 ++-- res/css/views/rooms/_RoomSublist.scss | 2 +- res/css/views/rooms/_RoomTile.scss | 2 +- res/css/views/rooms/_SearchBar.scss | 2 +- res/css/views/settings/_LayoutSwitcher.scss | 2 +- res/css/views/settings/_Notifications.scss | 2 +- res/css/views/settings/tabs/_SettingsTab.scss | 6 +++--- .../tabs/room/_SecurityRoomSettingsTab.scss | 2 +- .../tabs/user/_AppearanceUserSettingsTab.scss | 6 +++--- .../tabs/user/_PreferencesUserSettingsTab.scss | 2 +- res/css/views/voip/_CallViewForRoom.scss | 2 +- res/themes/dark/css/_dark.scss | 5 ++--- res/themes/light-custom/css/_custom.scss | 4 ++-- res/themes/light/css/_light.scss | 5 ++--- 81 files changed, 140 insertions(+), 142 deletions(-) diff --git a/res/css/_common.scss b/res/css/_common.scss index 7439b36218..6c82fdbbdb 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -54,7 +54,7 @@ body { font-family: $font-family; font-size: $font-15px; background-color: $background; - color: $primary-fg-color; + color: $primary-content; border: 0px; margin: 0px; @@ -89,7 +89,7 @@ b { } h2 { - color: $primary-fg-color; + color: $primary-content; font-weight: 400; font-size: $font-18px; margin-top: 16px; @@ -142,12 +142,12 @@ textarea::placeholder { input[type=text], input[type=password], textarea { background-color: transparent; - color: $primary-fg-color; + color: $primary-content; } /* Required by Firefox */ textarea { - color: $primary-fg-color; + color: $primary-content; } input[type=text]:focus, input[type=password]:focus, textarea:focus { @@ -173,7 +173,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { .mx_textinput > input[type=search] { border: none; flex: 1; - color: $primary-fg-color; + color: $primary-content; } :not(.mx_textinput):not(.mx_Field):not(.mx_no_textinput) > input[type=text], @@ -184,7 +184,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { background-color: transparent; color: $input-darker-fg-color; border-radius: 4px; - border: 1px solid rgba($primary-fg-color, .1); + border: 1px solid rgba($primary-content, .1); // these things should probably not be defined globally margin: 9px; } @@ -379,7 +379,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { .mx_Dialog_content { margin: 24px 0 68px; font-size: $font-14px; - color: $primary-fg-color; + color: $primary-content; word-wrap: break-word; } @@ -488,7 +488,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; - color: $primary-fg-color; + color: $primary-content; background-color: $background; } diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss index d7f2cb76e8..9f2b9e24b8 100644 --- a/res/css/structures/_ContextualMenu.scss +++ b/res/css/structures/_ContextualMenu.scss @@ -34,7 +34,7 @@ limitations under the License. border-radius: 8px; box-shadow: 4px 4px 12px 0 $menu-box-shadow-color; background-color: $menu-bg-color; - color: $primary-fg-color; + color: $primary-content; position: absolute; font-size: $font-14px; z-index: 5001; diff --git a/res/css/structures/_CreateRoom.scss b/res/css/structures/_CreateRoom.scss index e859beb20e..3d23ccc4b2 100644 --- a/res/css/structures/_CreateRoom.scss +++ b/res/css/structures/_CreateRoom.scss @@ -18,7 +18,7 @@ limitations under the License. width: 960px; margin-left: auto; margin-right: auto; - color: $primary-fg-color; + color: $primary-content; } .mx_CreateRoom input, diff --git a/res/css/structures/_GroupFilterPanel.scss b/res/css/structures/_GroupFilterPanel.scss index 6ff4fb5c3e..6923ebeb5e 100644 --- a/res/css/structures/_GroupFilterPanel.scss +++ b/res/css/structures/_GroupFilterPanel.scss @@ -81,7 +81,7 @@ limitations under the License. .mx_TagTile_selected_prototype { .mx_TagTile_homeIcon::before { - background-color: $primary-fg-color; // dark-on-light + background-color: $primary-content; // dark-on-light } } diff --git a/res/css/structures/_GroupView.scss b/res/css/structures/_GroupView.scss index fb660f4194..7d20fda09d 100644 --- a/res/css/structures/_GroupView.scss +++ b/res/css/structures/_GroupView.scss @@ -132,7 +132,7 @@ limitations under the License. width: 100%; height: 31px; overflow: hidden; - color: $primary-fg-color; + color: $primary-content; font-weight: bold; font-size: $font-22px; padding-left: 19px; diff --git a/res/css/structures/_LeftPanelWidget.scss b/res/css/structures/_LeftPanelWidget.scss index 6e2d99bb37..93c2898395 100644 --- a/res/css/structures/_LeftPanelWidget.scss +++ b/res/css/structures/_LeftPanelWidget.scss @@ -113,7 +113,7 @@ limitations under the License. &:hover .mx_LeftPanelWidget_resizerHandle { opacity: 0.8; - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_LeftPanelWidget_maximizeButton { diff --git a/res/css/structures/_MainSplit.scss b/res/css/structures/_MainSplit.scss index 8199121420..407a1c270c 100644 --- a/res/css/structures/_MainSplit.scss +++ b/res/css/structures/_MainSplit.scss @@ -38,7 +38,7 @@ limitations under the License. width: 4px !important; border-radius: 4px !important; - background-color: $primary-fg-color; + background-color: $primary-content; opacity: 0.8; } } diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index b660a6446c..63efa92ebc 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -94,7 +94,7 @@ limitations under the License. content: ' '; - background-color: $primary-fg-color; + background-color: $primary-content; opacity: 0.8; } } diff --git a/res/css/structures/_NotificationPanel.scss b/res/css/structures/_NotificationPanel.scss index be2cbaef1d..5ef9be31d2 100644 --- a/res/css/structures/_NotificationPanel.scss +++ b/res/css/structures/_NotificationPanel.scss @@ -70,7 +70,7 @@ limitations under the License. } .mx_NotificationPanel .mx_EventTile_roomName a { - color: $primary-fg-color; + color: $primary-content; } .mx_NotificationPanel .mx_EventTile_avatar { @@ -79,7 +79,7 @@ limitations under the License. .mx_NotificationPanel .mx_EventTile .mx_SenderProfile, .mx_NotificationPanel .mx_EventTile .mx_MessageTimestamp { - color: $primary-fg-color; + color: $primary-content; font-size: $font-12px; display: inline; } diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index ec07500af5..d9284a2aae 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -28,7 +28,7 @@ limitations under the License. .mx_RoomDirectory { margin-bottom: 12px; - color: $primary-fg-color; + color: $primary-content; word-break: break-word; display: flex; flex-direction: column; @@ -71,7 +71,7 @@ limitations under the License. font-weight: $font-semi-bold; font-size: $font-15px; line-height: $font-18px; - color: $primary-fg-color; + color: $primary-content; } > p { @@ -97,7 +97,7 @@ limitations under the License. } .mx_RoomDirectory_table { - color: $primary-fg-color; + color: $primary-content; display: grid; font-size: $font-12px; grid-template-columns: max-content auto max-content max-content max-content; diff --git a/res/css/structures/_RoomSearch.scss b/res/css/structures/_RoomSearch.scss index 7fdafab5a6..ecbf5e3992 100644 --- a/res/css/structures/_RoomSearch.scss +++ b/res/css/structures/_RoomSearch.scss @@ -40,7 +40,7 @@ limitations under the License. .mx_RoomSearch_input { border: none !important; // !important to override default app-wide styles flex: 1 !important; // !important to override default app-wide styles - color: $primary-fg-color !important; // !important to override default app-wide styles + color: $primary-content !important; // !important to override default app-wide styles padding: 0; height: 100%; width: 100%; diff --git a/res/css/structures/_RoomStatusBar.scss b/res/css/structures/_RoomStatusBar.scss index 89cb8c0ba3..bdfbca1afa 100644 --- a/res/css/structures/_RoomStatusBar.scss +++ b/res/css/structures/_RoomStatusBar.scss @@ -171,14 +171,14 @@ limitations under the License. } .mx_RoomStatusBar_connectionLostBar_desc { - color: $primary-fg-color; + color: $primary-content; font-size: $font-13px; opacity: 0.5; padding-bottom: 20px; } .mx_RoomStatusBar_resend_link { - color: $primary-fg-color !important; + color: $primary-content !important; text-decoration: underline !important; cursor: pointer; } @@ -187,7 +187,7 @@ limitations under the License. height: 50px; line-height: $font-50px; - color: $primary-fg-color; + color: $primary-content; opacity: 0.5; overflow-y: hidden; display: block; diff --git a/res/css/structures/_SpacePanel.scss b/res/css/structures/_SpacePanel.scss index 1dea6332f5..399baf10bb 100644 --- a/res/css/structures/_SpacePanel.scss +++ b/res/css/structures/_SpacePanel.scss @@ -235,7 +235,7 @@ $activeBorderColor: $secondary-fg-color; mask-size: contain; mask-repeat: no-repeat; mask-image: url('$(res)/img/element-icons/context-menu.svg'); - background: $primary-fg-color; + background: $primary-content; } } } diff --git a/res/css/structures/_SpaceRoomDirectory.scss b/res/css/structures/_SpaceRoomDirectory.scss index d251e48947..30d0b7991d 100644 --- a/res/css/structures/_SpaceRoomDirectory.scss +++ b/res/css/structures/_SpaceRoomDirectory.scss @@ -22,7 +22,7 @@ limitations under the License. .mx_SpaceRoomDirectory { height: 100%; margin-bottom: 12px; - color: $primary-fg-color; + color: $primary-content; word-break: break-word; display: flex; flex-direction: column; @@ -84,7 +84,7 @@ limitations under the License. align-items: center; font-size: $font-15px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; .mx_AccessibleButton { padding: 4px 12px; @@ -136,7 +136,7 @@ limitations under the License. font-weight: $font-semi-bold; font-size: $font-18px; line-height: $font-22px; - color: $primary-fg-color; + color: $primary-content; } > span { diff --git a/res/css/structures/_SpaceRoomView.scss b/res/css/structures/_SpaceRoomView.scss index 945de01eba..d1758ce757 100644 --- a/res/css/structures/_SpaceRoomView.scss +++ b/res/css/structures/_SpaceRoomView.scss @@ -56,7 +56,7 @@ $SpaceRoomViewInnerWidth: 428px; } > span { - color: $primary-fg-color; + color: $primary-content; } } } @@ -72,7 +72,7 @@ $SpaceRoomViewInnerWidth: 428px; margin: 0; font-size: $font-24px; font-weight: $font-semi-bold; - color: $primary-fg-color; + color: $primary-content; width: max-content; } @@ -154,7 +154,7 @@ $SpaceRoomViewInnerWidth: 428px; font-weight: $font-semi-bold; font-size: $font-14px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; margin-top: 24px; position: relative; padding-left: 24px; @@ -354,7 +354,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceFeedbackPrompt { padding: 7px; // 8px - 1px border - border: 1px solid rgba($primary-fg-color, .1); + border: 1px solid rgba($primary-content, .1); border-radius: 8px; width: max-content; margin: 0 0 -40px auto; // collapse its own height to not push other components down diff --git a/res/css/structures/_ToastContainer.scss b/res/css/structures/_ToastContainer.scss index 5cd938f1ce..8aed21e36c 100644 --- a/res/css/structures/_ToastContainer.scss +++ b/res/css/structures/_ToastContainer.scss @@ -36,8 +36,8 @@ limitations under the License. .mx_Toast_toast { grid-row: 1 / 3; grid-column: 1; - color: $primary-fg-color; background-color: $system; + color: $primary-content; box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.5); border-radius: 8px; overflow: hidden; @@ -63,7 +63,7 @@ limitations under the License. &.mx_Toast_icon_verification::after { mask-image: url("$(res)/img/e2e/normal.svg"); - background-color: $primary-fg-color; + background-color: $primary-content; } &.mx_Toast_icon_verification_warning { @@ -82,7 +82,7 @@ limitations under the License. &.mx_Toast_icon_secure_backup::after { mask-image: url('$(res)/img/feather-customised/secure-backup.svg'); - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_Toast_title, .mx_Toast_body { diff --git a/res/css/structures/_UserMenu.scss b/res/css/structures/_UserMenu.scss index 17e6ad75df..51ec4d23e3 100644 --- a/res/css/structures/_UserMenu.scss +++ b/res/css/structures/_UserMenu.scss @@ -35,7 +35,7 @@ limitations under the License. // we cheat opacity on the theme colour with an after selector here &::after { content: ''; - border-bottom: 1px solid $primary-fg-color; // XXX: Variable abuse + border-bottom: 1px solid $primary-content; // XXX: Variable abuse opacity: 0.2; display: block; padding-top: 8px; @@ -176,7 +176,7 @@ limitations under the License. width: 85%; opacity: 0.2; border: none; - border-bottom: 1px solid $primary-fg-color; // XXX: Variable abuse + border-bottom: 1px solid $primary-content; // XXX: Variable abuse } &.mx_IconizedContextMenu { @@ -292,7 +292,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $primary-fg-color; + background: $primary-content; } } diff --git a/res/css/structures/_ViewSource.scss b/res/css/structures/_ViewSource.scss index 248eab5d88..e3d6135ef3 100644 --- a/res/css/structures/_ViewSource.scss +++ b/res/css/structures/_ViewSource.scss @@ -24,7 +24,7 @@ limitations under the License. .mx_ViewSource_heading { font-size: $font-17px; font-weight: 400; - color: $primary-fg-color; + color: $primary-content; margin-top: 0.7em; } diff --git a/res/css/views/audio_messages/_AudioPlayer.scss b/res/css/views/audio_messages/_AudioPlayer.scss index 77dcebbb9a..3c2551e36a 100644 --- a/res/css/views/audio_messages/_AudioPlayer.scss +++ b/res/css/views/audio_messages/_AudioPlayer.scss @@ -33,7 +33,7 @@ limitations under the License. } .mx_AudioPlayer_mediaName { - color: $primary-fg-color; + color: $primary-content; font-size: $font-15px; line-height: $font-15px; text-overflow: ellipsis; diff --git a/res/css/views/beta/_BetaCard.scss b/res/css/views/beta/_BetaCard.scss index 2af4e79ecd..e7aa34487b 100644 --- a/res/css/views/beta/_BetaCard.scss +++ b/res/css/views/beta/_BetaCard.scss @@ -29,7 +29,7 @@ limitations under the License. font-weight: $font-semi-bold; font-size: $font-18px; line-height: $font-22px; - color: $primary-fg-color; + color: $primary-content; margin: 4px 0 14px; .mx_BetaCard_betaPill { @@ -72,7 +72,7 @@ limitations under the License. margin: 16px 0 0; font-size: $font-15px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; .mx_SettingsFlag_microcopy { margin-top: 4px; diff --git a/res/css/views/context_menus/_IconizedContextMenu.scss b/res/css/views/context_menus/_IconizedContextMenu.scss index ff176eef7e..ca40f18cd4 100644 --- a/res/css/views/context_menus/_IconizedContextMenu.scss +++ b/res/css/views/context_menus/_IconizedContextMenu.scss @@ -36,7 +36,7 @@ limitations under the License. // // Therefore, we just hack in a line and border the thing ourselves &::before { - border-top: 1px solid $primary-fg-color; + border-top: 1px solid $primary-content; opacity: 0.1; content: ''; @@ -63,7 +63,7 @@ limitations under the License. padding-top: 12px; padding-bottom: 12px; text-decoration: none; - color: $primary-fg-color; + color: $primary-content; font-size: $font-15px; line-height: $font-24px; @@ -119,7 +119,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $primary-fg-color; + background: $primary-content; } } diff --git a/res/css/views/context_menus/_MessageContextMenu.scss b/res/css/views/context_menus/_MessageContextMenu.scss index 338841cce4..5af748e28d 100644 --- a/res/css/views/context_menus/_MessageContextMenu.scss +++ b/res/css/views/context_menus/_MessageContextMenu.scss @@ -30,7 +30,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $primary-fg-color; + background: $primary-content; } } diff --git a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss index 42e17c8d98..2758533efc 100644 --- a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss +++ b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss @@ -79,7 +79,7 @@ limitations under the License. margin-top: 8px; font-size: $font-15px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; } > * { @@ -105,7 +105,7 @@ limitations under the License. margin-top: 4px; font-size: $font-12px; line-height: $font-15px; - color: $primary-fg-color; + color: $primary-content; } } @@ -126,7 +126,7 @@ limitations under the License. &::before { content: ''; position: absolute; - background-color: $primary-fg-color; + background-color: $primary-content; mask-repeat: no-repeat; mask-position: center; mask-size: contain; @@ -145,7 +145,7 @@ limitations under the License. .mx_AddExistingToSpaceDialog { width: 480px; - color: $primary-fg-color; + color: $primary-content; display: flex; flex-direction: column; flex-wrap: nowrap; diff --git a/res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss b/res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss index beae03f00f..5d6c817b14 100644 --- a/res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss +++ b/res/css/views/dialogs/_CommunityPrototypeInviteDialog.scss @@ -65,7 +65,7 @@ limitations under the License. .mx_CommunityPrototypeInviteDialog_personName { font-weight: 600; font-size: $font-14px; - color: $primary-fg-color; + color: $primary-content; margin-left: 7px; } diff --git a/res/css/views/dialogs/_ConfirmUserActionDialog.scss b/res/css/views/dialogs/_ConfirmUserActionDialog.scss index c390398020..5ac0f07b14 100644 --- a/res/css/views/dialogs/_ConfirmUserActionDialog.scss +++ b/res/css/views/dialogs/_ConfirmUserActionDialog.scss @@ -35,7 +35,7 @@ limitations under the License. .mx_ConfirmUserActionDialog_reasonField { font-size: $font-14px; - color: $primary-fg-color; + color: $primary-content; background-color: $background; border-radius: 3px; diff --git a/res/css/views/dialogs/_CreateGroupDialog.scss b/res/css/views/dialogs/_CreateGroupDialog.scss index 58045e1d7f..ef9c2b73d4 100644 --- a/res/css/views/dialogs/_CreateGroupDialog.scss +++ b/res/css/views/dialogs/_CreateGroupDialog.scss @@ -29,7 +29,7 @@ limitations under the License. border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; - color: $primary-fg-color; + color: $primary-content; background-color: $background; } diff --git a/res/css/views/dialogs/_CreateRoomDialog.scss b/res/css/views/dialogs/_CreateRoomDialog.scss index 818c93073a..9cfa8ce25a 100644 --- a/res/css/views/dialogs/_CreateRoomDialog.scss +++ b/res/css/views/dialogs/_CreateRoomDialog.scss @@ -55,7 +55,7 @@ limitations under the License. border-radius: 3px; border: 1px solid $input-border-color; padding: 9px; - color: $primary-fg-color; + color: $primary-content; background-color: $background; width: 100%; } diff --git a/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss b/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss index afa722e05e..74a0e9dd8a 100644 --- a/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss +++ b/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss @@ -23,7 +23,7 @@ limitations under the License. .mx_CreateSpaceFromCommunityDialog { width: 480px; - color: $primary-fg-color; + color: $primary-content; display: flex; flex-direction: column; flex-wrap: nowrap; @@ -86,7 +86,7 @@ limitations under the License. margin-top: 8px; font-size: $font-15px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; } > * { @@ -112,7 +112,7 @@ limitations under the License. margin-top: 4px; font-size: $font-12px; line-height: $font-15px; - color: $primary-fg-color; + color: $primary-content; } } @@ -138,7 +138,7 @@ limitations under the License. &::before { content: ''; position: absolute; - background-color: $primary-fg-color; + background-color: $primary-content; mask-repeat: no-repeat; mask-position: center; mask-size: contain; diff --git a/res/css/views/dialogs/_CreateSubspaceDialog.scss b/res/css/views/dialogs/_CreateSubspaceDialog.scss index 1ec4731ae6..9afd5d438f 100644 --- a/res/css/views/dialogs/_CreateSubspaceDialog.scss +++ b/res/css/views/dialogs/_CreateSubspaceDialog.scss @@ -23,7 +23,7 @@ limitations under the License. .mx_CreateSubspaceDialog { width: 480px; - color: $primary-fg-color; + color: $primary-content; display: flex; flex-direction: column; flex-wrap: nowrap; diff --git a/res/css/views/dialogs/_ForwardDialog.scss b/res/css/views/dialogs/_ForwardDialog.scss index e018f60172..898b79725f 100644 --- a/res/css/views/dialogs/_ForwardDialog.scss +++ b/res/css/views/dialogs/_ForwardDialog.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_ForwardDialog { width: 520px; - color: $primary-fg-color; + color: $primary-content; display: flex; flex-direction: column; flex-wrap: nowrap; diff --git a/res/css/views/dialogs/_GenericFeatureFeedbackDialog.scss b/res/css/views/dialogs/_GenericFeatureFeedbackDialog.scss index f83eed9c53..ab7496249d 100644 --- a/res/css/views/dialogs/_GenericFeatureFeedbackDialog.scss +++ b/res/css/views/dialogs/_GenericFeatureFeedbackDialog.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_GenericFeatureFeedbackDialog { .mx_GenericFeatureFeedbackDialog_subheading { - color: $primary-fg-color; + color: $primary-content; font-size: $font-14px; line-height: $font-20px; margin-bottom: 24px; diff --git a/res/css/views/dialogs/_HostSignupDialog.scss b/res/css/views/dialogs/_HostSignupDialog.scss index ac4bc41951..52e68da2af 100644 --- a/res/css/views/dialogs/_HostSignupDialog.scss +++ b/res/css/views/dialogs/_HostSignupDialog.scss @@ -70,7 +70,7 @@ limitations under the License. } .mx_HostSignupDialog_text_dark { - color: $primary-fg-color; + color: $primary-content; } .mx_HostSignupDialog_text_light { diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index c4ad9c6171..ca7f7d74ac 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -56,7 +56,7 @@ limitations under the License. box-sizing: border-box; min-width: 40%; flex: 1 !important; - color: $primary-fg-color !important; + color: $primary-content !important; } } @@ -94,7 +94,7 @@ limitations under the License. } > span { - color: $primary-fg-color; + color: $primary-content; } .mx_InviteDialog_subname { @@ -110,7 +110,7 @@ limitations under the License. font-size: $font-14px; > span { - color: $primary-fg-color; + color: $primary-content; font-weight: 600; } @@ -220,7 +220,7 @@ limitations under the License. .mx_InviteDialog_roomTile_name { font-weight: 600; font-size: $font-14px; - color: $primary-fg-color; + color: $primary-content; margin-left: 7px; } @@ -432,7 +432,7 @@ limitations under the License. font-size: $font-15px; line-height: $font-24px; font-weight: $font-semi-bold; - color: $primary-fg-color; + color: $primary-content; } .mx_InviteDialog_multiInviterError_entry_userId { diff --git a/res/css/views/dialogs/_JoinRuleDropdown.scss b/res/css/views/dialogs/_JoinRuleDropdown.scss index c48a79af3c..7615156c8b 100644 --- a/res/css/views/dialogs/_JoinRuleDropdown.scss +++ b/res/css/views/dialogs/_JoinRuleDropdown.scss @@ -19,7 +19,7 @@ limitations under the License. font-weight: normal; font-family: $font-family; font-size: $font-14px; - color: $primary-fg-color; + color: $primary-content; .mx_Dropdown_input { border: 1px solid $input-border-color; diff --git a/res/css/views/dialogs/_LeaveSpaceDialog.scss b/res/css/views/dialogs/_LeaveSpaceDialog.scss index c982f50e52..6d96a957b3 100644 --- a/res/css/views/dialogs/_LeaveSpaceDialog.scss +++ b/res/css/views/dialogs/_LeaveSpaceDialog.scss @@ -81,7 +81,7 @@ limitations under the License. } > p { - color: $primary-fg-color; + color: $primary-content; } } diff --git a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss b/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss index 91df76675a..d5ef57e096 100644 --- a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss +++ b/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss @@ -23,7 +23,7 @@ limitations under the License. .mx_ManageRestrictedJoinRuleDialog { width: 480px; - color: $primary-fg-color; + color: $primary-content; display: flex; flex-direction: column; flex-wrap: nowrap; diff --git a/res/css/views/dialogs/_MessageEditHistoryDialog.scss b/res/css/views/dialogs/_MessageEditHistoryDialog.scss index e9d777effd..4574344a28 100644 --- a/res/css/views/dialogs/_MessageEditHistoryDialog.scss +++ b/res/css/views/dialogs/_MessageEditHistoryDialog.scss @@ -37,7 +37,7 @@ limitations under the License. list-style-type: none; font-size: $font-14px; padding: 0; - color: $primary-fg-color; + color: $primary-content; span.mx_EditHistoryMessage_deletion, span.mx_EditHistoryMessage_insertion { padding: 0px 2px; diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss index c97a3b69b7..f18b4917cf 100644 --- a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss +++ b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss @@ -72,7 +72,7 @@ limitations under the License. margin-top: 0px; margin-bottom: 0px; font-size: 16pt; - color: $primary-fg-color; + color: $primary-content; } > * { @@ -81,7 +81,7 @@ limitations under the License. } .workspace-channel-details { - color: $primary-fg-color; + color: $primary-content; font-weight: 600; .channel { diff --git a/res/css/views/dialogs/_ServerOfflineDialog.scss b/res/css/views/dialogs/_ServerOfflineDialog.scss index ae4b70beb3..7a1b0bbcab 100644 --- a/res/css/views/dialogs/_ServerOfflineDialog.scss +++ b/res/css/views/dialogs/_ServerOfflineDialog.scss @@ -17,10 +17,10 @@ limitations under the License. .mx_ServerOfflineDialog { .mx_ServerOfflineDialog_content { padding-right: 85px; - color: $primary-fg-color; + color: $primary-content; hr { - border-color: $primary-fg-color; + border-color: $primary-content; opacity: 0.1; border-bottom: none; } diff --git a/res/css/views/dialogs/_SpaceSettingsDialog.scss b/res/css/views/dialogs/_SpaceSettingsDialog.scss index fa074fdbe8..c5e8e891e6 100644 --- a/res/css/views/dialogs/_SpaceSettingsDialog.scss +++ b/res/css/views/dialogs/_SpaceSettingsDialog.scss @@ -15,7 +15,7 @@ limitations under the License. */ .mx_SpaceSettingsDialog { - color: $primary-fg-color; + color: $primary-content; .mx_SpaceSettings_errorText { font-weight: $font-semi-bold; @@ -50,7 +50,7 @@ limitations under the License. .mx_RadioButton_content { font-weight: $font-semi-bold; line-height: $font-18px; - color: $primary-fg-color; + color: $primary-content; } & + span { diff --git a/res/css/views/dialogs/security/_AccessSecretStorageDialog.scss b/res/css/views/dialogs/security/_AccessSecretStorageDialog.scss index ec3bea0ef7..98edbf8ad8 100644 --- a/res/css/views/dialogs/security/_AccessSecretStorageDialog.scss +++ b/res/css/views/dialogs/security/_AccessSecretStorageDialog.scss @@ -44,7 +44,7 @@ limitations under the License. margin-right: 8px; position: relative; top: 5px; - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_AccessSecretStorageDialog_resetBadge::before { diff --git a/res/css/views/dialogs/security/_CreateSecretStorageDialog.scss b/res/css/views/dialogs/security/_CreateSecretStorageDialog.scss index d30803b1f0..b14206ff6d 100644 --- a/res/css/views/dialogs/security/_CreateSecretStorageDialog.scss +++ b/res/css/views/dialogs/security/_CreateSecretStorageDialog.scss @@ -56,7 +56,7 @@ limitations under the License. margin-right: 8px; position: relative; top: 5px; - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_CreateSecretStorageDialog_secureBackupTitle::before { @@ -101,7 +101,7 @@ limitations under the License. margin-right: 8px; position: relative; top: 5px; - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_CreateSecretStorageDialog_optionIcon_securePhrase { diff --git a/res/css/views/dialogs/security/_KeyBackupFailedDialog.scss b/res/css/views/dialogs/security/_KeyBackupFailedDialog.scss index 05ce158413..4a48012672 100644 --- a/res/css/views/dialogs/security/_KeyBackupFailedDialog.scss +++ b/res/css/views/dialogs/security/_KeyBackupFailedDialog.scss @@ -26,7 +26,7 @@ limitations under the License. &::before { mask: url("$(res)/img/e2e/lock-warning-filled.svg"); mask-repeat: no-repeat; - background-color: $primary-fg-color; + background-color: $primary-content; content: ""; position: absolute; top: -6px; diff --git a/res/css/views/directory/_NetworkDropdown.scss b/res/css/views/directory/_NetworkDropdown.scss index eb24cb0107..93cecd8676 100644 --- a/res/css/views/directory/_NetworkDropdown.scss +++ b/res/css/views/directory/_NetworkDropdown.scss @@ -153,7 +153,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-image: url('$(res)/img/feather-customised/chevron-down-thin.svg'); - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_NetworkDropdown_handle_server { diff --git a/res/css/views/elements/_AddressTile.scss b/res/css/views/elements/_AddressTile.scss index c42f52f8f4..90c40842f7 100644 --- a/res/css/views/elements/_AddressTile.scss +++ b/res/css/views/elements/_AddressTile.scss @@ -20,7 +20,7 @@ limitations under the License. background-color: rgba(74, 73, 74, 0.1); border: solid 1px $input-border-color; line-height: $font-26px; - color: $primary-fg-color; + color: $primary-content; font-size: $font-14px; font-weight: normal; margin-right: 4px; diff --git a/res/css/views/elements/_Dropdown.scss b/res/css/views/elements/_Dropdown.scss index 1844f2ccd3..1acac70e42 100644 --- a/res/css/views/elements/_Dropdown.scss +++ b/res/css/views/elements/_Dropdown.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_Dropdown { position: relative; - color: $primary-fg-color; + color: $primary-content; } .mx_Dropdown_disabled { @@ -52,7 +52,7 @@ limitations under the License. padding-right: 9px; mask: url('$(res)/img/feather-customised/dropdown-arrow.svg'); mask-repeat: no-repeat; - background: $primary-fg-color; + background: $primary-content; } .mx_Dropdown_option { diff --git a/res/css/views/elements/_Field.scss b/res/css/views/elements/_Field.scss index afd5eeacdc..d74c985d4c 100644 --- a/res/css/views/elements/_Field.scss +++ b/res/css/views/elements/_Field.scss @@ -46,7 +46,7 @@ limitations under the License. // corners on the field above. border-radius: 4px; padding: 8px 9px; - color: $primary-fg-color; + color: $primary-content; background-color: $background; flex: 1; min-width: 0; @@ -67,7 +67,7 @@ limitations under the License. height: 6px; mask: url('$(res)/img/feather-customised/dropdown-arrow.svg'); mask-repeat: no-repeat; - background-color: $primary-fg-color; + background-color: $primary-content; z-index: 1; pointer-events: none; } @@ -100,7 +100,7 @@ limitations under the License. color 0.25s ease-out 0.1s, top 0.25s ease-out 0.1s, background-color 0.25s ease-out 0.1s; - color: $primary-fg-color; + color: $primary-content; background-color: transparent; font-size: $font-14px; position: absolute; diff --git a/res/css/views/elements/_RichText.scss b/res/css/views/elements/_RichText.scss index d60282695c..b9d845ea7a 100644 --- a/res/css/views/elements/_RichText.scss +++ b/res/css/views/elements/_RichText.scss @@ -43,7 +43,7 @@ a.mx_Pill { /* More specific to override `.markdown-body a` color */ .mx_EventTile_content .markdown-body a.mx_UserPill, .mx_UserPill { - color: $primary-fg-color; + color: $primary-content; background-color: $other-user-pill-bg-color; } diff --git a/res/css/views/elements/_SSOButtons.scss b/res/css/views/elements/_SSOButtons.scss index e02816780f..a98e7b4024 100644 --- a/res/css/views/elements/_SSOButtons.scss +++ b/res/css/views/elements/_SSOButtons.scss @@ -35,7 +35,7 @@ limitations under the License. font-size: $font-14px; font-weight: $font-semi-bold; border: 1px solid $input-border-color; - color: $primary-fg-color; + color: $primary-content; > img { object-fit: contain; diff --git a/res/css/views/elements/_Spinner.scss b/res/css/views/elements/_Spinner.scss index 93d5e2d96c..2df46687af 100644 --- a/res/css/views/elements/_Spinner.scss +++ b/res/css/views/elements/_Spinner.scss @@ -37,7 +37,7 @@ limitations under the License. } .mx_Spinner_icon { - background-color: $primary-fg-color; + background-color: $primary-content; mask: url('$(res)/img/spinner.svg'); mask-size: contain; animation: 1.1s steps(12, end) infinite spin; diff --git a/res/css/views/elements/_Tooltip.scss b/res/css/views/elements/_Tooltip.scss index d90c818f94..6c5a7da55a 100644 --- a/res/css/views/elements/_Tooltip.scss +++ b/res/css/views/elements/_Tooltip.scss @@ -84,7 +84,7 @@ limitations under the License. // These tooltips use an older style with a chevron .mx_Field_tooltip { background-color: $menu-bg-color; - color: $primary-fg-color; + color: $primary-content; border: 1px solid $menu-border-color; text-align: unset; diff --git a/res/css/views/emojipicker/_EmojiPicker.scss b/res/css/views/emojipicker/_EmojiPicker.scss index 05a21b933a..91c68158c9 100644 --- a/res/css/views/emojipicker/_EmojiPicker.scss +++ b/res/css/views/emojipicker/_EmojiPicker.scss @@ -57,7 +57,7 @@ limitations under the License. } .mx_EmojiPicker_anchor::before { - background-color: $primary-fg-color; + background-color: $primary-content; content: ''; display: inline-block; mask-size: 100%; @@ -126,7 +126,7 @@ limitations under the License. .mx_EmojiPicker_search_icon::after { mask: url('$(res)/img/emojipicker/search.svg') no-repeat; mask-size: 100%; - background-color: $primary-fg-color; + background-color: $primary-content; content: ''; display: inline-block; width: 100%; diff --git a/res/css/views/groups/_GroupRoomList.scss b/res/css/views/groups/_GroupRoomList.scss index fefd17849c..2f6559f7c4 100644 --- a/res/css/views/groups/_GroupRoomList.scss +++ b/res/css/views/groups/_GroupRoomList.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_GroupRoomTile { position: relative; - color: $primary-fg-color; + color: $primary-content; cursor: pointer; display: flex; align-items: center; diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index ba2f320729..608be24264 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -81,7 +81,7 @@ limitations under the License. } .mx_MessageActionBar_maskButton:hover::after { - background-color: $primary-fg-color; + background-color: $primary-content; } .mx_MessageActionBar_reactButton::after { diff --git a/res/css/views/messages/_ReactionsRow.scss b/res/css/views/messages/_ReactionsRow.scss index b2bca6dfb3..50cafe3cda 100644 --- a/res/css/views/messages/_ReactionsRow.scss +++ b/res/css/views/messages/_ReactionsRow.scss @@ -16,7 +16,7 @@ limitations under the License. .mx_ReactionsRow { margin: 6px 0; - color: $primary-fg-color; + color: $primary-content; .mx_ReactionsRow_addReactionButton { position: relative; @@ -46,7 +46,7 @@ limitations under the License. &:hover, &.mx_ReactionsRow_addReactionButton_active { &::before { - background-color: $primary-fg-color; + background-color: $primary-content; } } } @@ -68,6 +68,6 @@ limitations under the License. } &:hover { - color: $primary-fg-color; + color: $primary-content; } } diff --git a/res/css/views/right_panel/_PinnedMessagesCard.scss b/res/css/views/right_panel/_PinnedMessagesCard.scss index 933f7f0d2c..d27e639dd6 100644 --- a/res/css/views/right_panel/_PinnedMessagesCard.scss +++ b/res/css/views/right_panel/_PinnedMessagesCard.scss @@ -66,7 +66,7 @@ limitations under the License. z-index: 1; &::after { - background-color: $primary-fg-color; + background-color: $primary-content; } } } @@ -75,7 +75,7 @@ limitations under the License. font-weight: $font-semi-bold; font-size: $font-15px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; margin-top: 24px; margin-bottom: 20px; } diff --git a/res/css/views/right_panel/_RoomSummaryCard.scss b/res/css/views/right_panel/_RoomSummaryCard.scss index dc7804d072..3b2045422d 100644 --- a/res/css/views/right_panel/_RoomSummaryCard.scss +++ b/res/css/views/right_panel/_RoomSummaryCard.scss @@ -128,7 +128,7 @@ limitations under the License. } span { - color: $primary-fg-color; + color: $primary-content; } } diff --git a/res/css/views/right_panel/_UserInfo.scss b/res/css/views/right_panel/_UserInfo.scss index 6632ccddf9..edc82cfdbf 100644 --- a/res/css/views/right_panel/_UserInfo.scss +++ b/res/css/views/right_panel/_UserInfo.scss @@ -55,7 +55,7 @@ limitations under the License. } .mx_UserInfo_separator { - border-bottom: 1px solid rgba($primary-fg-color, .1); + border-bottom: 1px solid rgba($primary-content, .1); } .mx_UserInfo_memberDetailsContainer { diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss index fd80836237..cfcb0c48a2 100644 --- a/res/css/views/rooms/_AppsDrawer.scss +++ b/res/css/views/rooms/_AppsDrawer.scss @@ -64,7 +64,7 @@ $MiniAppTileHeight: 200px; &:hover { .mx_AppsContainer_resizerHandle::after { opacity: 0.8; - background: $primary-fg-color; + background: $primary-content; } .mx_ResizeHandle_horizontal::before { @@ -79,7 +79,7 @@ $MiniAppTileHeight: 200px; content: ''; - background-color: $primary-fg-color; + background-color: $primary-content; opacity: 0.8; } } diff --git a/res/css/views/rooms/_Autocomplete.scss b/res/css/views/rooms/_Autocomplete.scss index 5a9ec4362b..9514faa292 100644 --- a/res/css/views/rooms/_Autocomplete.scss +++ b/res/css/views/rooms/_Autocomplete.scss @@ -24,7 +24,7 @@ user-select: none; cursor: pointer; align-items: center; - color: $primary-fg-color; + color: $primary-content; } .mx_Autocomplete_Completion_block * { @@ -40,7 +40,7 @@ user-select: none; cursor: pointer; align-items: center; - color: $primary-fg-color; + color: $primary-content; } .mx_Autocomplete_Completion_pill > * { @@ -83,7 +83,7 @@ .mx_Autocomplete_provider_name { margin: 12px; - color: $primary-fg-color; + color: $primary-content; font-weight: 400; opacity: 0.4; } diff --git a/res/css/views/rooms/_EntityTile.scss b/res/css/views/rooms/_EntityTile.scss index 27a4e67089..a2ebd6c11b 100644 --- a/res/css/views/rooms/_EntityTile.scss +++ b/res/css/views/rooms/_EntityTile.scss @@ -18,7 +18,7 @@ limitations under the License. .mx_EntityTile { display: flex; align-items: center; - color: $primary-fg-color; + color: $primary-content; cursor: pointer; .mx_E2EIcon { @@ -86,12 +86,12 @@ limitations under the License. .mx_EntityTile_ellipsis .mx_EntityTile_name { font-style: italic; - color: $primary-fg-color; + color: $primary-content; } .mx_EntityTile_invitePlaceholder .mx_EntityTile_name { font-style: italic; - color: $primary-fg-color; + color: $primary-content; } .mx_EntityTile_unavailable .mx_EntityTile_avatar, diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 56cede0895..d9b6f03b4c 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -55,7 +55,7 @@ $hover-select-border: 4px; } .mx_SenderProfile { - color: $primary-fg-color; + color: $primary-content; font-size: $font-14px; display: inline-block; /* anti-zalgo, with overflow hidden */ overflow: hidden; @@ -618,7 +618,7 @@ $hover-select-border: 4px; } .mx_EventTile_keyRequestInfo_text a { - color: $primary-fg-color; + color: $primary-content; text-decoration: underline; cursor: pointer; } diff --git a/res/css/views/rooms/_MemberInfo.scss b/res/css/views/rooms/_MemberInfo.scss index 3f7f83d334..4abd9c7c30 100644 --- a/res/css/views/rooms/_MemberInfo.scss +++ b/res/css/views/rooms/_MemberInfo.scss @@ -111,7 +111,7 @@ limitations under the License. .mx_MemberInfo_field { cursor: pointer; font-size: $font-15px; - color: $primary-fg-color; + color: $primary-content; margin-left: 8px; line-height: $font-23px; } diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index 9dd04d739b..d164fac8f2 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -160,7 +160,7 @@ limitations under the License. resize: none; outline: none; box-shadow: none; - color: $primary-fg-color; + color: $primary-content; background-color: $background; font-size: $font-14px; max-height: 120px; diff --git a/res/css/views/rooms/_NotificationBadge.scss b/res/css/views/rooms/_NotificationBadge.scss index 64b2623238..670e057cfa 100644 --- a/res/css/views/rooms/_NotificationBadge.scss +++ b/res/css/views/rooms/_NotificationBadge.scss @@ -42,7 +42,7 @@ limitations under the License. // These are the 3 background types &.mx_NotificationBadge_dot { - background-color: $primary-fg-color; // increased visibility + background-color: $primary-content; // increased visibility width: 6px; height: 6px; diff --git a/res/css/views/rooms/_ReplyPreview.scss b/res/css/views/rooms/_ReplyPreview.scss index f6dc298563..70a820e412 100644 --- a/res/css/views/rooms/_ReplyPreview.scss +++ b/res/css/views/rooms/_ReplyPreview.scss @@ -28,7 +28,7 @@ limitations under the License. .mx_ReplyPreview_header { margin: 8px; - color: $primary-fg-color; + color: $primary-content; font-weight: 400; opacity: 0.4; } diff --git a/res/css/views/rooms/_ReplyTile.scss b/res/css/views/rooms/_ReplyTile.scss index fd21e5f348..3ef6491ec9 100644 --- a/res/css/views/rooms/_ReplyTile.scss +++ b/res/css/views/rooms/_ReplyTile.scss @@ -42,7 +42,7 @@ limitations under the License. display: flex; flex-direction: column; text-decoration: none; - color: $primary-fg-color; + color: $primary-content; } .mx_RedactedBody { diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss index 8eda25d0c9..5ae6953b50 100644 --- a/res/css/views/rooms/_RoomList.scss +++ b/res/css/views/rooms/_RoomList.scss @@ -43,11 +43,11 @@ limitations under the License. div:first-child { font-weight: $font-semi-bold; line-height: $font-18px; - color: $primary-fg-color; + color: $primary-content; } .mx_AccessibleButton { - color: $primary-fg-color; + color: $primary-content; position: relative; padding: 8px 8px 8px 32px; font-size: inherit; diff --git a/res/css/views/rooms/_RoomSublist.scss b/res/css/views/rooms/_RoomSublist.scss index 146b3edf71..3fffbfd64c 100644 --- a/res/css/views/rooms/_RoomSublist.scss +++ b/res/css/views/rooms/_RoomSublist.scss @@ -233,7 +233,7 @@ limitations under the License. &:hover, &.mx_RoomSublist_hasMenuOpen { .mx_RoomSublist_resizerHandle { opacity: 0.8; - background-color: $primary-fg-color; + background-color: $primary-content; } } } diff --git a/res/css/views/rooms/_RoomTile.scss b/res/css/views/rooms/_RoomTile.scss index b8f4aeb6e7..0c04f27115 100644 --- a/res/css/views/rooms/_RoomTile.scss +++ b/res/css/views/rooms/_RoomTile.scss @@ -124,7 +124,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $primary-fg-color; + background: $primary-content; } } diff --git a/res/css/views/rooms/_SearchBar.scss b/res/css/views/rooms/_SearchBar.scss index d9f730a8b6..e08168a122 100644 --- a/res/css/views/rooms/_SearchBar.scss +++ b/res/css/views/rooms/_SearchBar.scss @@ -47,7 +47,7 @@ limitations under the License. padding: 5px; font-size: $font-15px; cursor: pointer; - color: $primary-fg-color; + color: $primary-content; border-bottom: 2px solid $accent-color; font-weight: 600; } diff --git a/res/css/views/settings/_LayoutSwitcher.scss b/res/css/views/settings/_LayoutSwitcher.scss index 924fe5ae1b..00fb8aba56 100644 --- a/res/css/views/settings/_LayoutSwitcher.scss +++ b/res/css/views/settings/_LayoutSwitcher.scss @@ -21,7 +21,7 @@ limitations under the License. flex-direction: row; gap: 24px; - color: $primary-fg-color; + color: $primary-content; > .mx_LayoutSwitcher_RadioButton { flex-grow: 0; diff --git a/res/css/views/settings/_Notifications.scss b/res/css/views/settings/_Notifications.scss index f93e0a53a8..b3a91dc5db 100644 --- a/res/css/views/settings/_Notifications.scss +++ b/res/css/views/settings/_Notifications.scss @@ -15,7 +15,7 @@ limitations under the License. */ .mx_UserNotifSettings { - color: $primary-fg-color; // override from default settings page styles + color: $primary-content; // override from default settings page styles .mx_UserNotifSettings_pushRulesTable { width: calc(100% + 12px); // +12px to line up center of 'Noisy' column with toggle switches diff --git a/res/css/views/settings/tabs/_SettingsTab.scss b/res/css/views/settings/tabs/_SettingsTab.scss index 3290a998ab..1e4fed6580 100644 --- a/res/css/views/settings/tabs/_SettingsTab.scss +++ b/res/css/views/settings/tabs/_SettingsTab.scss @@ -25,7 +25,7 @@ limitations under the License. .mx_SettingsTab_heading { font-size: $font-20px; font-weight: 600; - color: $primary-fg-color; + color: $primary-content; margin-bottom: 10px; } @@ -37,7 +37,7 @@ limitations under the License. font-size: $font-16px; display: block; font-weight: 600; - color: $primary-fg-color; + color: $primary-content; margin-bottom: 10px; margin-top: 12px; } @@ -72,7 +72,7 @@ limitations under the License. vertical-align: middle; display: inline-block; font-size: $font-14px; - color: $primary-fg-color; + color: $primary-content; max-width: calc(100% - $font-48px); // Force word wrap instead of colliding with the switch box-sizing: border-box; padding-right: 10px; diff --git a/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss b/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss index 2aab201352..202faae078 100644 --- a/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss +++ b/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss @@ -89,7 +89,7 @@ limitations under the License. font-weight: $font-semi-bold; font-size: $font-15px; line-height: $font-24px; - color: $primary-fg-color; + color: $primary-content; display: block; } } diff --git a/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.scss b/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.scss index d8e617a40d..57c6e9b865 100644 --- a/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.scss +++ b/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.scss @@ -24,7 +24,7 @@ limitations under the License. } .mx_AppearanceUserSettingsTab_fontScaling { - color: $primary-fg-color; + color: $primary-content; } .mx_AppearanceUserSettingsTab_fontSlider { @@ -81,7 +81,7 @@ limitations under the License. .mx_AppearanceUserSettingsTab_themeSection { $radio-bg-color: $input-darker-bg-color; - color: $primary-fg-color; + color: $primary-content; > .mx_ThemeSelectors { display: flex; @@ -156,7 +156,7 @@ limitations under the License. } .mx_AppearanceUserSettingsTab_Advanced { - color: $primary-fg-color; + color: $primary-content; > * { margin-bottom: 16px; diff --git a/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.scss b/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.scss index 4cdfa0b40f..d1076205ad 100644 --- a/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.scss +++ b/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.scss @@ -30,7 +30,7 @@ limitations under the License. font-weight: $font-semi-bold; font-size: $font-15px; line-height: $font-18px; - color: $primary-fg-color; + color: $primary-content; margin: 16px 0; .mx_BaseAvatar { diff --git a/res/css/views/voip/_CallViewForRoom.scss b/res/css/views/voip/_CallViewForRoom.scss index 769e00338e..d23fcc18bc 100644 --- a/res/css/views/voip/_CallViewForRoom.scss +++ b/res/css/views/voip/_CallViewForRoom.scss @@ -39,7 +39,7 @@ limitations under the License. width: 100%; max-width: 64px; - background-color: $primary-fg-color; + background-color: $primary-content; } } } diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 416098d151..885e73cee1 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -30,7 +30,6 @@ $search-placeholder-color: #61708b; $room-highlight-color: #343a46; // typical text (dark-on-white in light skin) -$primary-fg-color: $primary-content; $muted-fg-color: $header-panel-text-primary-color; // additional text colors @@ -93,7 +92,7 @@ $menu-selected-color: $room-highlight-color; $avatar-initial-color: #ffffff; $avatar-bg-color: $background; -$h3-color: $primary-fg-color; +$h3-color: $primary-content; $dialog-title-fg-color: $primary-content; $dialog-backdrop-color: #000; @@ -135,7 +134,7 @@ $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filt $roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(33, 38, 44, 0.90); $roomlist-header-color: $tertiary-fg-color; -$roomsublist-divider-color: $primary-fg-color; +$roomsublist-divider-color: $primary-content; $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #3e444c 0%, #3e444c00 100%); $groupFilterPanel-divider-color: $roomlist-header-color; diff --git a/res/themes/light-custom/css/_custom.scss b/res/themes/light-custom/css/_custom.scss index d8530a8f59..f4685fe8fa 100644 --- a/res/themes/light-custom/css/_custom.scss +++ b/res/themes/light-custom/css/_custom.scss @@ -69,7 +69,7 @@ $roomlist-bg-color: var(--roomlist-background-color); // // --timeline-text-color $message-action-bar-fg-color: var(--timeline-text-color); -$primary-fg-color: var(--timeline-text-color); +$primary-content: var(--timeline-text-color); $settings-profile-overlay-placeholder-fg-color: var(--timeline-text-color); $roomtopic-color: var(--timeline-text-color-50pct); $tab-label-fg-color: var(--timeline-text-color); @@ -139,7 +139,7 @@ $event-selected-color: var(--timeline-highlights-color); $event-highlight-bg-color: var(--timeline-highlights-color); // // redirect some variables away from their hardcoded values in the light theme -$settings-grey-fg-color: $primary-fg-color; +$settings-grey-fg-color: $primary-content; // --eventbubble colors $eventbubble-self-bg: var(--eventbubble-self-bg, $eventbubble-self-bg); diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index de87fe9e1f..da9b3cb1ef 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -37,7 +37,6 @@ $accent-color: $accent; $accent-bg-color: rgba(3, 179, 129, 0.16); $notice-primary-color: #ff4b55; $notice-primary-bg-color: rgba(255, 75, 85, 0.16); -$primary-fg-color: #2e2f32; $secondary-fg-color: $secondary-content; $tertiary-fg-color: #8D99A5; $header-panel-bg-color: #f3f8fd; @@ -196,7 +195,7 @@ $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filt $roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(245, 245, 245, 0.90); $roomlist-header-color: $tertiary-fg-color; -$roomsublist-divider-color: $primary-fg-color; +$roomsublist-divider-color: $primary-content; $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #ffffff 0%, #ffffff00 100%); $groupFilterPanel-divider-color: $roomlist-header-color; @@ -317,7 +316,7 @@ $dark-panel-bg-color: $secondary-accent-color; $panel-gradient: rgba(242, 245, 248, 0), rgba(242, 245, 248, 1); $message-action-bar-bg-color: $background; -$message-action-bar-fg-color: $primary-fg-color; +$message-action-bar-fg-color: $primary-content; $message-action-bar-border-color: #e9edf1; $message-action-bar-hover-border-color: $focus-bg-color; From 10bc85724a4a2dd548903c9578dddaa0624fd91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:30:35 +0200 Subject: [PATCH 099/619] $secondary-fg-color -> $secondary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_GroupView.scss | 4 ++-- res/css/structures/_LeftPanel.scss | 4 ++-- res/css/structures/_RoomDirectory.scss | 2 +- res/css/structures/_RoomSearch.scss | 6 ++--- res/css/structures/_SpacePanel.scss | 2 +- res/css/structures/_SpaceRoomDirectory.scss | 10 ++++----- res/css/structures/_SpaceRoomView.scss | 22 +++++++++---------- res/css/structures/_ToastContainer.scss | 2 +- .../views/avatars/_DecoratedRoomAvatar.scss | 2 +- res/css/views/beta/_BetaCard.scss | 6 ++--- .../dialogs/_AddExistingToSpaceDialog.scss | 8 +++---- .../_CreateSpaceFromCommunityDialog.scss | 2 +- .../views/dialogs/_CreateSubspaceDialog.scss | 2 +- res/css/views/dialogs/_ForwardDialog.scss | 2 +- res/css/views/dialogs/_HostSignupDialog.scss | 2 +- res/css/views/dialogs/_InviteDialog.scss | 2 +- res/css/views/dialogs/_JoinRuleDropdown.scss | 2 +- res/css/views/dialogs/_LeaveSpaceDialog.scss | 4 ++-- .../_ManageRestrictedJoinRuleDialog.scss | 6 ++--- .../views/dialogs/_ServerPickerDialog.scss | 4 ++-- .../views/dialogs/_SpaceSettingsDialog.scss | 2 +- res/css/views/elements/_InviteReason.scss | 4 ++-- .../views/elements/_MiniAvatarUploader.scss | 2 +- res/css/views/messages/_CallEvent.scss | 4 ++-- res/css/views/messages/_MessageActionBar.scss | 2 +- res/css/views/right_panel/_BaseCard.scss | 2 +- .../right_panel/_PinnedMessagesCard.scss | 2 +- .../views/right_panel/_RoomSummaryCard.scss | 2 +- res/css/views/right_panel/_WidgetCard.scss | 2 +- res/css/views/rooms/_NewRoomIntro.scss | 2 +- res/css/views/rooms/_PinnedEventTile.scss | 4 ++-- res/css/views/rooms/_RoomList.scss | 2 +- .../views/rooms/_VoiceRecordComposerTile.scss | 2 +- res/css/views/settings/_Notifications.scss | 2 +- res/css/views/settings/tabs/_SettingsTab.scss | 2 +- .../tabs/room/_SecurityRoomSettingsTab.scss | 6 ++--- res/css/views/spaces/_SpaceCreateMenu.scss | 5 +++-- res/css/views/voip/_CallViewHeader.scss | 6 ++--- res/themes/dark/css/_dark.scss | 9 ++++---- res/themes/light/css/_light.scss | 7 +++--- 40 files changed, 81 insertions(+), 82 deletions(-) diff --git a/res/css/structures/_GroupView.scss b/res/css/structures/_GroupView.scss index 7d20fda09d..5e224b1f38 100644 --- a/res/css/structures/_GroupView.scss +++ b/res/css/structures/_GroupView.scss @@ -397,7 +397,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-image: url('$(res)/img/element-icons/room/room-summary.svg'); - background-color: $secondary-fg-color; + background-color: $secondary-content; } .mx_AccessibleButton_kind_link { @@ -422,7 +422,7 @@ limitations under the License. mask-position: center; mask-size: 8px; mask-image: url('$(res)/img/image-view/close.svg'); - background-color: $secondary-fg-color; + background-color: $secondary-content; } } } diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index f254ca3226..738b77684f 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -130,7 +130,7 @@ $roomListCollapsedWidth: 68px; mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $secondary-fg-color; + background: $secondary-content; } } @@ -153,7 +153,7 @@ $roomListCollapsedWidth: 68px; mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $secondary-fg-color; + background: $secondary-content; } &.mx_LeftPanel_exploreButton_space::before { diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index d9284a2aae..fb0f7d10e1 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -78,7 +78,7 @@ limitations under the License. margin: 40px auto 60px; font-size: $font-14px; line-height: $font-20px; - color: $secondary-fg-color; + color: $secondary-content; max-width: 464px; // easier reading } diff --git a/res/css/structures/_RoomSearch.scss b/res/css/structures/_RoomSearch.scss index ecbf5e3992..6d197731d0 100644 --- a/res/css/structures/_RoomSearch.scss +++ b/res/css/structures/_RoomSearch.scss @@ -33,7 +33,7 @@ limitations under the License. height: 16px; mask: url('$(res)/img/element-icons/roomlist/search.svg'); mask-repeat: no-repeat; - background-color: $secondary-fg-color; + background-color: $secondary-content; margin-left: 7px; } @@ -53,7 +53,7 @@ limitations under the License. } &.mx_RoomSearch_hasQuery { - border-color: $secondary-fg-color; + border-color: $secondary-content; } &.mx_RoomSearch_focused { @@ -71,7 +71,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background-color: $secondary-fg-color; + background-color: $secondary-content; margin-right: 8px; } } diff --git a/res/css/structures/_SpacePanel.scss b/res/css/structures/_SpacePanel.scss index 399baf10bb..fef24f2947 100644 --- a/res/css/structures/_SpacePanel.scss +++ b/res/css/structures/_SpacePanel.scss @@ -20,7 +20,7 @@ $gutterSize: 16px; $activeBorderTransparentGap: 1px; $activeBackgroundColor: $roomtile-selected-bg-color; -$activeBorderColor: $secondary-fg-color; +$activeBorderColor: $secondary-content; .mx_SpacePanel { flex: 0 0 auto; diff --git a/res/css/structures/_SpaceRoomDirectory.scss b/res/css/structures/_SpaceRoomDirectory.scss index 30d0b7991d..e1cc579f6d 100644 --- a/res/css/structures/_SpaceRoomDirectory.scss +++ b/res/css/structures/_SpaceRoomDirectory.scss @@ -52,7 +52,7 @@ limitations under the License. > div { font-weight: 400; - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-15px; line-height: $font-24px; } @@ -74,7 +74,7 @@ limitations under the License. > div { font-size: $font-15px; line-height: $font-24px; - color: $secondary-fg-color; + color: $secondary-content; } } @@ -143,7 +143,7 @@ limitations under the License. margin-left: 8px; font-size: $font-15px; line-height: $font-24px; - color: $secondary-fg-color; + color: $secondary-content; } } @@ -235,7 +235,7 @@ limitations under the License. .mx_SpaceRoomDirectory_roomTile_info { font-size: $font-14px; line-height: $font-18px; - color: $secondary-fg-color; + color: $secondary-content; grid-row: 2; grid-column: 1/3; display: -webkit-box; @@ -300,7 +300,7 @@ limitations under the License. font-weight: normal; font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; } } diff --git a/res/css/structures/_SpaceRoomView.scss b/res/css/structures/_SpaceRoomView.scss index d1758ce757..d3a61bd4d1 100644 --- a/res/css/structures/_SpaceRoomView.scss +++ b/res/css/structures/_SpaceRoomView.scss @@ -32,7 +32,7 @@ $SpaceRoomViewInnerWidth: 428px; } > span { - color: $secondary-fg-color; + color: $secondary-content; } &::before { @@ -78,7 +78,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceRoomView_description { font-size: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; margin-top: 12px; margin-bottom: 24px; max-width: $SpaceRoomViewInnerWidth; @@ -176,7 +176,7 @@ $SpaceRoomViewInnerWidth: 428px; mask-position: center; mask-size: contain; mask-image: url('$(res)/img/element-icons/room/room-summary.svg'); - background-color: $secondary-fg-color; + background-color: $secondary-content; } } @@ -207,7 +207,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceRoomView_preview_inviter_mxid { line-height: $font-24px; - color: $secondary-fg-color; + color: $secondary-content; } } } @@ -224,7 +224,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceRoomView_preview_topic { font-size: $font-14px; line-height: $font-22px; - color: $secondary-fg-color; + color: $secondary-content; margin: 20px 0; max-height: 160px; overflow-y: auto; @@ -257,7 +257,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceRoomView_landing_name { margin: 24px 0 16px; font-size: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; > span { display: inline-block; @@ -388,7 +388,7 @@ $SpaceRoomViewInnerWidth: 428px; width: 432px; border-radius: 8px; background-color: $info-plinth-bg-color; - color: $secondary-fg-color; + color: $secondary-content; box-sizing: border-box; > h3 { @@ -415,7 +415,7 @@ $SpaceRoomViewInnerWidth: 428px; position: absolute; top: 14px; left: 14px; - background-color: $secondary-fg-color; + background-color: $secondary-content; } } @@ -438,7 +438,7 @@ $SpaceRoomViewInnerWidth: 428px; } .mx_SpaceRoomView_inviteTeammates_buttons { - color: $secondary-fg-color; + color: $secondary-content; margin-top: 28px; .mx_AccessibleButton { @@ -454,7 +454,7 @@ $SpaceRoomViewInnerWidth: 428px; width: 24px; top: 0; left: 0; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-repeat: no-repeat; mask-position: center; mask-size: contain; @@ -473,7 +473,7 @@ $SpaceRoomViewInnerWidth: 428px; } .mx_SpaceRoomView_info { - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-15px; line-height: $font-24px; margin: 20px 0; diff --git a/res/css/structures/_ToastContainer.scss b/res/css/structures/_ToastContainer.scss index 8aed21e36c..6024df5dc0 100644 --- a/res/css/structures/_ToastContainer.scss +++ b/res/css/structures/_ToastContainer.scss @@ -163,7 +163,7 @@ limitations under the License. } .mx_Toast_detail { - color: $secondary-fg-color; + color: $secondary-content; } .mx_Toast_deviceID { diff --git a/res/css/views/avatars/_DecoratedRoomAvatar.scss b/res/css/views/avatars/_DecoratedRoomAvatar.scss index 257b512579..4922068462 100644 --- a/res/css/views/avatars/_DecoratedRoomAvatar.scss +++ b/res/css/views/avatars/_DecoratedRoomAvatar.scss @@ -47,7 +47,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $secondary-fg-color; + background: $secondary-content; mask-image: url('$(res)/img/globe.svg'); } diff --git a/res/css/views/beta/_BetaCard.scss b/res/css/views/beta/_BetaCard.scss index e7aa34487b..ff6910852c 100644 --- a/res/css/views/beta/_BetaCard.scss +++ b/res/css/views/beta/_BetaCard.scss @@ -40,7 +40,7 @@ limitations under the License. .mx_BetaCard_caption { font-size: $font-15px; line-height: $font-20px; - color: $secondary-fg-color; + color: $secondary-content; margin-bottom: 20px; } @@ -54,7 +54,7 @@ limitations under the License. .mx_BetaCard_disclaimer { font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; margin-top: 20px; } } @@ -78,7 +78,7 @@ limitations under the License. margin-top: 4px; font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; } } } diff --git a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss index 2758533efc..444b29c9bf 100644 --- a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss +++ b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss @@ -44,7 +44,7 @@ limitations under the License. > h3 { margin: 0; - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-12px; font-weight: $font-semi-bold; line-height: $font-15px; @@ -66,7 +66,7 @@ limitations under the License. flex-grow: 1; font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; .mx_ProgressBar { height: 8px; @@ -188,7 +188,7 @@ limitations under the License. padding-left: 0; flex: unset; height: unset; - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-15px; line-height: $font-24px; @@ -221,7 +221,7 @@ limitations under the License. } .mx_SubspaceSelector_onlySpace { - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-15px; line-height: $font-24px; } diff --git a/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss b/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss index 74a0e9dd8a..6ff328f6ab 100644 --- a/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss +++ b/res/css/views/dialogs/_CreateSpaceFromCommunityDialog.scss @@ -73,7 +73,7 @@ limitations under the License. flex-grow: 1; font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; .mx_ProgressBar { height: 8px; diff --git a/res/css/views/dialogs/_CreateSubspaceDialog.scss b/res/css/views/dialogs/_CreateSubspaceDialog.scss index 9afd5d438f..1ed10df35c 100644 --- a/res/css/views/dialogs/_CreateSubspaceDialog.scss +++ b/res/css/views/dialogs/_CreateSubspaceDialog.scss @@ -57,7 +57,7 @@ limitations under the License. flex-grow: 1; font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; > * { vertical-align: middle; diff --git a/res/css/views/dialogs/_ForwardDialog.scss b/res/css/views/dialogs/_ForwardDialog.scss index 898b79725f..da8ce3de5b 100644 --- a/res/css/views/dialogs/_ForwardDialog.scss +++ b/res/css/views/dialogs/_ForwardDialog.scss @@ -25,7 +25,7 @@ limitations under the License. > h3 { margin: 0 0 6px; - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-12px; font-weight: $font-semi-bold; line-height: $font-15px; diff --git a/res/css/views/dialogs/_HostSignupDialog.scss b/res/css/views/dialogs/_HostSignupDialog.scss index 52e68da2af..d8a6652a39 100644 --- a/res/css/views/dialogs/_HostSignupDialog.scss +++ b/res/css/views/dialogs/_HostSignupDialog.scss @@ -74,7 +74,7 @@ limitations under the License. } .mx_HostSignupDialog_text_light { - color: $secondary-fg-color; + color: $secondary-content; } .mx_HostSignup_maximize_button { diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index ca7f7d74ac..55afb4aecb 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -418,7 +418,7 @@ limitations under the License. > h4 { font-size: $font-15px; line-height: $font-24px; - color: $secondary-fg-color; + color: $secondary-content; font-weight: normal; } diff --git a/res/css/views/dialogs/_JoinRuleDropdown.scss b/res/css/views/dialogs/_JoinRuleDropdown.scss index 7615156c8b..91691cf53b 100644 --- a/res/css/views/dialogs/_JoinRuleDropdown.scss +++ b/res/css/views/dialogs/_JoinRuleDropdown.scss @@ -44,7 +44,7 @@ limitations under the License. top: 8px; mask-repeat: no-repeat; mask-position: center; - background-color: $secondary-fg-color; + background-color: $secondary-content; } } } diff --git a/res/css/views/dialogs/_LeaveSpaceDialog.scss b/res/css/views/dialogs/_LeaveSpaceDialog.scss index 6d96a957b3..0d85a87faf 100644 --- a/res/css/views/dialogs/_LeaveSpaceDialog.scss +++ b/res/css/views/dialogs/_LeaveSpaceDialog.scss @@ -63,7 +63,7 @@ limitations under the License. font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; &::before { content: ''; @@ -72,7 +72,7 @@ limitations under the License. top: calc(50% - 8px); // vertical centering height: 16px; width: 16px; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-repeat: no-repeat; mask-size: contain; mask-image: url('$(res)/img/element-icons/room/room-summary.svg'); diff --git a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss b/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss index d5ef57e096..587e7ef9d3 100644 --- a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss +++ b/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss @@ -52,7 +52,7 @@ limitations under the License. > h3 { margin: 0; - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-12px; font-weight: $font-semi-bold; line-height: $font-15px; @@ -113,7 +113,7 @@ limitations under the License. font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; &::before { content: ''; @@ -122,7 +122,7 @@ limitations under the License. top: calc(50% - 8px); // vertical centering height: 16px; width: 16px; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-repeat: no-repeat; mask-size: contain; mask-image: url('$(res)/img/element-icons/room/room-summary.svg'); diff --git a/res/css/views/dialogs/_ServerPickerDialog.scss b/res/css/views/dialogs/_ServerPickerDialog.scss index b01b49d7af..9a05751f91 100644 --- a/res/css/views/dialogs/_ServerPickerDialog.scss +++ b/res/css/views/dialogs/_ServerPickerDialog.scss @@ -22,7 +22,7 @@ limitations under the License. margin-bottom: 0; > p { - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-14px; margin: 16px 0; @@ -38,7 +38,7 @@ limitations under the License. > h4 { font-size: $font-15px; font-weight: $font-semi-bold; - color: $secondary-fg-color; + color: $secondary-content; margin-left: 8px; } diff --git a/res/css/views/dialogs/_SpaceSettingsDialog.scss b/res/css/views/dialogs/_SpaceSettingsDialog.scss index c5e8e891e6..a1fa9d52a8 100644 --- a/res/css/views/dialogs/_SpaceSettingsDialog.scss +++ b/res/css/views/dialogs/_SpaceSettingsDialog.scss @@ -56,7 +56,7 @@ limitations under the License. & + span { font-size: $font-15px; line-height: $font-18px; - color: $secondary-fg-color; + color: $secondary-content; margin-left: 26px; } } diff --git a/res/css/views/elements/_InviteReason.scss b/res/css/views/elements/_InviteReason.scss index 2c2e5687e6..8024ed59a3 100644 --- a/res/css/views/elements/_InviteReason.scss +++ b/res/css/views/elements/_InviteReason.scss @@ -32,12 +32,12 @@ limitations under the License. justify-content: center; align-items: center; cursor: pointer; - color: $secondary-fg-color; + color: $secondary-content; &::before { content: ""; margin-right: 8px; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-image: url('$(res)/img/feather-customised/eye.svg'); display: inline-block; width: 18px; diff --git a/res/css/views/elements/_MiniAvatarUploader.scss b/res/css/views/elements/_MiniAvatarUploader.scss index 7ba86de16f..46ffd9a01c 100644 --- a/res/css/views/elements/_MiniAvatarUploader.scss +++ b/res/css/views/elements/_MiniAvatarUploader.scss @@ -45,7 +45,7 @@ limitations under the License. height: 100%; width: 100%; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-position: center; mask-repeat: no-repeat; mask-image: url('$(res)/img/element-icons/camera.svg'); diff --git a/res/css/views/messages/_CallEvent.scss b/res/css/views/messages/_CallEvent.scss index 0c1b41ca38..d13691fe70 100644 --- a/res/css/views/messages/_CallEvent.scss +++ b/res/css/views/messages/_CallEvent.scss @@ -71,7 +71,7 @@ limitations under the License. .mx_CallEvent_type { font-weight: 400; - color: $secondary-fg-color; + color: $secondary-content; font-size: 1.2rem; line-height: $font-13px; display: flex; @@ -100,7 +100,7 @@ limitations under the License. display: flex; flex-direction: row; align-items: center; - color: $secondary-fg-color; + color: $secondary-content; margin-right: 16px; .mx_CallEvent_content_button { diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index 608be24264..c6983ae631 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -77,7 +77,7 @@ limitations under the License. mask-size: 18px; mask-repeat: no-repeat; mask-position: center; - background-color: $secondary-fg-color; + background-color: $secondary-content; } .mx_MessageActionBar_maskButton:hover::after { diff --git a/res/css/views/right_panel/_BaseCard.scss b/res/css/views/right_panel/_BaseCard.scss index 9a5a59bda8..edb3d1a252 100644 --- a/res/css/views/right_panel/_BaseCard.scss +++ b/res/css/views/right_panel/_BaseCard.scss @@ -145,7 +145,7 @@ limitations under the License. justify-content: space-around; .mx_AccessibleButton_kind_secondary { - color: $secondary-fg-color; + color: $secondary-content; background-color: rgba(141, 151, 165, 0.2); font-weight: $font-semi-bold; font-size: $font-14px; diff --git a/res/css/views/right_panel/_PinnedMessagesCard.scss b/res/css/views/right_panel/_PinnedMessagesCard.scss index d27e639dd6..f3861a3dec 100644 --- a/res/css/views/right_panel/_PinnedMessagesCard.scss +++ b/res/css/views/right_panel/_PinnedMessagesCard.scss @@ -83,7 +83,7 @@ limitations under the License. > span { font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; } } } diff --git a/res/css/views/right_panel/_RoomSummaryCard.scss b/res/css/views/right_panel/_RoomSummaryCard.scss index 3b2045422d..aaaf225d16 100644 --- a/res/css/views/right_panel/_RoomSummaryCard.scss +++ b/res/css/views/right_panel/_RoomSummaryCard.scss @@ -27,7 +27,7 @@ limitations under the License. .mx_RoomSummaryCard_alias { font-size: $font-13px; - color: $secondary-fg-color; + color: $secondary-content; } h2, .mx_RoomSummaryCard_alias { diff --git a/res/css/views/right_panel/_WidgetCard.scss b/res/css/views/right_panel/_WidgetCard.scss index a90e744a5a..824f1fcb2f 100644 --- a/res/css/views/right_panel/_WidgetCard.scss +++ b/res/css/views/right_panel/_WidgetCard.scss @@ -51,7 +51,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-image: url('$(res)/img/element-icons/room/ellipsis.svg'); - background-color: $secondary-fg-color; + background-color: $secondary-content; } } } diff --git a/res/css/views/rooms/_NewRoomIntro.scss b/res/css/views/rooms/_NewRoomIntro.scss index e0cccfa885..f0e471d384 100644 --- a/res/css/views/rooms/_NewRoomIntro.scss +++ b/res/css/views/rooms/_NewRoomIntro.scss @@ -67,6 +67,6 @@ limitations under the License. > p { margin: 0; font-size: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; } } diff --git a/res/css/views/rooms/_PinnedEventTile.scss b/res/css/views/rooms/_PinnedEventTile.scss index 15b3c16faa..07978a8f65 100644 --- a/res/css/views/rooms/_PinnedEventTile.scss +++ b/res/css/views/rooms/_PinnedEventTile.scss @@ -67,7 +67,7 @@ limitations under the License. //left: 0; height: inherit; width: inherit; - background: $secondary-fg-color; + background: $secondary-content; mask-position: center; mask-size: 8px; mask-repeat: no-repeat; @@ -87,7 +87,7 @@ limitations under the License. .mx_PinnedEventTile_timestamp { font-size: inherit; line-height: inherit; - color: $secondary-fg-color; + color: $secondary-content; } .mx_AccessibleButton_kind_link { diff --git a/res/css/views/rooms/_RoomList.scss b/res/css/views/rooms/_RoomList.scss index 5ae6953b50..7d967661a6 100644 --- a/res/css/views/rooms/_RoomList.scss +++ b/res/css/views/rooms/_RoomList.scss @@ -64,7 +64,7 @@ limitations under the License. position: absolute; top: 8px; left: 8px; - background: $secondary-fg-color; + background: $secondary-content; mask-position: center; mask-size: contain; mask-repeat: no-repeat; diff --git a/res/css/views/rooms/_VoiceRecordComposerTile.scss b/res/css/views/rooms/_VoiceRecordComposerTile.scss index 8196d5c67a..69fe292c0a 100644 --- a/res/css/views/rooms/_VoiceRecordComposerTile.scss +++ b/res/css/views/rooms/_VoiceRecordComposerTile.scss @@ -48,7 +48,7 @@ limitations under the License. .mx_VoiceRecordComposerTile_uploadingState { margin-right: 10px; - color: $secondary-fg-color; + color: $secondary-content; } .mx_VoiceRecordComposerTile_failedState { diff --git a/res/css/views/settings/_Notifications.scss b/res/css/views/settings/_Notifications.scss index b3a91dc5db..a0e46c0071 100644 --- a/res/css/views/settings/_Notifications.scss +++ b/res/css/views/settings/_Notifications.scss @@ -34,7 +34,7 @@ limitations under the License. } tr > th:nth-child(n + 2) { - color: $secondary-fg-color; + color: $secondary-content; font-size: $font-12px; vertical-align: middle; width: 66px; diff --git a/res/css/views/settings/tabs/_SettingsTab.scss b/res/css/views/settings/tabs/_SettingsTab.scss index 1e4fed6580..5aa9db7e86 100644 --- a/res/css/views/settings/tabs/_SettingsTab.scss +++ b/res/css/views/settings/tabs/_SettingsTab.scss @@ -82,7 +82,7 @@ limitations under the License. margin-top: 4px; font-size: $font-12px; line-height: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; } .mx_SettingsTab_section .mx_SettingsFlag .mx_ToggleSwitch { diff --git a/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss b/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss index 202faae078..8fd0f14418 100644 --- a/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss +++ b/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.scss @@ -22,7 +22,7 @@ limitations under the License. .mx_SecurityRoomSettingsTab_spacesWithAccess { > h4 { - color: $secondary-fg-color; + color: $secondary-content; font-weight: $font-semi-bold; font-size: $font-12px; line-height: $font-15px; @@ -33,7 +33,7 @@ limitations under the License. font-weight: 500; font-size: $font-14px; line-height: 32px; // matches height of avatar for v-align - color: $secondary-fg-color; + color: $secondary-content; display: inline-block; img.mx_RoomAvatar_isSpaceRoom, @@ -100,7 +100,7 @@ limitations under the License. margin-bottom: 16px; font-size: $font-15px; line-height: $font-24px; - color: $secondary-fg-color; + color: $secondary-content; & + .mx_RadioButton { border-top: 1px solid $menu-border-color; diff --git a/res/css/views/spaces/_SpaceCreateMenu.scss b/res/css/views/spaces/_SpaceCreateMenu.scss index e4d5170924..7615ebe2d3 100644 --- a/res/css/views/spaces/_SpaceCreateMenu.scss +++ b/res/css/views/spaces/_SpaceCreateMenu.scss @@ -40,7 +40,8 @@ $spacePanelWidth: 71px; > p { font-size: $font-15px; - color: $secondary-fg-color; + color: $secondary-content; + margin: 0; } .mx_SpaceFeedbackPrompt { @@ -108,7 +109,7 @@ $spacePanelWidth: 71px; line-height: $font-24px; > span { - color: $secondary-fg-color; + color: $secondary-content; position: relative; font-size: inherit; line-height: inherit; diff --git a/res/css/views/voip/_CallViewHeader.scss b/res/css/views/voip/_CallViewHeader.scss index 014cfce478..0575f4f535 100644 --- a/res/css/views/voip/_CallViewHeader.scss +++ b/res/css/views/voip/_CallViewHeader.scss @@ -53,7 +53,7 @@ limitations under the License. height: 20px; width: 20px; vertical-align: middle; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-repeat: no-repeat; mask-size: contain; mask-position: center; @@ -90,7 +90,7 @@ limitations under the License. .mx_CallViewHeader_callTypeSmall { font-size: 12px; - color: $secondary-fg-color; + color: $secondary-content; line-height: initial; height: 15px; overflow: hidden; @@ -113,7 +113,7 @@ limitations under the License. height: 16px; width: 16px; - background-color: $secondary-fg-color; + background-color: $secondary-content; mask-repeat: no-repeat; mask-size: contain; mask-position: center; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 885e73cee1..3b5ad93358 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -33,7 +33,6 @@ $room-highlight-color: #343a46; $muted-fg-color: $header-panel-text-primary-color; // additional text colors -$secondary-fg-color: $secondary-content; $tertiary-fg-color: $tertiary-content; // used for dialog box text @@ -139,7 +138,7 @@ $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #3e444c 0%, #3e444c00 100%) $groupFilterPanel-divider-color: $roomlist-header-color; -$roomtile-preview-color: $secondary-fg-color; +$roomtile-preview-color: $secondary-content; $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: rgba(141, 151, 165, 0.2); @@ -217,10 +216,10 @@ $breadcrumb-placeholder-bg-color: #272c35; $user-tile-hover-bg-color: $header-panel-bg-color; -$message-body-panel-fg-color: $secondary-fg-color; +$message-body-panel-fg-color: $secondary-content; $message-body-panel-bg-color: $quinary-content; -$message-body-panel-icon-fg-color: $secondary-fg-color; -$message-body-panel-icon-bg-color: $system; // "System Dark" +$message-body-panel-icon-bg-color: $system; +$message-body-panel-icon-fg-color: $secondary-content; $voice-record-stop-border-color: $quaternary-content; $voice-record-waveform-incomplete-fg-color: $quaternary-content; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index da9b3cb1ef..4cb182f99d 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -37,7 +37,6 @@ $accent-color: $accent; $accent-bg-color: rgba(3, 179, 129, 0.16); $notice-primary-color: #ff4b55; $notice-primary-bg-color: rgba(255, 75, 85, 0.16); -$secondary-fg-color: $secondary-content; $tertiary-fg-color: #8D99A5; $header-panel-bg-color: #f3f8fd; @@ -200,7 +199,7 @@ $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #ffffff 0%, #ffffff00 100%) $groupFilterPanel-divider-color: $roomlist-header-color; -$roomtile-preview-color: $secondary-fg-color; +$roomtile-preview-color: $secondary-content; $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: #FFF; @@ -339,10 +338,10 @@ $breadcrumb-placeholder-bg-color: #e8eef5; $user-tile-hover-bg-color: $header-panel-bg-color; -$message-body-panel-fg-color: $secondary-fg-color; +$message-body-panel-fg-color: $secondary-content; $message-body-panel-bg-color: $quinary-content; -$message-body-panel-icon-fg-color: $secondary-fg-color; $message-body-panel-icon-bg-color: $system; +$message-body-panel-icon-fg-color: $secondary-content; // These two don't change between themes. They are the $warning-color, but we don't // want custom themes to affect them by accident. From 8b59bf3d18f7fa46e81d3d0f90b0f1461382a0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:53:54 +0200 Subject: [PATCH 100/619] $tertiary-fg-color -> $tertiary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_NotificationPanel.scss | 2 +- res/css/structures/_RoomSearch.scss | 2 +- res/css/structures/_SpaceRoomDirectory.scss | 4 ++-- res/css/structures/_SpaceRoomView.scss | 6 +++--- res/css/structures/_TabbedView.scss | 2 +- res/css/structures/_UserMenu.scss | 2 +- res/css/views/audio_messages/_SeekBar.scss | 8 ++++---- res/css/views/dialogs/_FeedbackDialog.scss | 2 +- res/css/views/dialogs/_InviteDialog.scss | 2 +- .../views/dialogs/_ManageRestrictedJoinRuleDialog.scss | 2 +- res/css/views/dialogs/_RegistrationEmailPromptDialog.scss | 2 +- res/css/views/elements/_FacePile.scss | 4 ++-- res/css/views/elements/_ServerPicker.scss | 2 +- res/css/views/elements/_TagComposer.scss | 2 +- res/css/views/messages/_CallEvent.scss | 4 ++-- res/css/views/messages/_ReactionsRow.scss | 4 ++-- res/css/views/right_panel/_BaseCard.scss | 2 +- res/css/views/right_panel/_RoomSummaryCard.scss | 2 +- res/css/views/rooms/_EventTile.scss | 2 +- res/css/views/spaces/_SpaceBasicSettings.scss | 2 +- res/css/views/spaces/_SpaceCreateMenu.scss | 2 +- res/css/views/toasts/_IncomingCallToast.scss | 6 +++--- res/themes/dark/css/_dark.scss | 5 +---- res/themes/light/css/_light.scss | 5 ++--- 24 files changed, 36 insertions(+), 40 deletions(-) diff --git a/res/css/structures/_NotificationPanel.scss b/res/css/structures/_NotificationPanel.scss index 5ef9be31d2..68e1dd6a9a 100644 --- a/res/css/structures/_NotificationPanel.scss +++ b/res/css/structures/_NotificationPanel.scss @@ -49,7 +49,7 @@ limitations under the License. bottom: 0; left: 0; right: 0; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; height: 1px; opacity: 0.4; content: ''; diff --git a/res/css/structures/_RoomSearch.scss b/res/css/structures/_RoomSearch.scss index 6d197731d0..80c1a044b3 100644 --- a/res/css/structures/_RoomSearch.scss +++ b/res/css/structures/_RoomSearch.scss @@ -48,7 +48,7 @@ limitations under the License. line-height: $font-16px; &:not(.mx_RoomSearch_inputExpanded)::placeholder { - color: $tertiary-fg-color !important; // !important to override default app-wide styles + color: $tertiary-content !important; // !important to override default app-wide styles } } diff --git a/res/css/structures/_SpaceRoomDirectory.scss b/res/css/structures/_SpaceRoomDirectory.scss index e1cc579f6d..88676d06ac 100644 --- a/res/css/structures/_SpaceRoomDirectory.scss +++ b/res/css/structures/_SpaceRoomDirectory.scss @@ -171,7 +171,7 @@ limitations under the License. width: 16px; mask-repeat: no-repeat; mask-position: center; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-size: 16px; transform: rotate(270deg); mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); @@ -214,7 +214,7 @@ limitations under the License. .mx_InfoTooltip { display: inline; margin-left: 12px; - color: $tertiary-fg-color; + color: $tertiary-content; font-size: $font-12px; line-height: $font-15px; diff --git a/res/css/structures/_SpaceRoomView.scss b/res/css/structures/_SpaceRoomView.scss index d3a61bd4d1..49d6b61f49 100644 --- a/res/css/structures/_SpaceRoomView.scss +++ b/res/css/structures/_SpaceRoomView.scss @@ -45,7 +45,7 @@ $SpaceRoomViewInnerWidth: 428px; mask-position: center; mask-repeat: no-repeat; mask-size: 24px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; } &:hover { @@ -330,7 +330,7 @@ $SpaceRoomViewInnerWidth: 428px; top: 0; height: 24px; width: 24px; - background: $tertiary-fg-color; + background: $tertiary-content; mask-position: center; mask-size: contain; mask-repeat: no-repeat; @@ -492,7 +492,7 @@ $SpaceRoomViewInnerWidth: 428px; left: -2px; mask-position: center; mask-repeat: no-repeat; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; } } diff --git a/res/css/structures/_TabbedView.scss b/res/css/structures/_TabbedView.scss index 833450a25b..e185197f25 100644 --- a/res/css/structures/_TabbedView.scss +++ b/res/css/structures/_TabbedView.scss @@ -80,7 +80,7 @@ limitations under the License. .mx_TabbedView_tabLabel_text { font-size: 15px; - color: $tertiary-fg-color; + color: $tertiary-content; } } diff --git a/res/css/structures/_UserMenu.scss b/res/css/structures/_UserMenu.scss index 51ec4d23e3..6cb9aa0bf3 100644 --- a/res/css/structures/_UserMenu.scss +++ b/res/css/structures/_UserMenu.scss @@ -58,7 +58,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $tertiary-fg-color; + background: $tertiary-content; mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); } } diff --git a/res/css/views/audio_messages/_SeekBar.scss b/res/css/views/audio_messages/_SeekBar.scss index 783a3c50ee..03449d009b 100644 --- a/res/css/views/audio_messages/_SeekBar.scss +++ b/res/css/views/audio_messages/_SeekBar.scss @@ -42,7 +42,7 @@ limitations under the License. width: 8px; height: 8px; border-radius: 8px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; cursor: pointer; } @@ -50,7 +50,7 @@ limitations under the License. width: 8px; height: 8px; border-radius: 8px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; cursor: pointer; // Firefox adds a border on the thumb @@ -63,7 +63,7 @@ limitations under the License. // in firefox, so it's just wasted CPU/GPU time. &::before { // ::before to ensure it ends up under the thumb content: ''; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; // Absolute positioning to ensure it overlaps with the existing bar position: absolute; @@ -81,7 +81,7 @@ limitations under the License. // This is firefox's built-in support for the above, with 100% less hacks. &::-moz-range-progress { - background-color: $tertiary-fg-color; + background-color: $tertiary-content; height: 1px; } diff --git a/res/css/views/dialogs/_FeedbackDialog.scss b/res/css/views/dialogs/_FeedbackDialog.scss index fd225dd882..74733f7220 100644 --- a/res/css/views/dialogs/_FeedbackDialog.scss +++ b/res/css/views/dialogs/_FeedbackDialog.scss @@ -33,7 +33,7 @@ limitations under the License. padding-left: 52px; > p { - color: $tertiary-fg-color; + color: $tertiary-content; } .mx_AccessibleButton_kind_link { diff --git a/res/css/views/dialogs/_InviteDialog.scss b/res/css/views/dialogs/_InviteDialog.scss index 55afb4aecb..3a2918f9ec 100644 --- a/res/css/views/dialogs/_InviteDialog.scss +++ b/res/css/views/dialogs/_InviteDialog.scss @@ -439,7 +439,7 @@ limitations under the License. margin-left: 6px; font-size: $font-12px; line-height: $font-15px; - color: $tertiary-fg-color; + color: $tertiary-content; } } diff --git a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss b/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss index 587e7ef9d3..9a05e7f20a 100644 --- a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss +++ b/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.scss @@ -85,7 +85,7 @@ limitations under the License. margin-top: 8px; font-size: $font-12px; line-height: $font-15px; - color: $tertiary-fg-color; + color: $tertiary-content; } .mx_Checkbox { diff --git a/res/css/views/dialogs/_RegistrationEmailPromptDialog.scss b/res/css/views/dialogs/_RegistrationEmailPromptDialog.scss index 31fc6d7a04..02c89e2e42 100644 --- a/res/css/views/dialogs/_RegistrationEmailPromptDialog.scss +++ b/res/css/views/dialogs/_RegistrationEmailPromptDialog.scss @@ -19,7 +19,7 @@ limitations under the License. .mx_Dialog_content { margin-bottom: 24px; - color: $tertiary-fg-color; + color: $tertiary-content; } .mx_Dialog_primary { diff --git a/res/css/views/elements/_FacePile.scss b/res/css/views/elements/_FacePile.scss index 5f6f473081..875e0e34d5 100644 --- a/res/css/views/elements/_FacePile.scss +++ b/res/css/views/elements/_FacePile.scss @@ -47,7 +47,7 @@ limitations under the License. left: 0; height: inherit; width: inherit; - background: $tertiary-fg-color; + background: $tertiary-content; mask-position: center; mask-size: 20px; mask-repeat: no-repeat; @@ -60,6 +60,6 @@ limitations under the License. margin-left: 12px; font-size: $font-14px; line-height: $font-24px; - color: $tertiary-fg-color; + color: $tertiary-content; } } diff --git a/res/css/views/elements/_ServerPicker.scss b/res/css/views/elements/_ServerPicker.scss index 188eb5d655..d828d7cb88 100644 --- a/res/css/views/elements/_ServerPicker.scss +++ b/res/css/views/elements/_ServerPicker.scss @@ -74,7 +74,7 @@ limitations under the License. .mx_ServerPicker_desc { margin-top: -12px; - color: $tertiary-fg-color; + color: $tertiary-content; grid-column: 1 / 2; grid-row: 3; margin-bottom: 16px; diff --git a/res/css/views/elements/_TagComposer.scss b/res/css/views/elements/_TagComposer.scss index 2ffd601765..2712ad8e90 100644 --- a/res/css/views/elements/_TagComposer.scss +++ b/res/css/views/elements/_TagComposer.scss @@ -50,7 +50,7 @@ limitations under the License. &::before { content: ''; border-radius: 20px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; opacity: 0.15; position: absolute; top: 0; diff --git a/res/css/views/messages/_CallEvent.scss b/res/css/views/messages/_CallEvent.scss index d13691fe70..f641cd44a5 100644 --- a/res/css/views/messages/_CallEvent.scss +++ b/res/css/views/messages/_CallEvent.scss @@ -87,7 +87,7 @@ limitations under the License. position: absolute; height: 13px; width: 13px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-repeat: no-repeat; mask-size: contain; } @@ -144,7 +144,7 @@ limitations under the License. height: 16px; width: 16px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-repeat: no-repeat; mask-size: contain; mask-position: center; diff --git a/res/css/views/messages/_ReactionsRow.scss b/res/css/views/messages/_ReactionsRow.scss index 50cafe3cda..1b0b847932 100644 --- a/res/css/views/messages/_ReactionsRow.scss +++ b/res/css/views/messages/_ReactionsRow.scss @@ -36,7 +36,7 @@ limitations under the License. mask-size: 16px; mask-repeat: no-repeat; mask-position: center; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-image: url('$(res)/img/element-icons/room/message-bar/emoji.svg'); } @@ -64,7 +64,7 @@ limitations under the License. vertical-align: middle; &:link, &:visited { - color: $tertiary-fg-color; + color: $tertiary-content; } &:hover { diff --git a/res/css/views/right_panel/_BaseCard.scss b/res/css/views/right_panel/_BaseCard.scss index edb3d1a252..8c1a55fe05 100644 --- a/res/css/views/right_panel/_BaseCard.scss +++ b/res/css/views/right_panel/_BaseCard.scss @@ -93,7 +93,7 @@ limitations under the License. } > h1 { - color: $tertiary-fg-color; + color: $tertiary-content; font-size: $font-12px; font-weight: 500; } diff --git a/res/css/views/right_panel/_RoomSummaryCard.scss b/res/css/views/right_panel/_RoomSummaryCard.scss index aaaf225d16..fcb83dfd7a 100644 --- a/res/css/views/right_panel/_RoomSummaryCard.scss +++ b/res/css/views/right_panel/_RoomSummaryCard.scss @@ -115,7 +115,7 @@ limitations under the License. // as we will be applying it in its children padding: 0; height: auto; - color: $tertiary-fg-color; + color: $tertiary-content; .mx_RoomSummaryCard_icon_app { padding: 10px 48px 10px 12px; // based on typical mx_RoomSummaryCard_Button padding diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index d9b6f03b4c..dcfb308ac4 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -161,7 +161,7 @@ $hover-select-border: 4px; // up with the other read receipts &::before { - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-repeat: no-repeat; mask-position: center; mask-size: 14px; diff --git a/res/css/views/spaces/_SpaceBasicSettings.scss b/res/css/views/spaces/_SpaceBasicSettings.scss index c73e0715dd..bff574ded3 100644 --- a/res/css/views/spaces/_SpaceBasicSettings.scss +++ b/res/css/views/spaces/_SpaceBasicSettings.scss @@ -27,7 +27,7 @@ limitations under the License. position: relative; height: 80px; width: 80px; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; border-radius: 16px; } diff --git a/res/css/views/spaces/_SpaceCreateMenu.scss b/res/css/views/spaces/_SpaceCreateMenu.scss index 7615ebe2d3..dfb1a2d9b4 100644 --- a/res/css/views/spaces/_SpaceCreateMenu.scss +++ b/res/css/views/spaces/_SpaceCreateMenu.scss @@ -77,7 +77,7 @@ $spacePanelWidth: 71px; width: 28px; top: 0; left: 0; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; transform: rotate(90deg); mask-repeat: no-repeat; mask-position: 2px 3px; diff --git a/res/css/views/toasts/_IncomingCallToast.scss b/res/css/views/toasts/_IncomingCallToast.scss index 975628f948..98e9121f3a 100644 --- a/res/css/views/toasts/_IncomingCallToast.scss +++ b/res/css/views/toasts/_IncomingCallToast.scss @@ -36,7 +36,7 @@ limitations under the License. .mx_CallEvent_type { font-size: $font-12px; line-height: $font-15px; - color: $tertiary-fg-color; + color: $tertiary-content; margin-top: 4px; margin-bottom: 6px; @@ -55,7 +55,7 @@ limitations under the License. position: absolute; height: inherit; width: inherit; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-repeat: no-repeat; mask-size: contain; } @@ -132,7 +132,7 @@ limitations under the License. height: inherit; width: inherit; - background-color: $tertiary-fg-color; + background-color: $tertiary-content; mask-repeat: no-repeat; mask-size: contain; mask-position: center; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 3b5ad93358..b8bcdc2572 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -32,9 +32,6 @@ $room-highlight-color: #343a46; // typical text (dark-on-white in light skin) $muted-fg-color: $header-panel-text-primary-color; -// additional text colors -$tertiary-fg-color: $tertiary-content; - // used for dialog box text $light-fg-color: $header-panel-text-secondary-color; @@ -132,7 +129,7 @@ $dialpad-button-bg-color: $quinary-content; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(33, 38, 44, 0.90); -$roomlist-header-color: $tertiary-fg-color; +$roomlist-header-color: $tertiary-content; $roomsublist-divider-color: $primary-content; $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #3e444c 0%, #3e444c00 100%); diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 4cb182f99d..bce0195743 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -37,7 +37,6 @@ $accent-color: $accent; $accent-bg-color: rgba(3, 179, 129, 0.16); $notice-primary-color: #ff4b55; $notice-primary-bg-color: rgba(255, 75, 85, 0.16); -$tertiary-fg-color: #8D99A5; $header-panel-bg-color: #f3f8fd; // typical text (dark-on-white in light skin) @@ -193,7 +192,7 @@ $dialpad-button-bg-color: $quinary-content; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(245, 245, 245, 0.90); -$roomlist-header-color: $tertiary-fg-color; +$roomlist-header-color: $tertiary-content; $roomsublist-divider-color: $primary-content; $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #ffffff 0%, #ffffff00 100%); @@ -350,7 +349,7 @@ $voice-record-live-circle-color: #ff4b55; $voice-record-stop-border-color: $quinary-content; $voice-record-waveform-incomplete-fg-color: $quaternary-content; -$voice-record-icon-color: $tertiary-fg-color; +$voice-record-icon-color: $tertiary-content; $voice-playback-button-bg-color: $message-body-panel-icon-bg-color; $voice-playback-button-fg-color: $message-body-panel-icon-fg-color; From a3a6f73049d23822745ed2f06786f0fb571604d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 11:58:59 +0200 Subject: [PATCH 101/619] $avatar-bg-color -> $background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/avatars/_BaseAvatar.scss | 2 +- res/css/views/rooms/_BasicMessageComposer.scss | 2 +- res/themes/dark/css/_dark.scss | 1 - res/themes/light-custom/css/_custom.scss | 2 +- res/themes/light/css/_light.scss | 1 - 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/res/css/views/avatars/_BaseAvatar.scss b/res/css/views/avatars/_BaseAvatar.scss index cbddd97e18..486958887e 100644 --- a/res/css/views/avatars/_BaseAvatar.scss +++ b/res/css/views/avatars/_BaseAvatar.scss @@ -43,5 +43,5 @@ limitations under the License. object-fit: cover; border-radius: 125px; vertical-align: top; - background-color: $avatar-bg-color; + background-color: $background; } diff --git a/res/css/views/rooms/_BasicMessageComposer.scss b/res/css/views/rooms/_BasicMessageComposer.scss index 752d3b0a54..a09078aa6d 100644 --- a/res/css/views/rooms/_BasicMessageComposer.scss +++ b/res/css/views/rooms/_BasicMessageComposer.scss @@ -54,7 +54,7 @@ limitations under the License. width: $font-16px; height: $font-16px; margin-right: 0.24rem; - background: var(--avatar-background), $avatar-bg-color; + background: var(--avatar-background), $background; color: $avatar-initial-color; background-repeat: no-repeat; background-size: $font-16px; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index b8bcdc2572..554c3b9e80 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -86,7 +86,6 @@ $menu-box-shadow-color: $background; $menu-selected-color: $room-highlight-color; $avatar-initial-color: #ffffff; -$avatar-bg-color: $background; $h3-color: $primary-content; diff --git a/res/themes/light-custom/css/_custom.scss b/res/themes/light-custom/css/_custom.scss index f4685fe8fa..59c2fe9b2e 100644 --- a/res/themes/light-custom/css/_custom.scss +++ b/res/themes/light-custom/css/_custom.scss @@ -36,7 +36,7 @@ $button-secondary-bg-color: var(--timeline-background-color); $field-focused-label-bg-color: var(--timeline-background-color); $lightbox-border-color: var(--timeline-background-color); $menu-bg-color: var(--timeline-background-color); -$avatar-bg-color: var(--timeline-background-color); +$background: var(--timeline-background-color); $message-action-bar-bg-color: var(--timeline-background-color); $background: var(--timeline-background-color); $togglesw-ball-color: var(--timeline-background-color); diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index bce0195743..e9ed8eef35 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -124,7 +124,6 @@ $menu-box-shadow-color: rgba(118, 131, 156, 0.6); $menu-selected-color: #f5f8fa; $avatar-initial-color: $background; -$avatar-bg-color: $background; $h3-color: #3d3b39; From 0faedebb9245e7a0f6ba1c4aff433e5a81ddec4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 12:01:55 +0200 Subject: [PATCH 102/619] $roomheader-bg-color -> $background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_RoomHeader.scss | 2 +- res/themes/dark/css/_dark.scss | 1 - res/themes/light/css/_light.scss | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/res/css/views/rooms/_RoomHeader.scss b/res/css/views/rooms/_RoomHeader.scss index 0b73dcfcf2..81dfa90c96 100644 --- a/res/css/views/rooms/_RoomHeader.scss +++ b/res/css/views/rooms/_RoomHeader.scss @@ -17,7 +17,7 @@ limitations under the License. .mx_RoomHeader { flex: 0 0 50px; border-bottom: 1px solid $primary-hairline-color; - background-color: $roomheader-bg-color; + background-color: $background; .mx_RoomHeader_e2eIcon { height: 12px; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 554c3b9e80..23485903be 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -107,7 +107,6 @@ $settings-subsection-fg-color: $text-secondary-color; $topleftmenu-color: $primary-content; $roomheader-color: $primary-content; -$roomheader-bg-color: $background; $roomheader-addroom-bg-color: rgba(92, 100, 112, 0.3); $roomheader-addroom-fg-color: $primary-content; $groupFilterPanel-button-color: $header-panel-text-primary-color; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index e9ed8eef35..fc985a4b99 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -167,7 +167,6 @@ $rte-group-pill-color: #aaa; $topleftmenu-color: #212121; $roomheader-color: #45474a; -$roomheader-bg-color: $background; $roomheader-addroom-bg-color: rgba(92, 100, 112, 0.2); $roomheader-addroom-fg-color: #5c6470; $groupFilterPanel-button-color: #91A1C0; From 8e610e594752c17802810b4e6e45d379b3510de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 12:03:48 +0200 Subject: [PATCH 103/619] $dialpad-button-bg-color -> $quinary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/voip/_DialPad.scss | 2 +- res/themes/dark/css/_dark.scss | 1 - res/themes/light/css/_light.scss | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/res/css/views/voip/_DialPad.scss b/res/css/views/voip/_DialPad.scss index eefd2e9ba5..288f1f5d31 100644 --- a/res/css/views/voip/_DialPad.scss +++ b/res/css/views/voip/_DialPad.scss @@ -33,7 +33,7 @@ limitations under the License. width: 40px; height: 40px; - background-color: $dialpad-button-bg-color; + background-color: $quinary-content; border-radius: 40px; font-size: 18px; font-weight: 600; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 23485903be..a5d0775a6b 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -122,7 +122,6 @@ $composer-e2e-icon-color: $header-panel-text-primary-color; // ******************** $theme-button-bg-color: #e3e8f0; -$dialpad-button-bg-color: $quinary-content; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-filter-active-bg-color: $background; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index fc985a4b99..b8aefd6a4b 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -184,8 +184,6 @@ $voipcall-plinth-color: $system; // ******************** $theme-button-bg-color: $quinary-content; -$dialpad-button-bg-color: $quinary-content; - $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-filter-active-bg-color: $background; From 4604d817c4dad6a407804417ae22500704e44b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 12:06:07 +0200 Subject: [PATCH 104/619] $roomlist-filter-active-bg-color -> $background MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_RoomSearch.scss | 2 +- res/themes/dark/css/_dark.scss | 1 - res/themes/light/css/_light.scss | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/res/css/structures/_RoomSearch.scss b/res/css/structures/_RoomSearch.scss index 80c1a044b3..bbd60a5ff3 100644 --- a/res/css/structures/_RoomSearch.scss +++ b/res/css/structures/_RoomSearch.scss @@ -62,7 +62,7 @@ limitations under the License. } &.mx_RoomSearch_focused, &.mx_RoomSearch_hasQuery { - background-color: $roomlist-filter-active-bg-color; + background-color: $background; .mx_RoomSearch_clearButton { width: 16px; diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index a5d0775a6b..d88910d9d1 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -124,7 +124,6 @@ $composer-e2e-icon-color: $header-panel-text-primary-color; $theme-button-bg-color: #e3e8f0; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons -$roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(33, 38, 44, 0.90); $roomlist-header-color: $tertiary-content; $roomsublist-divider-color: $primary-content; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index b8aefd6a4b..f08afadf2a 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -186,7 +186,6 @@ $voipcall-plinth-color: $system; $theme-button-bg-color: $quinary-content; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons -$roomlist-filter-active-bg-color: $background; $roomlist-bg-color: rgba(245, 245, 245, 0.90); $roomlist-header-color: $tertiary-content; $roomsublist-divider-color: $primary-content; From 25a3a8ddfd2a5647100899b3dbb681265b3ed25a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 12:08:17 +0200 Subject: [PATCH 105/619] $roomlist-header-color -> $tertiary-content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_LeftPanelWidget.scss | 4 ++-- res/css/structures/_SpacePanel.scss | 4 ++-- res/css/views/rooms/_RoomSublist.scss | 6 +++--- res/themes/dark/css/_dark.scss | 5 ++--- res/themes/light-custom/css/_custom.scss | 2 +- res/themes/light/css/_light.scss | 5 ++--- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/res/css/structures/_LeftPanelWidget.scss b/res/css/structures/_LeftPanelWidget.scss index 93c2898395..bb04b85624 100644 --- a/res/css/structures/_LeftPanelWidget.scss +++ b/res/css/structures/_LeftPanelWidget.scss @@ -24,7 +24,7 @@ limitations under the License. align-items: center; height: 24px; - color: $roomlist-header-color; + color: $tertiary-content; margin-top: 4px; .mx_LeftPanelWidget_stickable { @@ -62,7 +62,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background-color: $roomlist-header-color; + background-color: $tertiary-content; mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); } diff --git a/res/css/structures/_SpacePanel.scss b/res/css/structures/_SpacePanel.scss index fef24f2947..977c1c3670 100644 --- a/res/css/structures/_SpacePanel.scss +++ b/res/css/structures/_SpacePanel.scss @@ -46,7 +46,7 @@ $activeBorderColor: $secondary-content; mask-repeat: no-repeat; margin-left: $gutterSize; margin-bottom: 12px; - background-color: $roomlist-header-color; + background-color: $tertiary-content; mask-image: url('$(res)/img/element-icons/expand-space-panel.svg'); &.expanded { @@ -158,7 +158,7 @@ $activeBorderColor: $secondary-content; mask-position: center; mask-size: 20px; mask-repeat: no-repeat; - background-color: $roomlist-header-color; + background-color: $tertiary-content; mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); } diff --git a/res/css/views/rooms/_RoomSublist.scss b/res/css/views/rooms/_RoomSublist.scss index 3fffbfd64c..3f9daac25c 100644 --- a/res/css/views/rooms/_RoomSublist.scss +++ b/res/css/views/rooms/_RoomSublist.scss @@ -44,7 +44,7 @@ limitations under the License. // Allow the container to collapse on itself if its children // are not in the normal document flow max-height: 24px; - color: $roomlist-header-color; + color: $tertiary-content; .mx_RoomSublist_stickable { flex: 1; @@ -161,7 +161,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background-color: $roomlist-header-color; + background-color: $tertiary-content; mask-image: url('$(res)/img/feather-customised/chevron-down.svg'); } @@ -262,7 +262,7 @@ limitations under the License. mask-position: center; mask-size: contain; mask-repeat: no-repeat; - background: $roomlist-header-color; + background: $tertiary-content; left: -1px; // adjust for image position } diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index d88910d9d1..84c5ab4618 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -125,11 +125,10 @@ $theme-button-bg-color: #e3e8f0; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-bg-color: rgba(33, 38, 44, 0.90); -$roomlist-header-color: $tertiary-content; $roomsublist-divider-color: $primary-content; $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #3e444c 0%, #3e444c00 100%); -$groupFilterPanel-divider-color: $roomlist-header-color; +$groupFilterPanel-divider-color: $tertiary-content; $roomtile-preview-color: $secondary-content; $roomtile-default-badge-bg-color: #61708b; @@ -137,7 +136,7 @@ $roomtile-selected-bg-color: rgba(141, 151, 165, 0.2); // ******************** -$notice-secondary-color: $roomlist-header-color; +$notice-secondary-color: $tertiary-content; $panel-divider-color: transparent; diff --git a/res/themes/light-custom/css/_custom.scss b/res/themes/light-custom/css/_custom.scss index 59c2fe9b2e..cdf3a32d38 100644 --- a/res/themes/light-custom/css/_custom.scss +++ b/res/themes/light-custom/css/_custom.scss @@ -84,7 +84,7 @@ $authpage-lang-color: var(--timeline-text-color); $roomheader-color: var(--timeline-text-color); // --roomlist-text-secondary-color $roomtile-preview-color: var(--roomlist-text-secondary-color); -$roomlist-header-color: var(--roomlist-text-secondary-color); +$tertiary-content: var(--roomlist-text-secondary-color); $roomtile-default-badge-bg-color: var(--roomlist-text-secondary-color); // diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index f08afadf2a..08b3b57677 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -187,11 +187,10 @@ $theme-button-bg-color: $quinary-content; $roomlist-button-bg-color: rgba(141, 151, 165, 0.2); // Buttons include the filter box, explore button, and sublist buttons $roomlist-bg-color: rgba(245, 245, 245, 0.90); -$roomlist-header-color: $tertiary-content; $roomsublist-divider-color: $primary-content; $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #ffffff 0%, #ffffff00 100%); -$groupFilterPanel-divider-color: $roomlist-header-color; +$groupFilterPanel-divider-color: $tertiary-content; $roomtile-preview-color: $secondary-content; $roomtile-default-badge-bg-color: #61708b; @@ -212,7 +211,7 @@ $username-variant6-color: #2dc2c5; $username-variant7-color: #5c56f5; $username-variant8-color: #74d12c; -$notice-secondary-color: $roomlist-header-color; +$notice-secondary-color: $tertiary-content; $panel-divider-color: transparent; From c34dedb57b21f19498d98cdee4b7923225fa2d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 12 Aug 2021 12:35:48 +0200 Subject: [PATCH 106/619] Fix legacy themes backports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/themes/legacy-dark/css/_legacy-dark.scss | 8 ++++++-- res/themes/legacy-light/css/_legacy-light.scss | 9 ++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/res/themes/legacy-dark/css/_legacy-dark.scss b/res/themes/legacy-dark/css/_legacy-dark.scss index 3e3412c6c1..d5bc5e6dd7 100644 --- a/res/themes/legacy-dark/css/_legacy-dark.scss +++ b/res/themes/legacy-dark/css/_legacy-dark.scss @@ -24,7 +24,12 @@ $primary-bg-color: $bg-color; $muted-fg-color: $header-panel-text-primary-color; // Legacy theme backports -$quaternary-fg-color: #6F7882; +$primary-content: $primary-fg-color; +$secondary-content: $secondary-fg-color; +$tertiary-content: $tertiary-fg-color; +$quaternary-content: #6F7882; +$quinary-content: $quaternary-content; +$background: $primary-bg-color; // used for dialog box text $light-fg-color: $header-panel-text-secondary-color; @@ -117,7 +122,6 @@ $composer-e2e-icon-color: $header-panel-text-primary-color; // ******************** $theme-button-bg-color: #e3e8f0; -$dialpad-button-bg-color: #6F7882; $roomlist-button-bg-color: #1A1D23; // Buttons include the filter box, explore button, and sublist buttons diff --git a/res/themes/legacy-light/css/_legacy-light.scss b/res/themes/legacy-light/css/_legacy-light.scss index 3f722bcb30..47247e5e23 100644 --- a/res/themes/legacy-light/css/_legacy-light.scss +++ b/res/themes/legacy-light/css/_legacy-light.scss @@ -32,7 +32,12 @@ $primary-bg-color: #ffffff; $muted-fg-color: #61708b; // Commonly used in headings and relevant alt text // Legacy theme backports -$quaternary-fg-color: #C1C6CD; +$primary-content: $primary-fg-color; +$secondary-content: $secondary-fg-color; +$tertiary-content: $tertiary-fg-color; +$quaternary-content: #C1C6CD; +$quinary-content: #e3e8f0; +$background: $primary-bg-color; // used for dialog box text $light-fg-color: #747474; @@ -186,8 +191,6 @@ $voipcall-plinth-color: $system; // ******************** $theme-button-bg-color: #e3e8f0; -$dialpad-button-bg-color: #e3e8f0; - $roomlist-button-bg-color: #fff; // Buttons include the filter box, explore button, and sublist buttons $roomlist-filter-active-bg-color: $roomlist-button-bg-color; From 30b775b639c6564c93c79759dd59fca26ba40195 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 13 Aug 2021 08:02:35 +0000 Subject: [PATCH 107/619] Translated using Weblate (Swedish) Currently translated at 93.9% (2952 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index e5e9cc5d34..785ea6d390 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3367,5 +3367,52 @@ "Identity server (%(server)s)": "Identitetsserver (%(server)s)", "Could not connect to identity server": "Kunde inte ansluta till identitetsservern", "Not a valid identity server (status code %(code)s)": "Inte en giltig identitetsserver (statuskod %(code)s)", - "Identity server URL must be HTTPS": "URL för identitetsserver måste vara HTTPS" + "Identity server URL must be HTTPS": "URL för identitetsserver måste vara HTTPS", + "Failed to update the history visibility of this space": "Misslyckades att uppdatera historiksynlighet för det här utrymmet", + "Failed to update the guest access of this space": "Misslyckades att uppdatera gäståtkomst för det här utrymmet", + "Failed to update the visibility of this space": "Misslyckades att uppdatera synligheten för det här utrymmet", + "Thank you for trying Spaces. Your feedback will help inform the next versions.": "Tack för att du prövar utrymmen. Din återkoppling kommer att underrätta kommande versioner.", + "Show all rooms": "Visa alla rum", + "To join an existing space you'll need an invite.": "För att gå med i ett existerande utrymme så behöver du en inbjudan.", + "You can also create a Space from a community.": "Du kan också skapa ett utrymme från en gemenskap.", + "You can change this later.": "Du kan ändra detta senare.", + "What kind of Space do you want to create?": "Vad för slags utrymme vill du skapa?", + "Address": "Adress", + "e.g. my-space": "t.ex. mitt-utrymme", + "Give feedback.": "Ge återkoppling.", + "Spaces feedback": "Utrymmesåterkoppling", + "Spaces are a new feature.": "Utrymmen är en ny funktion.", + "Delete avatar": "Radera avatar", + "Mute the microphone": "Tysta mikrofonen", + "Unmute the microphone": "Avtysta mikrofonen", + "Dialpad": "Knappsats", + "More": "Mer", + "Show sidebar": "Visa sidopanel", + "Hide sidebar": "Göm sidopanel", + "Start sharing your screen": "Börja dela din skärm", + "Stop sharing your screen": "Sluta dela din skärm", + "Stop the camera": "Stoppa kameran", + "Start the camera": "Starta kameran", + "Your camera is still enabled": "Din kamera är fortfarande på", + "Your camera is turned off": "Din kamera är av", + "%(sharerName)s is presenting": "%(sharerName)s presenterar", + "You are presenting": "Du presenterar", + "All rooms you're in will appear in Home.": "Alla rum du är in kommer att visas i Hem.", + "Show all rooms in Home": "Visa alla rum i Hem", + "Surround selected text when typing special characters": "Inneslut valt text vid skrivning av specialtecken", + "Use Ctrl + F to search timeline": "Använd Ctrl + F för att söka på tidslinjen", + "Use Command + F to search timeline": "Använd Kommando + F för att söka på tidslinjen", + "Don't send read receipts": "Skicka inte läskvitton", + "New layout switcher (with message bubbles)": "Ny arrangemangsbytare (med meddelandebubblor)", + "Send pseudonymous analytics data": "Skicka pseudoanonym statistik", + "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Det här gör det enkelt för rum att hållas privat för ett utrymme, medan personer i utrymmet kan hitta och gå med i det. Alla nya rum i ett utrymme kommer att ha det här tillgängligt.", + "To help space members find and join a private room, go to that room's Security & Privacy settings.": "För att hjälpa utrymmesmedlemmar att hitta och gå med i ett privat rum, gå till det rummets säkerhets- och sekretessinställningar.", + "Help space members find private rooms": "Hjälp utrymmesmedlemmar att hitta privata rum", + "Help people in spaces to find and join private rooms": "Hjälp folk i utrymmen att hitta och gå med i privata rum", + "New in the Spaces beta": "Nytt i utrymmesbetan", + "Silence call": "Tysta samtal", + "Sound on": "Ljud på", + "User %(userId)s is already invited to the room": "Användaren %(userId)s har redan bjudits in till rummet", + "Transfer Failed": "Överföring misslyckades", + "Unable to transfer call": "Kan inte överföra samtal" } From 31b71871d0398d2f3e2ef2a6dddc318a54b5a59c Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 13 Aug 2021 02:09:52 +0000 Subject: [PATCH 108/619] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3141 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index b10a4c7273..9867989224 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3650,5 +3650,31 @@ "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s 變更了聊天室的釘選訊息 %(count)s 次。", "Olm version:": "Olm 版本:", "Delete avatar": "刪除大頭照", - "Don't send read receipts": "不要傳送讀取回條" + "Don't send read receipts": "不要傳送讀取回條", + "Created from ": "從 建立", + "Communities won't receive further updates.": "社群不會收到進一步的更新。", + "Spaces are a new way to make a community, with new features coming.": "空間是一種建立社群的新方式,新功能即將到來。", + "Communities can now be made into Spaces": "社群現在可以變成空間了", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "請要求此社群的管理員設定為空間並留意邀請。", + "You can create a Space from this community here.": "您可以從此社群這裡建立一個空間。", + "This description will be shown to people when they view your space": "當人們檢視您的空間時,將會向他們顯示此描述", + "Flair won't be available in Spaces for the foreseeable future.": "在可預見的未來,Flair 將無法在空間中使用。", + "All rooms will be added and all community members will be invited.": "將新增所有聊天室並邀請所有社群成員。", + "A link to the Space will be put in your community description.": "空間連結將會放到您的社群描述中。", + "Create Space from community": "從社群建立空間", + "Failed to migrate community": "遷移社群失敗", + "To create a Space from another community, just pick the community in Preferences.": "要從另一個社群建立空間,僅需在「偏好設定」中挑選社群。", + " has been made and everyone who was a part of the community has been invited to it.": "已建立 ,且社群中的每個人都已被邀請加入。", + "Space created": "已建立空間", + "To view Spaces, hide communities in Preferences": "要檢視空間,在偏好設定中隱藏社群", + "This community has been upgraded into a Space": "此社群已被升級為空間", + "If a community isn't shown you may not have permission to convert it.": "若未顯示社群,代表您可能無權轉換它。", + "Show my Communities": "顯示我的社群", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "社群已封存,以便讓空間接棒,但您可以在下方將您的社群轉換為空間。轉換可確保您的對話取得最新功能。", + "Create Space": "建立空間", + "Open Space": "開啟空間", + "To join an existing space you'll need an invite.": "要加入現有的空間,您必須獲得邀請。", + "You can also create a Space from a community.": "您也可以從社群建立空間。", + "You can change this later.": "您可以在稍後變更此設定。", + "What kind of Space do you want to create?": "您想建立什麼樣的空間?" } From 126d55f0abaf8a5c80ce66a48bc4692ba932c149 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Thu, 12 Aug 2021 21:31:18 +0000 Subject: [PATCH 109/619] Translated using Weblate (Esperanto) Currently translated at 95.0% (2985 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 52 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index e86b58dbab..753c24b74d 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -2011,7 +2011,7 @@ "cached locally": "kaŝmemorita loke", "not found locally": "ne trovita loke", "User signing private key:": "Uzantosubskriba privata ŝlosilo:", - "Keyboard Shortcuts": "Klavkombinoj", + "Keyboard Shortcuts": "Ŝparklavoj", "Start a conversation with someone using their name, username (like ) or email address.": "Komencu interparolon kun iu per ĝia nomo, uzantonomo (kiel ), aŭ retpoŝtadreso.", "a new master key signature": "nova ĉefŝlosila subskribo", "a new cross-signing key signature": "nova subskribo de delega ŝlosilo", @@ -3405,5 +3405,53 @@ "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Por helpi al aranoj trovi kaj aliĝi privatan ĉambron, iru al la agordoj de Sekureco kaj Privateco de tiu ĉambro.", "Help space members find private rooms": "Helpu aranojn trovi privatajn ĉambrojn", "Help people in spaces to find and join private rooms": "Helpu al personoj en aroj trovi kaj aliĝi privatajn ĉambrojn", - "New in the Spaces beta": "Nove en beta-versio de aroj" + "New in the Spaces beta": "Nove en beta-versio de aroj", + "This space has no local addresses": "Ĉi tiu aro ne havas lokajn adresojn", + "Stop recording": "Malŝalti registradon", + "Copy Room Link": "Kopii ligilon al ĉambro", + "You can now share your screen by pressing the \"screen share\" button during a call. You can even do this in audio calls if both sides support it!": "Nun vi povas vidigi vian ekranon per la butono «ekranvidado» dum voko. Vi eĉ povas fari tion dum voĉvokoj, se ambaŭ flankoj tion subtenas!", + "Screen sharing is here!": "Ekranvidado venis!", + "End-to-end encryption isn't enabled": "Tutvoja ĉifrado ne estas ŝaltita", + "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites. Enable encryption in settings.": "Viaj privataj mesaĝoj estas ordinare ĉifrataj, sed ĉi tiu ĉambro ne estas ĉifrata. Plej ofte tio okazas pro uzo de nesubtenataj aparato aŭ metodo, kiel ekzemple retpoŝtaj invitoj. Ŝaltu ĉifradon per agordoj.", + "Send voice message": "Sendi voĉmesaĝon", + "Show %(count)s other previews|one": "Montri %(count)s alian antaŭrigardon", + "Show %(count)s other previews|other": "Montri %(count)s aliajn antaŭrigardojn", + "Access": "Aliro", + "People with supported clients will be able to join the room without having a registered account.": "Personoj kun subtenataj klientoj povos aliĝi al la ĉambro sen registrita konto.", + "Decide who can join %(roomName)s.": "Decidu, kiu povas aliĝi al %(roomName)s.", + "Space members": "Aranoj", + "Anyone in a space can find and join. You can select multiple spaces.": "Ĉiu en aro povas trovi kaj aliĝi. Vi povas elekti plurajn arojn.", + "Anyone in %(spaceName)s can find and join. You can select other spaces too.": "Ĉiu en %(spaceName)s povas trovi kaj aliĝi. Vi povas elekti ankaŭ aliajn arojn.", + "Spaces with access": "Aroj kun aliro", + "Anyone in a space can find and join. Edit which spaces can access here.": "Ĉiu en aro povas trovi kaj aliĝi. Redaktu, kiuj aroj povas aliri, tie ĉi.", + "Currently, %(count)s spaces have access|other": "Nun, %(count)s aroj rajtas aliri", + "& %(count)s more|other": "kaj %(count)s pli", + "Upgrade required": "Necesas gradaltigo", + "Anyone can find and join.": "Ĉiu povas trovi kaj aliĝi.", + "Only invited people can join.": "Nur invititoj povas aliĝi.", + "Private (invite only)": "Privata (nur invititoj)", + "This upgrade will allow members of selected spaces access to this room without an invite.": "Ĉi tiu gradaltigo povigos anojn de la elektitaj aroj aliri ĉi tiun ĉambron sen invito.", + "Space information": "Informoj pri aro", + "Images, GIFs and videos": "Bildoj, GIF-bildoj kaj filmoj", + "Code blocks": "Kodujoj", + "To view all keyboard shortcuts, click here.": "Por vidi ĉiujn ŝparklavojn, klaku ĉi tie.", + "Keyboard shortcuts": "Ŝparklavoj", + "Olm version:": "Versio de Olm:", + "Identity server URL must be HTTPS": "URL de identiga servilo devas esti je HTTPS", + "There was an error loading your notification settings.": "Eraris enlegado de viaj agordoj pri sciigoj.", + "Mentions & keywords": "Mencioj kaj ĉefvortoj", + "Global": "Ĉie", + "New keyword": "Nova ĉefvorto", + "Keyword": "Ĉefvorto", + "Enable email notifications for %(email)s": "Ŝalti retpoŝtajn sciigojn por %(email)s", + "Enable for this account": "Ŝalti por ĉi tiu konto", + "An error occurred whilst saving your notification preferences.": "Eraris konservado de viaj preferoj pri sciigoj.", + "Error saving notification preferences": "Eraris konservado de preferoj pri sciigoj", + "Messages containing keywords": "Mesaĝoj enhavantaj ĉefvortojn", + "Message bubbles": "Mesaĝaj vezikoj", + "IRC": "IRC", + "Collapse": "Maletendi", + "Expand": "Etendi", + "Recommended for public spaces.": "Rekomendita por publikaj aroj.", + "Allow people to preview your space before they join.": "Povigi personojn antaŭrigardi vian aron antaŭ aliĝo." } From 72b018812d4ac1d5df5918d5ed72619dd4a5385e Mon Sep 17 00:00:00 2001 From: XoseM Date: Fri, 13 Aug 2021 05:12:11 +0000 Subject: [PATCH 110/619] Translated using Weblate (Galician) Currently translated at 100.0% (3141 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 731d386b38..694eb99883 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3647,5 +3647,31 @@ "Start the camera": "Abrir a cámara", "Surround selected text when typing special characters": "Rodea o texto seleccionado ao escribir caracteres especiais", "Delete avatar": "Eliminar avatar", - "Don't send read receipts": "Non enviar confirmación de lectura" + "Don't send read receipts": "Non enviar confirmación de lectura", + "Flair won't be available in Spaces for the foreseeable future.": "Non agardamos que Aura esté dispoñible en Espazos no futuro.", + "Created from ": "Creado desde ", + "Communities won't receive further updates.": "As Comunidades non van recibir máis actualizacións.", + "Spaces are a new way to make a community, with new features coming.": "Os Espazos son un novo xeito de crear comunidade, con novas características por chegar.", + "Communities can now be made into Spaces": "Xa podes convertir as Comunidades en Espazos", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Pídelle á administración da comunidade que a converta nun Espazo e agarda polo convite.", + "You can create a Space from this community here.": "Podes crear aquí un Espazo a partir desta comunidade.", + "This description will be shown to people when they view your space": "Esta descrición váiselle mostrar ás persoas que vexan o teu espazo", + "All rooms will be added and all community members will be invited.": "Vanse engadir tódalas salas e tódolos membros da comunidade serán convidados.", + "A link to the Space will be put in your community description.": "Vaise pór unha ligazón ao Espazo na descrición da comunidade.", + "Create Space from community": "Crear Esapazo desde a comunidade", + "Failed to migrate community": "Fallou a migración da comunidade", + "To create a Space from another community, just pick the community in Preferences.": "Para crear un Espazo desde outra comunidade, só tes que elexir a comunidade nas Preferencias.", + " has been made and everyone who was a part of the community has been invited to it.": " foi creado e calquera que fose parte da comunidade foi convidada a el.", + "Space created": "Espazo creado", + "To view Spaces, hide communities in Preferences": "Para ver Espazos, agocha as comunidades en Preferencias", + "This community has been upgraded into a Space": "Esta comunidade foi convertida a un Espazo", + "If a community isn't shown you may not have permission to convert it.": "Se unha comunidade non aparece pode que non teñas permiso para convertila.", + "Show my Communities": "Mostrar as miñas Comunidades", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "As Comunidades foron arquivadas para facerlle sitio a Espazos pero podes convertir as túas comunidades en Espazos. Ao convertilas permites que as túas conversas teñan as últimas ferramentas.", + "Create Space": "Crear Espazo", + "Open Space": "Abrir Espazo", + "To join an existing space you'll need an invite.": "Para unirte a un espazo existente precisas un convite.", + "You can also create a Space from a community.": "Tamén podes crear un Espazo a partir dunha comunidade.", + "You can change this later.": "Esto poderalo cambiar máis tarde.", + "What kind of Space do you want to create?": "Que tipo de Espazo queres crear?" } From 504905a82201d946b9b33b3bad95fc0ff9665101 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 13 Aug 2021 11:50:08 +0000 Subject: [PATCH 111/619] Translated using Weblate (Swedish) Currently translated at 95.4% (2998 of 3141 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 785ea6d390..8e564e06ed 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3414,5 +3414,43 @@ "Sound on": "Ljud på", "User %(userId)s is already invited to the room": "Användaren %(userId)s har redan bjudits in till rummet", "Transfer Failed": "Överföring misslyckades", - "Unable to transfer call": "Kan inte överföra samtal" + "Unable to transfer call": "Kan inte överföra samtal", + "Space information": "Utrymmesinfo", + "Images, GIFs and videos": "Bilder, GIF:ar och videor", + "Code blocks": "Kodblock", + "Displaying time": "Visar tid", + "To view all keyboard shortcuts, click here.": "För att se alla tangentbordsgenvägar, klicka här.", + "Keyboard shortcuts": "Tangentbordsgenvägar", + "If a community isn't shown you may not have permission to convert it.": "Om en gemenskap inte syns så kanske du inte har behörighet att se den.", + "Show my Communities": "Visa mina gemenskaper", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Gemenskaper har arkiverats för att göra plats för utrymmen men du kan konvertera dina gemenskaper till utrymmen nedan. Konvertering säkerställer att dina konversationer får de senaste funktionerna.", + "Create Space": "Skapa utrymme", + "Open Space": "Öppna utrymme", + "Identity server is": "Identitetsserver är", + "Olm version:": "Olm-version:", + "There was an error loading your notification settings.": "Ett fel inträffade när dina aviseringsinställningar laddades.", + "Mentions & keywords": "Omnämnanden & nyckelord", + "Global": "Globalt", + "New keyword": "Nytt nyckelord", + "Keyword": "Nyckelord", + "Enable email notifications for %(email)s": "Aktivera e-postaviseringar för %(email)s", + "Enable for this account": "Aktivera för det här kontot", + "An error occurred whilst saving your notification preferences.": "Ett fel inträffade när dina aviseringsinställningar sparades.", + "Error saving notification preferences": "Fel vid sparning av aviseringsinställningar", + "Messages containing keywords": "Meddelanden som innehåller nyckelord", + "Message bubbles": "Meddelandebubblor", + "IRC": "IRC", + "Collapse": "Kollapsa", + "Expand": "Expandera", + "Recommended for public spaces.": "Rekommenderas för offentliga utrymmen.", + "Allow people to preview your space before they join.": "Låt personer granska ditt utrymme innan de går med.", + "Preview Space": "Granska utrymme", + "only invited people can view and join": "bara inbjudna personer kan se och gå med", + "Invite only": "Endast inbjudan", + "anyone with the link can view and join": "vem som helst med länken kan se och gå med", + "Decide who can view and join %(spaceName)s.": "Bestäm vem kan se och gå med i %(spaceName)s.", + "Visibility": "Synlighet", + "This may be useful for public spaces.": "Det här kan vara användbart för ett offentligt utrymme.", + "Guests can join a space without having an account.": "Gäster kan gå med i ett utrymme utan att ha ett konto.", + "Enable guest access": "Aktivera gäståtkomst" } From 7f58a21aac4797825b6fb22593fc15df70d6fb8c Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Fri, 13 Aug 2021 18:12:02 +0200 Subject: [PATCH 112/619] Improve BackdropPanel performance by ignoring React --- src/components/structures/BackdropPanel.tsx | 70 ++++++++++++--------- src/components/views/spaces/SpacePanel.tsx | 10 ++- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 5493fff3a6..9f4d639968 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -23,26 +23,22 @@ interface IProps { backgroundImage?: CanvasImageSource; } -interface IState { - spacePanelWidth: number; - roomListWidth: number; - viewportHeight: number; -} - -export default class BackdropPanel extends React.PureComponent { +export default class BackdropPanel extends React.PureComponent { private spacesCanvasRef = createRef(); private roomListCanvasRef = createRef(); private spacesCtx: CanvasRenderingContext2D; private roomListCtx: CanvasRenderingContext2D; + private sizes = { + spacePanelWidth: 0, + roomListWidth: 0, + height: 0, + }; + private currentFrame?: number; + constructor(props: IProps) { super(props); - this.state = { - spacePanelWidth: 0, - roomListWidth: 0, - viewportHeight: UIStore.instance.windowHeight, - }; } public componentDidMount() { @@ -52,30 +48,41 @@ export default class BackdropPanel extends React.PureComponent { UIStore.instance.on("LeftPanel", this.onResize); } + public componentDidUpdate() { + if (this.props.backgroundImage) { + this.refreshBackdropImage(); + } + } + public componentWillUnmount() { UIStore.instance.off("SpacePanel", this.onResize); UIStore.instance.off("LeftPanel", this.onResize); } - public componentDidUpdate() { - if (this.props.backgroundImage) { - requestAnimationFrame(this.refreshBackdropImage); - } - } - private onResize = () => { const spacePanelDimensions = UIStore.instance.getElementDimensions("SpacePanel"); const roomListDimensions = UIStore.instance.getElementDimensions("LeftPanel"); - this.setState({ - spacePanelWidth: spacePanelDimensions ? spacePanelDimensions.width : 0, - roomListWidth: roomListDimensions ? roomListDimensions.width : 0, - viewportHeight: UIStore.instance.windowHeight, - }); + this.sizes = { + spacePanelWidth: spacePanelDimensions?.width ?? 0, + roomListWidth: roomListDimensions?.width ?? 0, + height: UIStore.instance.windowHeight, + }; + if (this.props.backgroundImage) { + this.refreshBackdropImage(); + } + }; + + private animate = () => { + if (this.currentFrame !== undefined) { + cancelAnimationFrame(this.currentFrame); + this.currentFrame = undefined; + } + this.currentFrame = requestAnimationFrame(this.refreshBackdropImage); }; private refreshBackdropImage = (): void => { - const width = this.state.spacePanelWidth + this.state.roomListWidth; - const height = this.state.viewportHeight; + const { spacePanelWidth, roomListWidth, height } = this.sizes; + const width = spacePanelWidth + roomListWidth; const { backgroundImage } = this.props; const imageWidth = (backgroundImage as ImageBitmap).width @@ -98,10 +105,11 @@ export default class BackdropPanel extends React.PureComponent { const x = (width - resultWidth) / 2; const y = (height - resultHeight) / 2; - this.spacesCanvasRef.current.width = this.state.spacePanelWidth; - this.spacesCanvasRef.current.height = this.state.viewportHeight; - this.roomListCanvasRef.current.width = this.state.roomListWidth; - this.roomListCanvasRef.current.height = this.state.viewportHeight; + this.spacesCanvasRef.current.width = spacePanelWidth; + this.spacesCanvasRef.current.height = height; + this.roomListCanvasRef.current.width = roomListWidth; + this.roomListCanvasRef.current.height = height; + this.roomListCanvasRef.current.style.transform = `translateX(${spacePanelWidth}px)`; this.spacesCtx.filter = `blur(30px)`; this.roomListCtx.filter = `blur(60px)`; @@ -116,7 +124,7 @@ export default class BackdropPanel extends React.PureComponent { backgroundImage, 0, 0, imageWidth, imageHeight, - x - this.state.spacePanelWidth, + x - spacePanelWidth, y, resultWidth, resultHeight, @@ -134,7 +142,7 @@ export default class BackdropPanel extends React.PureComponent { /> { const invites = useEventEmitterState(SpaceStore.instance, UPDATE_INVITED_SPACES, () => { @@ -207,6 +207,11 @@ const InnerSpacePanel = React.memo(({ children, isPanelCo const SpacePanel = () => { const [isPanelCollapsed, setPanelCollapsed] = useState(true); + const ref = useRef(); + useLayoutEffect(() => { + UIStore.instance.trackElementDimensions("SpacePanel", ref.current); + return () => UIStore.instance.stopTrackingElementDimensions("SpacePanel"); + }, []); const onKeyDown = (ev: React.KeyboardEvent) => { let handled = true; @@ -281,6 +286,7 @@ const SpacePanel = () => { onKeyDown={onKeyDownHandler} role="tree" aria-label={_t("Spaces")} + ref={ref} > { (provided, snapshot) => ( From 94a5013beb1b1118eebe6347f5fa58b8c35c7833 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Fri, 13 Aug 2021 19:03:20 +0200 Subject: [PATCH 113/619] temp --- res/themes/dark/css/_dark.scss | 6 +- res/themes/light/css/_light.scss | 7 +- src/components/structures/BackdropPanel.tsx | 71 ++++++++++----------- 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 8c305b9828..53cba6f440 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -239,8 +239,10 @@ $voice-playback-button-fg-color: $message-body-panel-icon-fg-color; $appearance-tab-border-color: $room-highlight-color; // blur amounts for left left panel (only for element theme, used in _mods.scss) -$roomlist-background-blur-amount: 60px; -$groupFilterPanel-background-blur-amount: 30px; +:root { + --roomlist-background-blur-amount: 60px; + --groupFilterPanel-background-blur-amount: 30px; +} $composer-shadow-color: rgba(0, 0, 0, 0.28); diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index e64fe12d3b..4978edee55 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -362,9 +362,10 @@ $voice-playback-button-fg-color: $message-body-panel-icon-fg-color; $appearance-tab-border-color: $input-darker-bg-color; // blur amounts for left left panel (only for element theme, used in _mods.scss) -$roomlist-background-blur-amount: 40px; -$groupFilterPanel-background-blur-amount: 20px; - +:root { + --roomlist-background-blur-amount: 40px; + --groupFilterPanel-background-blur-amount: 20px; +} $composer-shadow-color: rgba(0, 0, 0, 0.04); // Bubble tiles diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 9f4d639968..1242835450 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -27,31 +27,21 @@ export default class BackdropPanel extends React.PureComponent { private spacesCanvasRef = createRef(); private roomListCanvasRef = createRef(); - private spacesCtx: CanvasRenderingContext2D; - private roomListCtx: CanvasRenderingContext2D; - private sizes = { spacePanelWidth: 0, roomListWidth: 0, height: 0, }; - private currentFrame?: number; + private style = getComputedStyle(document.documentElement); constructor(props: IProps) { super(props); } public componentDidMount() { - this.spacesCtx = this.spacesCanvasRef.current.getContext("2d"); - this.roomListCtx = this.roomListCanvasRef.current.getContext("2d"); UIStore.instance.on("SpacePanel", this.onResize); UIStore.instance.on("LeftPanel", this.onResize); - } - - public componentDidUpdate() { - if (this.props.backgroundImage) { - this.refreshBackdropImage(); - } + this.onResize(); } public componentWillUnmount() { @@ -59,28 +49,31 @@ export default class BackdropPanel extends React.PureComponent { UIStore.instance.off("LeftPanel", this.onResize); } - private onResize = () => { - const spacePanelDimensions = UIStore.instance.getElementDimensions("SpacePanel"); - const roomListDimensions = UIStore.instance.getElementDimensions("LeftPanel"); - this.sizes = { - spacePanelWidth: spacePanelDimensions?.width ?? 0, - roomListWidth: roomListDimensions?.width ?? 0, - height: UIStore.instance.windowHeight, - }; + public componentDidUpdate(prevProps: IProps) { if (this.props.backgroundImage) { + this.onResize(); + } + if (prevProps.backgroundImage && !this.props.backgroundImage) { + this.forceUpdate(); + } + } + + private onResize = () => { + if (this.props.backgroundImage) { + const spacePanelDimensions = UIStore.instance.getElementDimensions("SpacePanel"); + const roomListDimensions = UIStore.instance.getElementDimensions("LeftPanel"); + this.sizes = { + spacePanelWidth: spacePanelDimensions?.width ?? 0, + roomListWidth: roomListDimensions?.width ?? 0, + height: UIStore.instance.windowHeight, + }; this.refreshBackdropImage(); } }; - private animate = () => { - if (this.currentFrame !== undefined) { - cancelAnimationFrame(this.currentFrame); - this.currentFrame = undefined; - } - this.currentFrame = requestAnimationFrame(this.refreshBackdropImage); - }; - private refreshBackdropImage = (): void => { + const spacesCtx = this.spacesCanvasRef.current.getContext("2d"); + const roomListCtx = this.roomListCanvasRef.current.getContext("2d"); const { spacePanelWidth, roomListWidth, height } = this.sizes; const width = spacePanelWidth + roomListWidth; const { backgroundImage } = this.props; @@ -111,16 +104,21 @@ export default class BackdropPanel extends React.PureComponent { this.roomListCanvasRef.current.height = height; this.roomListCanvasRef.current.style.transform = `translateX(${spacePanelWidth}px)`; - this.spacesCtx.filter = `blur(30px)`; - this.roomListCtx.filter = `blur(60px)`; - this.spacesCtx.drawImage( + const spacesBlur = this.style.getPropertyValue('--roomlist-background-blur-amount'); + const roomListBlur = this.style.getPropertyValue('--groupFilterPanel-background-blur-amount'); + + spacesCtx.filter = `blur(${spacesBlur})`; + roomListCtx.filter = `blur(${roomListBlur})`; + spacesCtx.drawImage( backgroundImage, + 0, 0, + imageWidth, imageHeight, x, y, resultWidth, resultHeight, ); - this.roomListCtx.drawImage( + roomListCtx.drawImage( backgroundImage, 0, 0, imageWidth, imageHeight, @@ -132,22 +130,23 @@ export default class BackdropPanel extends React.PureComponent { }; public render() { - return <> + if (!this.props.backgroundImage) return null; + return
      - ; +
      ; } } From 2e9cacdeb1d57537dc08dee931d8e4c87d837c59 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 10:22:43 +0200 Subject: [PATCH 114/619] Migrate JumpToBottomButton to TypeScript --- .../{JumpToBottomButton.js => JumpToBottomButton.tsx} | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) rename src/components/views/rooms/{JumpToBottomButton.js => JumpToBottomButton.tsx} (83%) diff --git a/src/components/views/rooms/JumpToBottomButton.js b/src/components/views/rooms/JumpToBottomButton.tsx similarity index 83% rename from src/components/views/rooms/JumpToBottomButton.js rename to src/components/views/rooms/JumpToBottomButton.tsx index d2e2a391a6..0b680d093d 100644 --- a/src/components/views/rooms/JumpToBottomButton.js +++ b/src/components/views/rooms/JumpToBottomButton.tsx @@ -14,11 +14,18 @@ See the License for the specific language governing permissions and limitations under the License. */ +import React from "react"; import { _t } from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; import classNames from 'classnames'; -export default (props) => { +interface IProps { + numUnreadMessages: number; + highlight: boolean; + onScrollToBottomClick: (e: React.MouseEvent) => void; +} + +const JumpToBottomButton: React.FC = (props) => { const className = classNames({ 'mx_JumpToBottomButton': true, 'mx_JumpToBottomButton_highlight': props.highlight, @@ -36,3 +43,5 @@ export default (props) => { { badge }
    ); }; + +export default JumpToBottomButton; From e9e6269da7487c7b3456b149d757e08760db6136 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 10:31:18 +0200 Subject: [PATCH 115/619] Migrat ReadReceiptMarker to TypeScript --- src/components/views/rooms/EventTile.tsx | 1 + ...ReceiptMarker.js => ReadReceiptMarker.tsx} | 114 ++++++++++-------- 2 files changed, 64 insertions(+), 51 deletions(-) rename src/components/views/rooms/{ReadReceiptMarker.js => ReadReceiptMarker.tsx} (74%) diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 301e33ec42..c5fbb99ede 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -240,6 +240,7 @@ interface IProps { // opaque readreceipt info for each userId; used by ReadReceiptMarker // to manage its animations. Should be an empty object when the room // first loads + // TODO: Proper typing for RR info readReceiptMap?: any; // A function which is used to check if the parent panel is being diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.tsx similarity index 74% rename from src/components/views/rooms/ReadReceiptMarker.js rename to src/components/views/rooms/ReadReceiptMarker.tsx index c9688b4d29..11e7563f11 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.tsx @@ -16,7 +16,8 @@ limitations under the License. */ import React, { createRef } from 'react'; -import PropTypes from 'prop-types'; +import { RoomMember } from 'matrix-js-sdk/src'; + import { _t } from '../../../languageHandler'; import { formatDate } from '../../../DateUtils'; import NodeAnimator from "../../../NodeAnimator"; @@ -24,53 +25,64 @@ import * as sdk from "../../../index"; import { toPx } from "../../../utils/units"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + // the RoomMember to show the RR for + member?: RoomMember; + // userId to fallback the avatar to + // if the member hasn't been loaded yet + fallbackUserId: string; + + // number of pixels to offset the avatar from the right of its parent; + // typically a negative value. + leftOffset?: number; + + // true to hide the avatar (it will still be animated) + hidden?: boolean; + + // don't animate this RR into position + suppressAnimation?: boolean; + + // an opaque object for storing information about this user's RR in + // this room + // TODO: proper typing for RR info + readReceiptInfo: any; + + // A function which is used to check if the parent panel is being + // unmounted, to avoid unnecessary work. Should return true if we + // are being unmounted. + checkUnmounting?: () => boolean; + + // callback for clicks on this RR + onClick?: (e: React.MouseEvent) => void; + + // Timestamp when the receipt was read + timestamp?: number; + + // True to show twelve hour format, false otherwise + showTwelveHour?: boolean; +} + +interface IState { + suppressDisplay: boolean; + startStyles?: IReadReceiptMarkerStyle[]; +} + +interface IReadReceiptMarkerStyle { + top: number; + left: number; +} + @replaceableComponent("views.rooms.ReadReceiptMarker") -export default class ReadReceiptMarker extends React.PureComponent { - static propTypes = { - // the RoomMember to show the RR for - member: PropTypes.object, - // userId to fallback the avatar to - // if the member hasn't been loaded yet - fallbackUserId: PropTypes.string.isRequired, - - // number of pixels to offset the avatar from the right of its parent; - // typically a negative value. - leftOffset: PropTypes.number, - - // true to hide the avatar (it will still be animated) - hidden: PropTypes.bool, - - // don't animate this RR into position - suppressAnimation: PropTypes.bool, - - // an opaque object for storing information about this user's RR in - // this room - readReceiptInfo: PropTypes.object, - - // A function which is used to check if the parent panel is being - // unmounted, to avoid unnecessary work. Should return true if we - // are being unmounted. - checkUnmounting: PropTypes.func, - - // callback for clicks on this RR - onClick: PropTypes.func, - - // Timestamp when the receipt was read - timestamp: PropTypes.number, - - // True to show twelve hour format, false otherwise - showTwelveHour: PropTypes.bool, - }; +export default class ReadReceiptMarker extends React.PureComponent { + private avatar: React.RefObject = createRef(); static defaultProps = { leftOffset: 0, }; - constructor(props) { + constructor(props: IProps) { super(props); - this._avatar = createRef(); - this.state = { // if we are going to animate the RR, we don't show it on first render, // and instead just add a placeholder to the DOM; once we've been @@ -80,7 +92,7 @@ export default class ReadReceiptMarker extends React.PureComponent { }; } - componentWillUnmount() { + public componentWillUnmount(): void { // before we remove the rr, store its location in the map, so that if // it reappears, it can be animated from the right place. const rrInfo = this.props.readReceiptInfo; @@ -95,29 +107,29 @@ export default class ReadReceiptMarker extends React.PureComponent { return; } - const avatarNode = this._avatar.current; + const avatarNode = this.avatar.current; rrInfo.top = avatarNode.offsetTop; rrInfo.left = avatarNode.offsetLeft; rrInfo.parent = avatarNode.offsetParent; } - componentDidMount() { + public componentDidMount(): void { if (!this.state.suppressDisplay) { // we've already done our display - nothing more to do. return; } - this._animateMarker(); + this.animateMarker(); } - componentDidUpdate(prevProps) { + public componentDidUpdate(prevProps: IProps): void { const differentLeftOffset = prevProps.leftOffset !== this.props.leftOffset; const visibilityChanged = prevProps.hidden !== this.props.hidden; if (differentLeftOffset || visibilityChanged) { - this._animateMarker(); + this.animateMarker(); } } - _animateMarker() { + private animateMarker(): void { // treat new RRs as though they were off the top of the screen let oldTop = -15; @@ -126,7 +138,7 @@ export default class ReadReceiptMarker extends React.PureComponent { oldTop = oldInfo.top + oldInfo.parent.getBoundingClientRect().top; } - const newElement = this._avatar.current; + const newElement = this.avatar.current; let startTopOffset; if (!newElement.offsetParent) { // this seems to happen sometimes for reasons I don't understand @@ -156,10 +168,10 @@ export default class ReadReceiptMarker extends React.PureComponent { }); } - render() { + public render(): JSX.Element { const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); if (this.state.suppressDisplay) { - return
    ; + return
    ; } const style = { @@ -198,7 +210,7 @@ export default class ReadReceiptMarker extends React.PureComponent { style={style} title={title} onClick={this.props.onClick} - inputRef={this._avatar} + inputRef={this.avatar} /> ); From 7290a65924b830868ecb7c0bf712d2a1462514c3 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 10:36:04 +0200 Subject: [PATCH 116/619] Migrate RoomDetailList to TypeScript --- .../{RoomDetailList.js => RoomDetailList.tsx} | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) rename src/components/views/rooms/{RoomDetailList.js => RoomDetailList.tsx} (81%) diff --git a/src/components/views/rooms/RoomDetailList.js b/src/components/views/rooms/RoomDetailList.tsx similarity index 81% rename from src/components/views/rooms/RoomDetailList.js rename to src/components/views/rooms/RoomDetailList.tsx index bf2f5418c9..ee7383d7c7 100644 --- a/src/components/views/rooms/RoomDetailList.js +++ b/src/components/views/rooms/RoomDetailList.tsx @@ -14,24 +14,23 @@ See the License for the specific language governing permissions and limitations under the License. */ +import React from 'react'; +import { Room } from 'matrix-js-sdk/src'; +import classNames from 'classnames'; import * as sdk from '../../../index'; import dis from '../../../dispatcher/dispatcher'; -import React from 'react'; import { _t } from '../../../languageHandler'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; -import { roomShape } from './RoomDetailRow'; import { replaceableComponent } from "../../../utils/replaceableComponent"; -@replaceableComponent("views.rooms.RoomDetailList") -export default class RoomDetailList extends React.Component { - static propTypes = { - rooms: PropTypes.arrayOf(roomShape), - className: PropTypes.string, - }; +interface IProps { + rooms?: Room[]; + className?: string; +} - getRows() { +@replaceableComponent("views.rooms.RoomDetailList") +export default class RoomDetailList extends React.Component { + public getRows(): JSX.Element[] { if (!this.props.rooms) return []; const RoomDetailRow = sdk.getComponent('rooms.RoomDetailRow'); @@ -40,15 +39,15 @@ export default class RoomDetailList extends React.Component { }); } - onDetailsClick = (ev, room) => { + public onDetailsClick = (ev: React.MouseEvent, room: Room): void => { dis.dispatch({ action: 'view_room', room_id: room.roomId, - room_alias: room.canonicalAlias || (room.aliases || [])[0], + room_alias: room.getCanonicalAlias() || (room.getAltAliases() || [])[0], }); }; - render() { + public render(): JSX.Element { const rows = this.getRows(); let rooms; if (rows.length === 0) { From 7e4c88f6ba11d610e4930daf8eab0cc3f1698738 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 10:46:38 +0200 Subject: [PATCH 117/619] Migrate RoomUpgradeWarningBar to TypeScript --- ...arningBar.js => RoomUpgradeWarningBar.tsx} | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) rename src/components/views/rooms/{RoomUpgradeWarningBar.js => RoomUpgradeWarningBar.tsx} (88%) diff --git a/src/components/views/rooms/RoomUpgradeWarningBar.js b/src/components/views/rooms/RoomUpgradeWarningBar.tsx similarity index 88% rename from src/components/views/rooms/RoomUpgradeWarningBar.js rename to src/components/views/rooms/RoomUpgradeWarningBar.tsx index 384845cdf9..6706e248e0 100644 --- a/src/components/views/rooms/RoomUpgradeWarningBar.js +++ b/src/components/views/rooms/RoomUpgradeWarningBar.tsx @@ -1,5 +1,5 @@ /* -Copyright 2018-2020 New Vector Ltd +Copyright 2018-2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; +import { MatrixEvent, Room, RoomState } from 'matrix-js-sdk/src'; import * as sdk from '../../../index'; import Modal from '../../../Modal'; @@ -23,33 +23,31 @@ import { _t } from '../../../languageHandler'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + room: Room; +} + +interface IState { + upgraded?: boolean; +} + @replaceableComponent("views.rooms.RoomUpgradeWarningBar") -export default class RoomUpgradeWarningBar extends React.PureComponent { - static propTypes = { - room: PropTypes.object.isRequired, - recommendation: PropTypes.object.isRequired, - }; - - constructor(props) { - super(props); - this.state = {}; - } - - componentDidMount() { +export default class RoomUpgradeWarningBar extends React.PureComponent { + public componentDidMount(): void { const tombstone = this.props.room.currentState.getStateEvents("m.room.tombstone", ""); this.setState({ upgraded: tombstone && tombstone.getContent().replacement_room }); - MatrixClientPeg.get().on("RoomState.events", this._onStateEvents); + MatrixClientPeg.get().on("RoomState.events", this.onStateEvents); } - componentWillUnmount() { + public componentWillUnmount(): void { const cli = MatrixClientPeg.get(); if (cli) { - cli.removeListener("RoomState.events", this._onStateEvents); + cli.removeListener("RoomState.events", this.onStateEvents); } } - _onStateEvents = (event, state) => { + private onStateEvents = (event: MatrixEvent, state: RoomState): void => { if (!this.props.room || event.getRoomId() !== this.props.room.roomId) { return; } @@ -60,12 +58,12 @@ export default class RoomUpgradeWarningBar extends React.PureComponent { this.setState({ upgraded: tombstone && tombstone.getContent().replacement_room }); }; - onUpgradeClick = () => { + private onUpgradeClick = (): void => { const RoomUpgradeDialog = sdk.getComponent('dialogs.RoomUpgradeDialog'); Modal.createTrackedDialog('Upgrade Room Version', '', RoomUpgradeDialog, { room: this.props.room }); }; - render() { + public render(): JSX.Element { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let doUpgradeWarnings = ( From eb120901aea7c1fb5b54bb9ceb8cf7516a7498d7 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 10:48:30 +0200 Subject: [PATCH 118/619] Migrate SimpleRoomHeader to TypeScript --- ...mpleRoomHeader.js => SimpleRoomHeader.tsx} | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) rename src/components/views/rooms/{SimpleRoomHeader.js => SimpleRoomHeader.tsx} (84%) diff --git a/src/components/views/rooms/SimpleRoomHeader.js b/src/components/views/rooms/SimpleRoomHeader.tsx similarity index 84% rename from src/components/views/rooms/SimpleRoomHeader.js rename to src/components/views/rooms/SimpleRoomHeader.tsx index a2b5566e39..b81e906559 100644 --- a/src/components/views/rooms/SimpleRoomHeader.js +++ b/src/components/views/rooms/SimpleRoomHeader.tsx @@ -1,5 +1,6 @@ /* Copyright 2016 OpenMarket Ltd +Copyright 2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,23 +16,21 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + title?: string; + // `src` to an image. Optional. + icon?: string; +} + /* * A stripped-down room header used for things like the user settings * and room directory. */ @replaceableComponent("views.rooms.SimpleRoomHeader") -export default class SimpleRoomHeader extends React.Component { - static propTypes = { - title: PropTypes.string, - - // `src` to an image. Optional. - icon: PropTypes.string, - }; - - render() { +export default class SimpleRoomHeader extends React.PureComponent { + public render(): JSX.Element { let icon; if (this.props.icon) { icon = Date: Sat, 14 Aug 2021 10:51:08 +0200 Subject: [PATCH 119/619] Migrate TopUnreadMessagesBar to TypeScript --- ...dMessagesBar.js => TopUnreadMessagesBar.tsx} | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) rename src/components/views/rooms/{TopUnreadMessagesBar.js => TopUnreadMessagesBar.tsx} (84%) diff --git a/src/components/views/rooms/TopUnreadMessagesBar.js b/src/components/views/rooms/TopUnreadMessagesBar.tsx similarity index 84% rename from src/components/views/rooms/TopUnreadMessagesBar.js rename to src/components/views/rooms/TopUnreadMessagesBar.tsx index d2a3e3a303..01797299cf 100644 --- a/src/components/views/rooms/TopUnreadMessagesBar.js +++ b/src/components/views/rooms/TopUnreadMessagesBar.tsx @@ -1,7 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd -Copyright 2019 New Vector Ltd +Copyright 2019-2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,19 +17,18 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; import { replaceableComponent } from "../../../utils/replaceableComponent"; -@replaceableComponent("views.rooms.TopUnreadMessagesBar") -export default class TopUnreadMessagesBar extends React.Component { - static propTypes = { - onScrollUpClick: PropTypes.func, - onCloseClick: PropTypes.func, - }; +interface IProps { + onScrollUpClick?: (e: React.MouseEvent) => void; + onCloseClick?: (e: React.MouseEvent) => void; +} - render() { +@replaceableComponent("views.rooms.TopUnreadMessagesBar") +export default class TopUnreadMessagesBar extends React.PureComponent { + public render(): JSX.Element { return (
    Date: Sat, 14 Aug 2021 10:53:53 +0200 Subject: [PATCH 120/619] Migrate AvatarSetting to TypeScript --- .../{AvatarSetting.js => AvatarSetting.tsx} | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) rename src/components/views/settings/{AvatarSetting.js => AvatarSetting.tsx} (86%) diff --git a/src/components/views/settings/AvatarSetting.js b/src/components/views/settings/AvatarSetting.tsx similarity index 86% rename from src/components/views/settings/AvatarSetting.js rename to src/components/views/settings/AvatarSetting.tsx index f22c4f1c85..806d0adb73 100644 --- a/src/components/views/settings/AvatarSetting.js +++ b/src/components/views/settings/AvatarSetting.tsx @@ -15,12 +15,19 @@ limitations under the License. */ import React, { useState } from "react"; -import PropTypes from "prop-types"; import { _t } from "../../../languageHandler"; import AccessibleButton from "../elements/AccessibleButton"; import classNames from "classnames"; -const AvatarSetting = ({ avatarUrl, avatarAltText, avatarName, uploadAvatar, removeAvatar }) => { +interface IProps { + avatarUrl?: string; + avatarName: string; // name of user/room the avatar belongs to + uploadAvatar?: (e: React.MouseEvent) => void; + removeAvatar?: (e: React.MouseEvent) => void; + avatarAltText: string; +} + +const AvatarSetting: React.FC = ({ avatarUrl, avatarAltText, avatarName, uploadAvatar, removeAvatar }) => { const [isHovering, setIsHovering] = useState(false); const hoveringProps = { onMouseEnter: () => setIsHovering(true), @@ -78,12 +85,4 @@ const AvatarSetting = ({ avatarUrl, avatarAltText, avatarName, uploadAvatar, rem
    ; }; -AvatarSetting.propTypes = { - avatarUrl: PropTypes.string, - avatarName: PropTypes.string.isRequired, // name of user/room the avatar belongs to - uploadAvatar: PropTypes.func, - removeAvatar: PropTypes.func, - avatarAltText: PropTypes.string.isRequired, -}; - export default AvatarSetting; From bedfbedff0ec3ffd8e081eef91951b76702ccf65 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 11:04:36 +0200 Subject: [PATCH 121/619] Migrate ChangeAvatar to TypeScript --- .../{ChangeAvatar.js => ChangeAvatar.tsx} | 96 ++++++++++--------- 1 file changed, 52 insertions(+), 44 deletions(-) rename src/components/views/settings/{ChangeAvatar.js => ChangeAvatar.tsx} (74%) diff --git a/src/components/views/settings/ChangeAvatar.js b/src/components/views/settings/ChangeAvatar.tsx similarity index 74% rename from src/components/views/settings/ChangeAvatar.js rename to src/components/views/settings/ChangeAvatar.tsx index c3a1544cdc..6394bad3de 100644 --- a/src/components/views/settings/ChangeAvatar.js +++ b/src/components/views/settings/ChangeAvatar.tsx @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,54 +16,62 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import Spinner from '../elements/Spinner'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { mediaFromMxc } from "../../../customisations/Media"; +import { MatrixEvent, Room } from '../../../../../matrix-js-sdk/src'; + +interface IProps { + initialAvatarUrl?: string; + room?: Room; + // if false, you need to call changeAvatar.onFileSelected yourself. + showUploadSection?: boolean; + width?: number; + height?: number; + className?: string; +} + +interface IState { + avatarUrl?: string; + errorText?: string; + phase?: Phases; +} + +enum Phases { + Display = "display", + Uploading = "uploading", + Error = "error", +} @replaceableComponent("views.settings.ChangeAvatar") -export default class ChangeAvatar extends React.Component { - static propTypes = { - initialAvatarUrl: PropTypes.string, - room: PropTypes.object, - // if false, you need to call changeAvatar.onFileSelected yourself. - showUploadSection: PropTypes.bool, - width: PropTypes.number, - height: PropTypes.number, - className: PropTypes.string, - }; - - static Phases = { - Display: "display", - Uploading: "uploading", - Error: "error", - }; - - static defaultProps = { +export default class ChangeAvatar extends React.Component { + public static defaultProps = { showUploadSection: true, className: "", width: 80, height: 80, }; - constructor(props) { + private avatarSet = false; + + constructor(props: IProps) { super(props); this.state = { avatarUrl: this.props.initialAvatarUrl, - phase: ChangeAvatar.Phases.Display, + phase: Phases.Display, }; } - componentDidMount() { + public componentDidMount(): void { MatrixClientPeg.get().on("RoomState.events", this.onRoomStateEvents); } // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - UNSAFE_componentWillReceiveProps(newProps) { // eslint-disable-line camelcase + public UNSAFE_componentWillReceiveProps(newProps): void { // eslint-disable-line camelcase if (this.avatarSet) { // don't clobber what the user has just set return; @@ -72,13 +81,13 @@ export default class ChangeAvatar extends React.Component { }); } - componentWillUnmount() { + public componentWillUnmount(): void { if (MatrixClientPeg.get()) { MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents); } } - onRoomStateEvents = (ev) => { + public onRoomStateEvents = (ev: MatrixEvent) => { if (!this.props.room) { return; } @@ -94,18 +103,17 @@ export default class ChangeAvatar extends React.Component { } }; - setAvatarFromFile(file) { + public setAvatarFromFile(file): Promise<{}> { let newUrl = null; this.setState({ - phase: ChangeAvatar.Phases.Uploading, + phase: Phases.Uploading, }); - const self = this; - const httpPromise = MatrixClientPeg.get().uploadContent(file).then(function(url) { + const httpPromise = MatrixClientPeg.get().uploadContent(file).then((url) => { newUrl = url; - if (self.props.room) { + if (this.props.room) { return MatrixClientPeg.get().sendStateEvent( - self.props.room.roomId, + this.props.room.roomId, 'm.room.avatar', { url: url }, '', @@ -115,33 +123,33 @@ export default class ChangeAvatar extends React.Component { } }); - httpPromise.then(function() { - self.setState({ - phase: ChangeAvatar.Phases.Display, + httpPromise.then(() => { + this.setState({ + phase: Phases.Display, avatarUrl: mediaFromMxc(newUrl).srcHttp, }); - }, function(error) { - self.setState({ - phase: ChangeAvatar.Phases.Error, + }, () => { + this.setState({ + phase: Phases.Error, }); - self.onError(error); + this.onError(); }); return httpPromise; } - onFileSelected = (ev) => { + private onFileSelected = (ev: React.ChangeEvent) => { this.avatarSet = true; return this.setAvatarFromFile(ev.target.files[0]); }; - onError = (error) => { + private onError = (): void => { this.setState({ errorText: _t("Failed to upload profile picture!"), }); }; - render() { + public render(): JSX.Element { let avatarImg; // Having just set an avatar we just display that since it will take a little // time to propagate through to the RoomAvatar. @@ -178,8 +186,8 @@ export default class ChangeAvatar extends React.Component { } switch (this.state.phase) { - case ChangeAvatar.Phases.Display: - case ChangeAvatar.Phases.Error: + case Phases.Display: + case Phases.Error: return (
    @@ -188,7 +196,7 @@ export default class ChangeAvatar extends React.Component { { uploadSection }
    ); - case ChangeAvatar.Phases.Uploading: + case Phases.Uploading: return ( ); From 1e431057ff62f9511181c457652c2ed3b8aa826f Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 11:06:34 +0200 Subject: [PATCH 122/619] Migrate ChangeDisplayName to TypeScript --- ...hangeDisplayName.js => ChangeDisplayName.tsx} | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) rename src/components/views/settings/{ChangeDisplayName.js => ChangeDisplayName.tsx} (81%) diff --git a/src/components/views/settings/ChangeDisplayName.js b/src/components/views/settings/ChangeDisplayName.tsx similarity index 81% rename from src/components/views/settings/ChangeDisplayName.js rename to src/components/views/settings/ChangeDisplayName.tsx index 2f336e18c6..09c9ecc23e 100644 --- a/src/components/views/settings/ChangeDisplayName.js +++ b/src/components/views/settings/ChangeDisplayName.tsx @@ -1,6 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd -Copyright 2018 New Vector Ltd +Copyright 2018 - 2021 New Vector Ltd Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; @replaceableComponent("views.settings.ChangeDisplayName") export default class ChangeDisplayName extends React.Component { - _getDisplayName = async () => { + private getDisplayName = async (): Promise => { const cli = MatrixClientPeg.get(); try { const res = await cli.getProfileInfo(cli.getUserId()); @@ -34,21 +34,21 @@ export default class ChangeDisplayName extends React.Component { } }; - _changeDisplayName = (newDisplayname) => { + private changeDisplayName = (newDisplayname: string): Promise<{}> => { const cli = MatrixClientPeg.get(); - return cli.setDisplayName(newDisplayname).catch(function(e) { - throw new Error("Failed to set display name", e); + return cli.setDisplayName(newDisplayname).catch(function() { + throw new Error("Failed to set display name"); }); }; - render() { + public render(): JSX.Element { const EditableTextContainer = sdk.getComponent('elements.EditableTextContainer'); return ( + onSubmit={this.changeDisplayName} /> ); } } From fb6a6370e7e37c3c5eef48c3208b3cb9d5915b22 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 11:17:19 +0200 Subject: [PATCH 123/619] Migrate DevicesPanel to TypeScript --- .../{DevicesPanel.js => DevicesPanel.tsx} | 89 +++++++++---------- 1 file changed, 41 insertions(+), 48 deletions(-) rename src/components/views/settings/{DevicesPanel.js => DevicesPanel.tsx} (82%) diff --git a/src/components/views/settings/DevicesPanel.js b/src/components/views/settings/DevicesPanel.tsx similarity index 82% rename from src/components/views/settings/DevicesPanel.js rename to src/components/views/settings/DevicesPanel.tsx index 0f052332ee..6fd7f90c8e 100644 --- a/src/components/views/settings/DevicesPanel.js +++ b/src/components/views/settings/DevicesPanel.tsx @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,8 +17,8 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; +import { IMyDevice } from "matrix-js-sdk/src/client"; import * as sdk from '../../../index'; import { MatrixClientPeg } from '../../../MatrixClientPeg'; @@ -26,42 +27,37 @@ import Modal from '../../../Modal'; import { SSOAuthEntry } from "../auth/InteractiveAuthEntryComponents"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + className?: string; +} + +interface IState { + devices: IMyDevice[]; + deviceLoadError?: string; + selectedDevices?: string[]; + deleting?: boolean; +} + @replaceableComponent("views.settings.DevicesPanel") -export default class DevicesPanel extends React.Component { - constructor(props) { - super(props); +export default class DevicesPanel extends React.Component { + private unmounted = false; - this.state = { - devices: undefined, - deviceLoadError: undefined, - - selectedDevices: [], - deleting: false, - }; - - this._unmounted = false; - - this._renderDevice = this._renderDevice.bind(this); - this._onDeviceSelectionToggled = this._onDeviceSelectionToggled.bind(this); - this._onDeleteClick = this._onDeleteClick.bind(this); + public componentDidMount(): void { + this.loadDevices(); } - componentDidMount() { - this._loadDevices(); + public componentWillUnmount(): void { + this.unmounted = true; } - componentWillUnmount() { - this._unmounted = true; - } - - _loadDevices() { + private loadDevices(): void { MatrixClientPeg.get().getDevices().then( (resp) => { - if (this._unmounted) { return; } + if (this.unmounted) { return; } this.setState({ devices: resp.devices || [] }); }, (error) => { - if (this._unmounted) { return; } + if (this.unmounted) { return; } let errtxt; if (error.httpStatus == 404) { // 404 probably means the HS doesn't yet support the API. @@ -79,7 +75,7 @@ export default class DevicesPanel extends React.Component { * compare two devices, sorting from most-recently-seen to least-recently-seen * (and then, for stability, by device id) */ - _deviceCompare(a, b) { + private deviceCompare(a: IMyDevice, b: IMyDevice): number { // return < 0 if a comes before b, > 0 if a comes after b. const lastSeenDelta = (b.last_seen_ts || 0) - (a.last_seen_ts || 0); @@ -91,8 +87,8 @@ export default class DevicesPanel extends React.Component { return (idA < idB) ? -1 : (idA > idB) ? 1 : 0; } - _onDeviceSelectionToggled(device) { - if (this._unmounted) { return; } + private onDeviceSelectionToggled = (device: IMyDevice): void => { + if (this.unmounted) { return; } const deviceId = device.device_id; this.setState((state, props) => { @@ -108,15 +104,15 @@ export default class DevicesPanel extends React.Component { return { selectedDevices }; }); - } + }; - _onDeleteClick() { + private onDeleteClick = (): void => { this.setState({ deleting: true, }); - this._makeDeleteRequest(null).catch((error) => { - if (this._unmounted) { return; } + this.makeDeleteRequest(null).catch((error) => { + if (this.unmounted) { return; } if (error.httpStatus !== 401 || !error.data || !error.data.flows) { // doesn't look like an interactive-auth failure throw error; @@ -148,7 +144,7 @@ export default class DevicesPanel extends React.Component { title: _t("Authentication"), matrixClient: MatrixClientPeg.get(), authData: error.data, - makeRequest: this._makeDeleteRequest.bind(this), + makeRequest: this.makeDeleteRequest.bind(this), aestheticsForStagePhases: { [SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics, [SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics, @@ -156,15 +152,16 @@ export default class DevicesPanel extends React.Component { }); }).catch((e) => { console.error("Error deleting sessions", e); - if (this._unmounted) { return; } + if (this.unmounted) { return; } }).finally(() => { this.setState({ deleting: false, }); }); - } + }; - _makeDeleteRequest(auth) { + // TODO: proper typing for auth + private makeDeleteRequest(auth?: any): Promise { return MatrixClientPeg.get().deleteMultipleDevices(this.state.selectedDevices, auth).then( () => { // Remove the deleted devices from `devices`, reset selection to [] @@ -178,17 +175,17 @@ export default class DevicesPanel extends React.Component { ); } - _renderDevice(device) { + private renderDevice = (device: IMyDevice): JSX.Element => { const DevicesPanelEntry = sdk.getComponent('settings.DevicesPanelEntry'); return ; - } + }; - render() { + public render(): JSX.Element { const Spinner = sdk.getComponent("elements.Spinner"); const AccessibleButton = sdk.getComponent("elements.AccessibleButton"); @@ -208,11 +205,11 @@ export default class DevicesPanel extends React.Component { return ; } - devices.sort(this._deviceCompare); + devices.sort(this.deviceCompare); const deleteButton = this.state.deleting ? : - + { _t("Delete %(count)s sessions", { count: this.state.selectedDevices.length }) } ; @@ -227,12 +224,8 @@ export default class DevicesPanel extends React.Component { { this.state.selectedDevices.length > 0 ? deleteButton : null }
    - { devices.map(this._renderDevice) } + { devices.map(this.renderDevice) }
    ); } } - -DevicesPanel.propTypes = { - className: PropTypes.string, -}; From dfd986751ffdd810e5d54b7fa95d4470ebbca77e Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 11:21:59 +0200 Subject: [PATCH 124/619] Migrate DevicesPanelEntry to TypeScript --- ...cesPanelEntry.js => DevicesPanelEntry.tsx} | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) rename src/components/views/settings/{DevicesPanelEntry.js => DevicesPanelEntry.tsx} (78%) diff --git a/src/components/views/settings/DevicesPanelEntry.js b/src/components/views/settings/DevicesPanelEntry.tsx similarity index 78% rename from src/components/views/settings/DevicesPanelEntry.js rename to src/components/views/settings/DevicesPanelEntry.tsx index a5b674b8f6..d44147f591 100644 --- a/src/components/views/settings/DevicesPanelEntry.js +++ b/src/components/views/settings/DevicesPanelEntry.tsx @@ -1,5 +1,6 @@ /* Copyright 2016 OpenMarket Ltd +Copyright 2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,7 +16,7 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; +import { IMyDevice } from 'matrix-js-sdk/src'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; @@ -24,21 +25,19 @@ import { formatDate } from '../../../DateUtils'; import StyledCheckbox from '../elements/StyledCheckbox'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + device?: IMyDevice; + onDeviceToggled?: (device: IMyDevice) => void; + selected?: boolean; +} + @replaceableComponent("views.settings.DevicesPanelEntry") -export default class DevicesPanelEntry extends React.Component { - constructor(props) { - super(props); +export default class DevicesPanelEntry extends React.Component { + public static defaultProps = { + onDeviceToggled: () => {}, + }; - this._unmounted = false; - this.onDeviceToggled = this.onDeviceToggled.bind(this); - this._onDisplayNameChanged = this._onDisplayNameChanged.bind(this); - } - - componentWillUnmount() { - this._unmounted = true; - } - - _onDisplayNameChanged(value) { + private onDisplayNameChanged = (value: string): Promise<{}> => { const device = this.props.device; return MatrixClientPeg.get().setDeviceDetails(device.device_id, { display_name: value, @@ -46,13 +45,13 @@ export default class DevicesPanelEntry extends React.Component { console.error("Error setting session display name", e); throw new Error(_t("Failed to set display name")); }); - } + }; - onDeviceToggled() { + private onDeviceToggled = (): void => { this.props.onDeviceToggled(this.props.device); - } + }; - render() { + public render(): JSX.Element { const EditableTextContainer = sdk.getComponent('elements.EditableTextContainer'); const device = this.props.device; @@ -76,7 +75,7 @@ export default class DevicesPanelEntry extends React.Component {
    @@ -90,12 +89,3 @@ export default class DevicesPanelEntry extends React.Component { ); } } - -DevicesPanelEntry.propTypes = { - device: PropTypes.object.isRequired, - onDeviceToggled: PropTypes.func, -}; - -DevicesPanelEntry.defaultProps = { - onDeviceToggled: function() {}, -}; From 447beb829458104d2c29adb08751544a1433d4ea Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 11:27:17 +0200 Subject: [PATCH 125/619] Migrate IntegrationManager to TypeScript --- ...ationManager.js => IntegrationManager.tsx} | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) rename src/components/views/settings/{IntegrationManager.js => IntegrationManager.tsx} (72%) diff --git a/src/components/views/settings/IntegrationManager.js b/src/components/views/settings/IntegrationManager.tsx similarity index 72% rename from src/components/views/settings/IntegrationManager.js rename to src/components/views/settings/IntegrationManager.tsx index 9f2985df14..f43fb55004 100644 --- a/src/components/views/settings/IntegrationManager.js +++ b/src/components/views/settings/IntegrationManager.tsx @@ -1,6 +1,7 @@ /* Copyright 2015, 2016 OpenMarket Ltd Copyright 2019 The Matrix.org Foundation C.I.C. +Copyright 2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,53 +17,55 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import dis from '../../../dispatcher/dispatcher'; import { Key } from "../../../Keyboard"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { ActionPayload } from '../../../dispatcher/payloads'; + +interface IProps { + // false to display an error saying that we couldn't connect to the integration manager + connected: boolean; + + // true to display a loading spinner + loading: boolean; + + // The source URL to load + url?: string; + + // callback when the manager is dismissed + onFinished: () => void; +} + +interface IState { + errored: boolean; +} @replaceableComponent("views.settings.IntegrationManager") -export default class IntegrationManager extends React.Component { - static propTypes = { - // false to display an error saying that we couldn't connect to the integration manager - connected: PropTypes.bool.isRequired, +export default class IntegrationManager extends React.Component { + private dispatcherRef: string; - // true to display a loading spinner - loading: PropTypes.bool.isRequired, - - // The source URL to load - url: PropTypes.string, - - // callback when the manager is dismissed - onFinished: PropTypes.func.isRequired, - }; - - static defaultProps = { + public static defaultProps = { connected: true, loading: false, }; - constructor(props) { - super(props); + public state = { + errored: false, + }; - this.state = { - errored: false, - }; - } - - componentDidMount() { + public componentDidMount(): void { this.dispatcherRef = dis.register(this.onAction); document.addEventListener("keydown", this.onKeyDown); } - componentWillUnmount() { + public componentWillUnmount(): void { dis.unregister(this.dispatcherRef); document.removeEventListener("keydown", this.onKeyDown); } - onKeyDown = (ev) => { + private onKeyDown = (ev: KeyboardEvent): void => { if (ev.key === Key.ESCAPE) { ev.stopPropagation(); ev.preventDefault(); @@ -70,17 +73,17 @@ export default class IntegrationManager extends React.Component { } }; - onAction = (payload) => { + private onAction = (payload: ActionPayload): void => { if (payload.action === 'close_scalar') { this.props.onFinished(); } }; - onError = () => { + private onError = (): void => { this.setState({ errored: true }); }; - render() { + public render(): JSX.Element { if (this.props.loading) { const Spinner = sdk.getComponent("elements.Spinner"); return ( From 2e1d5aa67bd1688544c26d2180c89a467c87807f Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Sat, 14 Aug 2021 11:36:12 +0200 Subject: [PATCH 126/619] Migrate ProfileSettings to TypeScript --- ...ProfileSettings.js => ProfileSettings.tsx} | 61 +++++++++++-------- 1 file changed, 37 insertions(+), 24 deletions(-) rename src/components/views/settings/{ProfileSettings.js => ProfileSettings.tsx} (83%) diff --git a/src/components/views/settings/ProfileSettings.js b/src/components/views/settings/ProfileSettings.tsx similarity index 83% rename from src/components/views/settings/ProfileSettings.js rename to src/components/views/settings/ProfileSettings.tsx index d05fca983c..888ff8967b 100644 --- a/src/components/views/settings/ProfileSettings.js +++ b/src/components/views/settings/ProfileSettings.tsx @@ -1,5 +1,5 @@ /* -Copyright 2019 New Vector Ltd +Copyright 2019-2021 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,10 +26,25 @@ import ErrorDialog from "../dialogs/ErrorDialog"; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { mediaFromMxc } from "../../../customisations/Media"; +interface IProps { + +} + +interface IState { + userId?: string; + originalDisplayName?: string; + displayName?: string; + originalAvatarUrl?: string; + avatarUrl?: string | ArrayBuffer; + avatarFile?: File; + enableProfileSave?: boolean; +} + @replaceableComponent("views.settings.ProfileSettings") -export default class ProfileSettings extends React.Component { - constructor() { - super(); +export default class ProfileSettings extends React.Component { + private avatarUpload: React.RefObject = createRef(); + constructor(props: IProps) { + super(props); const client = MatrixClientPeg.get(); let avatarUrl = OwnProfileStore.instance.avatarMxc; @@ -43,17 +58,15 @@ export default class ProfileSettings extends React.Component { avatarFile: null, enableProfileSave: false, }; - - this._avatarUpload = createRef(); } - _uploadAvatar = () => { - this._avatarUpload.current.click(); + private uploadAvatar = (): void => { + this.avatarUpload.current.click(); }; - _removeAvatar = () => { + private removeAvatar = (): void => { // clear file upload field so same file can be selected - this._avatarUpload.current.value = ""; + this.avatarUpload.current.value = ""; this.setState({ avatarUrl: null, avatarFile: null, @@ -61,7 +74,7 @@ export default class ProfileSettings extends React.Component { }); }; - _cancelProfileChanges = async (e) => { + private cancelProfileChanges = async (e: React.MouseEvent): Promise => { e.stopPropagation(); e.preventDefault(); @@ -74,7 +87,7 @@ export default class ProfileSettings extends React.Component { }); }; - _saveProfile = async (e) => { + private saveProfile = async (e: React.FormEvent): Promise => { e.stopPropagation(); e.preventDefault(); @@ -82,7 +95,7 @@ export default class ProfileSettings extends React.Component { this.setState({ enableProfileSave: false }); const client = MatrixClientPeg.get(); - const newState = {}; + const newState: IState = {}; const displayName = this.state.displayName.trim(); try { @@ -115,14 +128,14 @@ export default class ProfileSettings extends React.Component { this.setState(newState); }; - _onDisplayNameChanged = (e) => { + private onDisplayNameChanged = (e: React.ChangeEvent): void => { this.setState({ displayName: e.target.value, enableProfileSave: true, }); }; - _onAvatarChanged = (e) => { + private onAvatarChanged = (e: React.ChangeEvent): void => { if (!e.target.files || !e.target.files.length) { this.setState({ avatarUrl: this.state.originalAvatarUrl, @@ -144,7 +157,7 @@ export default class ProfileSettings extends React.Component { reader.readAsDataURL(file); }; - render() { + public render(): JSX.Element { const hostingSignupLink = getHostingLink('user-settings'); let hostingSignup = null; if (hostingSignupLink) { @@ -165,16 +178,16 @@ export default class ProfileSettings extends React.Component { const AvatarSetting = sdk.getComponent('settings.AvatarSetting'); return (
    @@ -185,7 +198,7 @@ export default class ProfileSettings extends React.Component { type="text" value={this.state.displayName} autoComplete="off" - onChange={this._onDisplayNameChanged} + onChange={this.onDisplayNameChanged} />

    { this.state.userId } @@ -196,19 +209,19 @@ export default class ProfileSettings extends React.Component { avatarUrl={this.state.avatarUrl} avatarName={this.state.displayName || this.state.userId} avatarAltText={_t("Profile picture")} - uploadAvatar={this._uploadAvatar} - removeAvatar={this._removeAvatar} /> + uploadAvatar={this.uploadAvatar} + removeAvatar={this.removeAvatar} />

    { _t("Cancel") } From d879fb227095e4b98f7ac5537745a87ecb03f180 Mon Sep 17 00:00:00 2001 From: Safa Alfulaij Date: Fri, 13 Aug 2021 18:33:33 +0000 Subject: [PATCH 127/619] Translated using Weblate (Arabic) Currently translated at 45.2% (1422 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ar/ --- src/i18n/strings/ar.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index a14e6f8ce8..aa43a5f789 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -128,8 +128,8 @@ "AM": "ص", "%(weekDayName)s %(time)s": "%(weekDayName)s ‏%(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s، ‏%(day)s %(monthName)s %(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s، ‏%(day)s %(monthName)s %(fullYear)s ‏%(time)s", "Who would you like to add to this community?": "مَن تريد إضافته إلى هذا المجتمع؟", "Warning: any person you add to a community will be publicly visible to anyone who knows the community ID": "تحذير: كلّ من تُضيفه إلى أحد المجتمعات سيكون ظاهرًا لكل من يعرف معرّف المجتمع", "Invite new community members": "ادعُ أعضاء جدد إلى المجتمع", @@ -1040,7 +1040,7 @@ "Cross-signing is not set up.": "لم يتم إعداد التوقيع المتبادل.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "يحتوي حسابك على هوية توقيع متبادل في وحدة تخزين سرية ، لكن هذا الاتصال لم يثق به بعد.", "Cross-signing is ready for use.": "التوقيع المتبادل جاهز للاستخدام.", - "Your homeserver does not support cross-signing.": "خادمك الوسيط لا يدعم التوقيع المتبادل (cross-signing).", + "Your homeserver does not support cross-signing.": "خادوم المنزل الذي تستعمل لا يدعم التوقيع المتبادل (cross-signing).", "Change Password": "تغيير كلمة المرور", "Confirm password": "تأكيد كلمة المرور", "New Password": "كلمة مرور جديدة", @@ -1558,9 +1558,9 @@ "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "يتلقى مديرو التكامل بيانات الضبط ، ويمكنهم تعديل عناصر واجهة المستخدم ، وإرسال دعوات الغرف ، وتعيين مستويات القوة نيابة عنك.", "Use an integration manager to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "استخدم مدير التكامل (%(serverName)s) لإدارة الروبوتات وعناصر الواجهة وحزم الملصقات.", - "Identity server": "خادم الهوية", - "Identity server (%(server)s)": "خادمة الهوية (%(server)s)", - "Could not connect to identity server": "تعذر الاتصال بخادم هوية", - "Not a valid identity server (status code %(code)s)": "خادم هوية مردود (رقم الحال %(code)s)", - "Identity server URL must be HTTPS": "يجب أن يكون رابط (URL) خادم الهوية HTTPS" + "Identity server": "خادوم الهوية", + "Identity server (%(server)s)": "خادوم الهوية (%(server)s)", + "Could not connect to identity server": "تعذر الاتصال بخادوم الهوية", + "Not a valid identity server (status code %(code)s)": "ليس خادوم هوية صالح (رمز الحالة %(code)s)", + "Identity server URL must be HTTPS": "يجب أن يستعمل رابط (URL) خادوم الهوية ميفاق HTTPS" } From 3a32450492ce012cee2a7bede15e8403e13b7f46 Mon Sep 17 00:00:00 2001 From: Timo Gurr Date: Sun, 15 Aug 2021 05:32:05 +0000 Subject: [PATCH 128/619] Translated using Weblate (German) Currently translated at 95.4% (3000 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 991dd312bc..122f698dec 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -3519,5 +3519,7 @@ "Start sharing your screen": "Bildschirmfreigabe starten", "Stop sharing your screen": "Bildschirmfreigabe beenden", "Don't send read receipts": "Sende keine Lesebestätigungen", - "Send pseudonymous analytics data": "Sende pseudonymisierte Nutzungsdaten" + "Send pseudonymous analytics data": "Sende pseudonymisierte Nutzungsdaten", + "Your camera is still enabled": "Deine Kamera ist noch aktiviert", + "Your camera is turned off": "Deine Kamera ist ausgeschaltet" } From 51ba54f8d899c1605d4cd18bfaafd65397076f46 Mon Sep 17 00:00:00 2001 From: Michael Sasser Date: Sun, 15 Aug 2021 05:30:01 +0000 Subject: [PATCH 129/619] Translated using Weblate (German) Currently translated at 95.4% (3000 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 122f698dec..80d7959dff 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1424,7 +1424,7 @@ "Cancel entering passphrase?": "Eingabe der Passphrase abbrechen?", "Setting up keys": "Einrichten der Schlüssel", "Encryption upgrade available": "Verschlüsselungsaufstufung verfügbar", - "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und die öffentlichen Schlüsselpaare", + "Verifies a user, session, and pubkey tuple": "Verifiziert Benutzer, Sitzung und öffentlichen Schlüsselpaare", "Unknown (user, session) pair:": "Unbekanntes Nutzer-/Sitzungspaar:", "Session already verified!": "Sitzung bereits verifiziert!", "WARNING: Session already verified, but keys do NOT MATCH!": "WARNUNG: Die Sitzung wurde bereits verifiziert, aber die Schlüssel passen NICHT ZUSAMMEN!", From 1e53e19f0be89c7cb23f0430d3f4a33fff5b758d Mon Sep 17 00:00:00 2001 From: libexus Date: Sun, 15 Aug 2021 05:37:35 +0000 Subject: [PATCH 130/619] Translated using Weblate (German) Currently translated at 95.6% (3004 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 80d7959dff..1422915473 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -645,7 +645,7 @@ "Clear filter": "Filter zurücksetzen", "Key request sent.": "Schlüsselanfrage gesendet.", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Wenn du einen Fehler via GitHub meldest, können Fehlerberichte uns helfen um das Problem zu finden. Sie enthalten Anwendungsdaten wie deinen Nutzernamen, Raum- und Gruppen-IDs und Aliase, die du besucht hast sowie Nutzernamen anderer Nutzer mit denen du schreibst. Sie enthalten keine Nachrichten.", - "Submit debug logs": "Fehlerberichte einreichen", + "Submit debug logs": "Fehlerbericht einreichen", "Code": "Code", "Opens the Developer Tools dialog": "Entwickler-Werkzeuge öffnen", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "Von %(displayName)s (%(userName)s) um %(dateTime)s gesehen", @@ -3369,7 +3369,7 @@ "Nothing pinned, yet": "Es ist nichts angepinnt. Noch nicht.", "End-to-end encryption isn't enabled": "Ende-zu-Ende-Verschlüsselung ist deaktiviert", "See when people join, leave, or are invited to your active room": "Anzeigen, wenn Leute den aktuellen Raum betreten, verlassen oder in ihn eingeladen werden", - "Teammates might not be able to view or join any private rooms you make.": "Mitglieder werden private Räume möglicherweise weder sehen noch betreten können.", + "Teammates might not be able to view or join any private rooms you make.": "Mitglieder werden private Räume möglicherweise weder anzeigen noch betreten können.", "Error - Mixed content": "Fehler - Uneinheitlicher Inhalt", "Kick, ban, or invite people to your active room, and make you leave": "Den aktiven Raum verlassen, Leute einladen, entfernen oder bannen", "Kick, ban, or invite people to this room, and make you leave": "Diesen Raum verlassen, Leute einladen, entfernen oder bannen", @@ -3520,6 +3520,6 @@ "Stop sharing your screen": "Bildschirmfreigabe beenden", "Don't send read receipts": "Sende keine Lesebestätigungen", "Send pseudonymous analytics data": "Sende pseudonymisierte Nutzungsdaten", - "Your camera is still enabled": "Deine Kamera ist noch aktiviert", + "Your camera is still enabled": "Deine Kamera ist noch aktiv", "Your camera is turned off": "Deine Kamera ist ausgeschaltet" } From 2f308b139ca2a727eb82d23aaaa7353aad185800 Mon Sep 17 00:00:00 2001 From: Timo Gurr Date: Sun, 15 Aug 2021 05:37:05 +0000 Subject: [PATCH 131/619] Translated using Weblate (German) Currently translated at 95.6% (3004 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 1422915473..05ca1a0587 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -402,7 +402,7 @@ "Featured Rooms:": "Hervorgehobene Räume:", "Featured Users:": "Hervorgehobene Benutzer:", "Automatically replace plain text Emoji": "Klartext-Emoji automatisch ersetzen", - "Failed to upload image": "Bild-Hochladen fehlgeschlagen", + "Failed to upload image": "Hochladen des Bildes fehlgeschlagen", "AM": "a. m.", "PM": "p. m.", "The maximum permitted number of widgets have already been added to this room.": "Die maximal erlaubte Anzahl an hinzufügbaren Widgets für diesen Raum wurde erreicht.", @@ -3521,5 +3521,10 @@ "Don't send read receipts": "Sende keine Lesebestätigungen", "Send pseudonymous analytics data": "Sende pseudonymisierte Nutzungsdaten", "Your camera is still enabled": "Deine Kamera ist noch aktiv", - "Your camera is turned off": "Deine Kamera ist ausgeschaltet" + "Your camera is turned off": "Deine Kamera ist ausgeschaltet", + "Missed call": "Verpasster Anruf", + "Call declined": "Anruf abgelehnt", + "Dialpad": "Telefontastatur", + "Stop the camera": "Kamera stoppen", + "Start the camera": "Kamera starten" } From 2ca616c2399ad1f2522d192f6659a919bc70be70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 16 Aug 2021 10:15:54 +0200 Subject: [PATCH 132/619] Format autocomplete suggestions vertically MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_Autocomplete.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/res/css/views/rooms/_Autocomplete.scss b/res/css/views/rooms/_Autocomplete.scss index f8e0a382b1..f87bb571d6 100644 --- a/res/css/views/rooms/_Autocomplete.scss +++ b/res/css/views/rooms/_Autocomplete.scss @@ -60,7 +60,7 @@ .mx_Autocomplete_Completion_container_pill { margin: 12px; display: flex; - flex-flow: wrap; + flex-direction: column; } .mx_Autocomplete_Completion_container_truncate { @@ -68,7 +68,6 @@ .mx_Autocomplete_Completion_subtitle, .mx_Autocomplete_Completion_description { /* Ellipsis for long names/subtitles/descriptions */ - max-width: 150px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; From 800b3f1424d1aa24e6fa5663968fb6b65dc521ab Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 16 Aug 2021 09:16:02 +0100 Subject: [PATCH 133/619] Fix linter --- src/components/structures/RoomView.tsx | 3 +-- src/components/views/settings/ChangeAvatar.tsx | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 474b99262d..31aa8d50fa 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -1867,7 +1867,7 @@ export default class RoomView extends React.Component { isRoomEncrypted={this.context.isRoomEncrypted(this.state.room.roomId)} />; } else if (showRoomUpgradeBar) { - aux = ; + aux = ; } else if (myMembership !== "join") { // We do have a room object for this room, but we're not currently in it. // We may have a 3rd party invite to it. @@ -2042,7 +2042,6 @@ export default class RoomView extends React.Component { highlight={this.state.room.getUnreadNotificationCount(NotificationCountType.Highlight) > 0} numUnreadMessages={this.state.numUnreadMessages} onScrollToBottomClick={this.jumpToLiveTimeline} - roomId={this.state.roomId} />); } diff --git a/src/components/views/settings/ChangeAvatar.tsx b/src/components/views/settings/ChangeAvatar.tsx index 6394bad3de..92ff34fbcb 100644 --- a/src/components/views/settings/ChangeAvatar.tsx +++ b/src/components/views/settings/ChangeAvatar.tsx @@ -71,7 +71,8 @@ export default class ChangeAvatar extends React.Component { } // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - public UNSAFE_componentWillReceiveProps(newProps): void { // eslint-disable-line camelcase + // eslint-disable-next-line + public UNSAFE_componentWillReceiveProps(newProps): void { if (this.avatarSet) { // don't clobber what the user has just set return; From 02ece401031092e3e08ae5e410c53a09048aaba2 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 16 Aug 2021 09:19:58 +0100 Subject: [PATCH 134/619] Fix import path on ChangeAvatar --- src/components/views/settings/ChangeAvatar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/settings/ChangeAvatar.tsx b/src/components/views/settings/ChangeAvatar.tsx index 92ff34fbcb..7a3e639876 100644 --- a/src/components/views/settings/ChangeAvatar.tsx +++ b/src/components/views/settings/ChangeAvatar.tsx @@ -16,13 +16,13 @@ limitations under the License. */ import React from 'react'; +import { MatrixEvent, Room } from 'matrix-js-sdk/src'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import Spinner from '../elements/Spinner'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { mediaFromMxc } from "../../../customisations/Media"; -import { MatrixEvent, Room } from '../../../../../matrix-js-sdk/src'; interface IProps { initialAvatarUrl?: string; From 7aa5674f9623555db16aa237351d8fd575b23dd3 Mon Sep 17 00:00:00 2001 From: jelv Date: Mon, 16 Aug 2021 05:42:42 +0000 Subject: [PATCH 135/619] Translated using Weblate (Dutch) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1a51383d50..9393629ccd 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3561,5 +3561,6 @@ " has been made and everyone who was a part of the community has been invited to it.": " is gemaakt en iedereen die lid was van de gemeenschap is ervoor uitgenodigd.", "Space created": "Space aangemaakt", "To view Spaces, hide communities in Preferences": "Om Spaces te zien, verberg gemeenschappen in uw Instellingen", - "This community has been upgraded into a Space": "Deze gemeenschap is geupgrade naar een Space" + "This community has been upgraded into a Space": "Deze gemeenschap is geupgrade naar een Space", + "Unknown failure: %(reason)s": "Onbekende fout: %(reason)s" } From dd75fcc2ac3dcbead9ca78b5dc8e97fe86945439 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 16 Aug 2021 08:07:22 +0000 Subject: [PATCH 136/619] Translated using Weblate (Swedish) Currently translated at 96.1% (3020 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 8e564e06ed..04e0a8c50f 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3452,5 +3452,27 @@ "Visibility": "Synlighet", "This may be useful for public spaces.": "Det här kan vara användbart för ett offentligt utrymme.", "Guests can join a space without having an account.": "Gäster kan gå med i ett utrymme utan att ha ett konto.", - "Enable guest access": "Aktivera gäståtkomst" + "Enable guest access": "Aktivera gäståtkomst", + "Stop recording": "Stoppa inspelning", + "Copy Room Link": "Kopiera rumslänk", + "You can now share your screen by pressing the \"screen share\" button during a call. You can even do this in audio calls if both sides support it!": "Du kan nu dela din skärm genom att klicka på skärmdelningsknappen under ett samtal. Du kan till och med göra detta under ett ljudsamtal om båda ändar stöder det!", + "Screen sharing is here!": "Skärmdelning är här!", + "Send voice message": "Skicka röstmeddelande", + "Show %(count)s other previews|one": "Visa %(count)s annan förhandsgranskning", + "Show %(count)s other previews|other": "Visa %(count)s andra förhandsgranskningar", + "Access": "Åtkomst", + "People with supported clients will be able to join the room without having a registered account.": "Personer med stödda klienter kommer kunna gå med i rummet utan ett registrerat konto.", + "Decide who can join %(roomName)s.": "Bestäm vem som kan gå med i %(roomName)s.", + "Space members": "Utrymmesmedlemmar", + "Anyone in a space can find and join. You can select multiple spaces.": "Vem som helst i ett utrymme kan hitta och gå med. Du kan välja flera utrymmen.", + "Anyone in %(spaceName)s can find and join. You can select other spaces too.": "Vem som helst i %(spaceName)s kan hitta och gå med. Du kan välja andra utrymmen också.", + "Spaces with access": "Utrymmen med åtkomst", + "Anyone in a space can find and join. Edit which spaces can access here.": "Vem som helst i ett utrymme kan hitta och gå med. Redigera vilka utrymmen som kan komma åt här.", + "Currently, %(count)s spaces have access|other": "Just nu har %(count)s utrymmen åtkomst", + "& %(count)s more|other": "& %(count)s till", + "Upgrade required": "Uppgradering krävs", + "Anyone can find and join.": "Vem som helst kan hitta och gå med.", + "Only invited people can join.": "Endast inbjudna personer kan gå med.", + "Private (invite only)": "Privat (endast inbjudan)", + "This upgrade will allow members of selected spaces access to this room without an invite.": "Den här uppgraderingen kommer att låta medlemmar i valda utrymmen komma åt det här rummet utan en inbjudan." } From 3310cc542781e9ae9cb902222c3ab3a2ff6d140b Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Mon, 16 Aug 2021 01:45:24 +0000 Subject: [PATCH 137/619] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 9867989224..6f06969051 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3676,5 +3676,6 @@ "To join an existing space you'll need an invite.": "要加入現有的空間,您必須獲得邀請。", "You can also create a Space from a community.": "您也可以從社群建立空間。", "You can change this later.": "您可以在稍後變更此設定。", - "What kind of Space do you want to create?": "您想建立什麼樣的空間?" + "What kind of Space do you want to create?": "您想建立什麼樣的空間?", + "Unknown failure: %(reason)s": "未知錯誤:%(reason)s" } From bbd70ada81582b260d9f1b1822076b2527b21d47 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Mon, 16 Aug 2021 05:29:13 +0000 Subject: [PATCH 138/619] Translated using Weblate (Czech) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index c09493fa23..e6cda5cb4b 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3591,5 +3591,6 @@ "What kind of Space do you want to create?": "Jaký druh prostoru chcete vytvořit?", "Open Space": "Otevřít prostor", "To join an existing space you'll need an invite.": "Chcete-li se připojit k existujícímu prostoru, potřebujete pozvánku.", - "You can change this later.": "Toto můžete změnit později." + "You can change this later.": "Toto můžete změnit později.", + "Unknown failure: %(reason)s": "Neznámá chyba: %(reason)s" } From f1993a5886b86414d74bbe393763d8e08762338d Mon Sep 17 00:00:00 2001 From: random Date: Mon, 16 Aug 2021 11:13:34 +0000 Subject: [PATCH 139/619] Translated using Weblate (Italian) Currently translated at 99.9% (3141 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 8d15449973..febeab8678 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3644,5 +3644,34 @@ "Stop sharing your screen": "Ferma la condivisione dello schermo", "Stop the camera": "Ferma la fotocamera", "Start the camera": "Avvia la fotocamera", - "Surround selected text when typing special characters": "Circonda il testo selezionato quando si digitano caratteri speciali" + "Surround selected text when typing special characters": "Circonda il testo selezionato quando si digitano caratteri speciali", + "Created from ": "Creato da ", + "Communities won't receive further updates.": "Le comunità non riceveranno altri aggiornamenti.", + "Spaces are a new way to make a community, with new features coming.": "Gli spazi sono un nuovo modo di creare una comunità, con nuove funzioni in arrivo.", + "Communities can now be made into Spaces": "Le comunità ora possono diventare spazi", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Chiedi agli amministratori di questa comunità di renderla uno spazio e di tenere d'occhio l'invito.", + "You can create a Space from this community here.": "Puoi creare uno spazio da questa comunità qui.", + "This description will be shown to people when they view your space": "Questa descrizione verrà mostrata alle persone quando vedono il tuo spazio", + "Flair won't be available in Spaces for the foreseeable future.": "Le predisposizioni non saranno disponibili negli spazi per l'immediato futuro.", + "All rooms will be added and all community members will be invited.": "Tutte le stanze verranno aggiunte e tutti i membri della comunità saranno invitati.", + "A link to the Space will be put in your community description.": "Un collegamento allo spazio verrà inserito nella descrizione della tua comunità.", + "Create Space from community": "Crea spazio da comunità", + "Failed to migrate community": "Migrazione delle comunità fallita", + "To create a Space from another community, just pick the community in Preferences.": "Per creare uno spazio da un'altra comunità, scegli la comunità nelle preferenze.", + " has been made and everyone who was a part of the community has been invited to it.": " è stato creato e chiunque facesse parte della comunità è stato invitato.", + "Space created": "Spazio creato", + "To view Spaces, hide communities in Preferences": "Per vedere gli spazi, nascondi le comunità nelle preferenze", + "This community has been upgraded into a Space": "La comunità è stata aggiornata in uno spazio", + "Unknown failure: %(reason)s": "Malfunzionamento sconosciuto: %(reason)s", + "If a community isn't shown you may not have permission to convert it.": "Se una comunità non è mostrata, potresti non avere il permesso di convertirla.", + "Show my Communities": "Mostra le mie comunità", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Le comunità sono state archiviate per introdurre gli spazi, ma puoi convertirle in spazi qua sotto. La conversione assicurerà che le tue conversazioni otterranno le funzionalità più recenti.", + "Create Space": "Crea spazio", + "Open Space": "Apri spazio", + "To join an existing space you'll need an invite.": "Per entrare in uno spazio esistente ti serve un invito.", + "You can also create a Space from a community.": "Puoi anche creare uno spazio da una comunità.", + "You can change this later.": "Puoi cambiarlo in seguito.", + "What kind of Space do you want to create?": "Che tipo di spazio vuoi creare?", + "Delete avatar": "Elimina avatar", + "Don't send read receipts": "Non inviare ricevute di lettura" } From 582b5c90a4d027df2cc8b19038bd369ac900cf6a Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 16 Aug 2021 14:26:21 +0200 Subject: [PATCH 140/619] Properly sepearate left column from timeline --- res/css/_components.scss | 1 + res/css/structures/_BackdropPanel.scss | 33 +++++++++++++++++++++ res/css/structures/_LeftPanel.scss | 1 - res/css/structures/_MatrixChat.scss | 16 ++-------- res/css/structures/_RoomView.scss | 2 ++ src/components/structures/BackdropPanel.tsx | 6 ++-- src/components/structures/LoggedInView.tsx | 2 +- 7 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 res/css/structures/_BackdropPanel.scss diff --git a/res/css/_components.scss b/res/css/_components.scss index 035caec36a..f6c6363046 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -17,6 +17,7 @@ @import "./structures/_LeftPanelWidget.scss"; @import "./structures/_MainSplit.scss"; @import "./structures/_MatrixChat.scss"; +@import "./structures/_BackdropPanel.scss"; @import "./structures/_MyGroups.scss"; @import "./structures/_NonUrgentToastContainer.scss"; @import "./structures/_NotificationPanel.scss"; diff --git a/res/css/structures/_BackdropPanel.scss b/res/css/structures/_BackdropPanel.scss new file mode 100644 index 0000000000..3415a49d2e --- /dev/null +++ b/res/css/structures/_BackdropPanel.scss @@ -0,0 +1,33 @@ +/* +Copyright 2021 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_BackdropPanel { + position: absolute; + left: 0; + top: 0; + height: 100vh; + width: 100%; +} + +.mx_BackdropPanel--canvas { + position: absolute; + top: 0; + left: 0; + min-height: 100%; + z-index: 0; + pointer-events: none; + overflow: hidden; +} diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index 4bd6b1e816..f0203f6905 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -20,7 +20,6 @@ $roomListCollapsedWidth: 68px; .mx_LeftPanel { // TODO decrease this once Spaces launches as it'll no longer need to include the 56px Community Panel min-width: 206px; - max-width: 50%; // Create a row-based flexbox for the GroupFilterPanel and the room list display: flex; diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index 77dc5f4454..43bf1b9c3c 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -29,22 +29,10 @@ limitations under the License. .mx_MatrixChat_wrapper { display: flex; - flex-direction: column; - width: 100%; height: 100%; } -.mx_BackdropPanel { - position: absolute; - top: 0; - left: 0; - min-height: 100%; - z-index: 0; - pointer-events: none; - overflow: hidden; -} - .mx_MatrixToolbar { order: 1; @@ -57,10 +45,10 @@ limitations under the License. display: flex; - order: 2; - flex: 1; + flex-grow: 0; min-height: 0; + max-width: 50%; } .mx_MatrixChat_syncError { diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss index 831f186ed4..84f28b5ada 100644 --- a/res/css/structures/_RoomView.scss +++ b/res/css/structures/_RoomView.scss @@ -18,6 +18,8 @@ limitations under the License. word-wrap: break-word; display: flex; flex-direction: column; + flex: 1; + position: relative; } diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 1242835450..c1c1e784aa 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -131,10 +131,10 @@ export default class BackdropPanel extends React.PureComponent { public render() { if (!this.props.backgroundImage) return null; - return
    + return
    { opacity: .12, }} ref={this.roomListCanvasRef} - className="mx_BackdropPanel" + className="mx_BackdropPanel--canvas" />
    ; } diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 62e6f57780..2371aec384 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -644,8 +644,8 @@ class LoggedInView extends React.Component { resizeNotifier={this.props.resizeNotifier} /> - { pageElement }
    + { pageElement }
    From 1bbc2d67904dd09d1ed8afdd0de2e54e5919dbfb Mon Sep 17 00:00:00 2001 From: Glandos Date: Mon, 16 Aug 2021 12:54:40 +0000 Subject: [PATCH 141/619] Translated using Weblate (French) Currently translated at 99.9% (3139 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index f5e04a6581..873cbc9f9f 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -3620,5 +3620,35 @@ "Stop sharing your screen": "Arrêter de partager mon écran", "Stop the camera": "Arrêter la caméra", "Start the camera": "Démarrer la caméra", - "Surround selected text when typing special characters": "Entourer le texte sélectionné lors de la saisie de certains caractères" + "Surround selected text when typing special characters": "Entourer le texte sélectionné lors de la saisie de certains caractères", + "Created from ": "Créé à partir de ", + "Communities won't receive further updates.": "Les communautés ne recevront plus de mises-à-jour.", + "Spaces are a new way to make a community, with new features coming.": "Les espaces sont une nouvelle manière de créer une communauté, avec l’apparition de nouvelles fonctionnalités.", + "Communities can now be made into Spaces": "Les communautés peuvent maintenant être transformées en espaces", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Demandez aux administrateurs de cette communauté de la transformer en espace et attendez l’invitation.", + "You can create a Space from this community here.": "Vous pouvez créer un espace à partir de cette communauté ici.", + "This description will be shown to people when they view your space": "Cette description sera affichée aux personnes qui verront votre espace", + "Flair won't be available in Spaces for the foreseeable future.": "Les badges ne seront pas disponibles pour les espaces dans un futur proche.", + "All rooms will be added and all community members will be invited.": "Tous les salons seront ajoutés et tous les membres de la communauté seront invités.", + "A link to the Space will be put in your community description.": "A lien vers l’espace sera ajouté dans la description de votre communauté.", + "Create Space from community": "Créer un espace à partir d’une communauté", + "Failed to migrate community": "Échec lors de la migration de la communauté", + "To create a Space from another community, just pick the community in Preferences.": "Pour créer un espace à partir d’une autre communauté, choisissez là simplement dans les préférences.", + " has been made and everyone who was a part of the community has been invited to it.": " a été créé et tous ceux qui faisaient partie de la communauté y ont été invités.", + "Space created": "Espace créé", + "To view Spaces, hide communities in Preferences": "Pour voir les espaces, cachez les communautés dans les préférences", + "This community has been upgraded into a Space": "Cette communauté a été mise-à-jour vers un espace", + "Unknown failure: %(reason)s": "Erreur inconnue : %(reason)s", + "No answer": "Pas de réponse", + "If a community isn't shown you may not have permission to convert it.": "Si une communauté n’est pas affichée, vous n’avez peut-être pas le droit de la convertir.", + "Show my Communities": "Afficher mes communautés", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Les communautés ont été archivés pour faire place aux espaces mais il est possible de convertir vos communautés en espaces ci-dessous. La conversion garantira à vos conversions l’accès aux fonctionnalités les plus récentes.", + "Create Space": "Créer l’espace", + "Open Space": "Ouvrir l’espace", + "To join an existing space you'll need an invite.": "Vous aurez besoin d’une invitation pour rejoindre un espace existant.", + "You can also create a Space from a community.": "Vous pouvez également créer un espace à partir d’une communauté.", + "You can change this later.": "Vous pourrez changer ceci plus tard.", + "What kind of Space do you want to create?": "Quel type d’espace voulez-vous créer ?", + "Delete avatar": "Supprimer l’avatar", + "Don't send read receipts": "Ne pas envoyer les accusés de réception" } From f24bc268ea3868cd38bac545adad60d8bb627ebb Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 16 Aug 2021 12:37:38 +0000 Subject: [PATCH 142/619] Translated using Weblate (Swedish) Currently translated at 96.1% (3021 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 04e0a8c50f..b5ef89896f 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3474,5 +3474,6 @@ "Anyone can find and join.": "Vem som helst kan hitta och gå med.", "Only invited people can join.": "Endast inbjudna personer kan gå med.", "Private (invite only)": "Privat (endast inbjudan)", - "This upgrade will allow members of selected spaces access to this room without an invite.": "Den här uppgraderingen kommer att låta medlemmar i valda utrymmen komma åt det här rummet utan en inbjudan." + "This upgrade will allow members of selected spaces access to this room without an invite.": "Den här uppgraderingen kommer att låta medlemmar i valda utrymmen komma åt det här rummet utan en inbjudan.", + "This space has no local addresses": "Det här utrymmet har inga lokala adresser" } From bad37e65db1984b0ee02b05f0f24ba0b6ac5d032 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 16 Aug 2021 16:52:32 +0200 Subject: [PATCH 143/619] Add missing position:relative; --- res/css/structures/_MatrixChat.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index 43bf1b9c3c..c837aee791 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -40,6 +40,7 @@ limitations under the License. } .mx_MatrixChat { + position: relative; width: 100%; height: 100%; From a2797795b2f9731a3a67d67a8667ca98b5466921 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 16 Aug 2021 16:52:41 +0200 Subject: [PATCH 144/619] Add proper glass-like look --- res/css/structures/_BackdropPanel.scss | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/res/css/structures/_BackdropPanel.scss b/res/css/structures/_BackdropPanel.scss index 3415a49d2e..3bcceb1d55 100644 --- a/res/css/structures/_BackdropPanel.scss +++ b/res/css/structures/_BackdropPanel.scss @@ -20,6 +20,16 @@ limitations under the License. top: 0; height: 100vh; width: 100%; + + &:before { + content: ' '; + position: absolute; + left: 0; + top: 0; + height: 100vh; + width: 100%; + background-color: rgba(255, 255, 255, .02); + } } .mx_BackdropPanel--canvas { @@ -30,4 +40,11 @@ limitations under the License. z-index: 0; pointer-events: none; overflow: hidden; + + &:first-of-type { + opacity: 0.19; + } + &:last-of-type { + opacity:0.12; + } } From d8f58e95cb9553c74d98f1ed3a16837c5a7001ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 16 Aug 2021 18:34:59 +0200 Subject: [PATCH 145/619] Use the secondary color for all MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/messages/_CallEvent.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/messages/_CallEvent.scss b/res/css/views/messages/_CallEvent.scss index 2d9caf1569..cd583ef4f2 100644 --- a/res/css/views/messages/_CallEvent.scss +++ b/res/css/views/messages/_CallEvent.scss @@ -41,7 +41,7 @@ limitations under the License. height: 16px; width: 16px; - background-color: $tertiary-fg-color; + background-color: $secondary-fg-color; mask-repeat: no-repeat; mask-size: contain; mask-position: center; @@ -126,7 +126,7 @@ limitations under the License. position: absolute; height: 13px; width: 13px; - background-color: $tertiary-fg-color; + background-color: $secondary-fg-color; mask-repeat: no-repeat; mask-size: contain; } From 3fdf4d13ca3af53966ae2c4083ce5dc1bd4dd3dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 17 Aug 2021 09:48:25 +0200 Subject: [PATCH 146/619] Proper init in constructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/LoggedInView.tsx | 2 +- src/components/views/voip/AudioFeedArrayForCall.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 2392a8b28d..85fca1ae77 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -156,7 +156,7 @@ class LoggedInView extends React.Component { // use compact timeline view useCompactLayout: SettingsStore.getValue('useCompactLayout'), usageLimitDismissed: false, - activeCalls: [], + activeCalls: CallHandler.sharedInstance().getAllActiveCalls(), }; // stash the MatrixClient in case we log out before we are unmounted diff --git a/src/components/views/voip/AudioFeedArrayForCall.tsx b/src/components/views/voip/AudioFeedArrayForCall.tsx index 958ac2a8d4..a7dd0283ff 100644 --- a/src/components/views/voip/AudioFeedArrayForCall.tsx +++ b/src/components/views/voip/AudioFeedArrayForCall.tsx @@ -32,7 +32,7 @@ export default class AudioFeedArrayForCall extends React.Component Date: Tue, 17 Aug 2021 09:51:48 +0200 Subject: [PATCH 147/619] Properly listen for call_state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous thing should have never worked, since CallsChanged doesn't get emitted when a call is answered Signed-off-by: Šimon Brandner --- src/components/structures/LoggedInView.tsx | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 85fca1ae77..4a8b77abec 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -55,7 +55,7 @@ import { getKeyBindingsManager, NavigationAction, RoomAction } from '../../KeyBi import { IOpts } from "../../createRoom"; import SpacePanel from "../views/spaces/SpacePanel"; import { replaceableComponent } from "../../utils/replaceableComponent"; -import CallHandler, { CallHandlerEvent } from '../../CallHandler'; +import CallHandler from '../../CallHandler'; import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; import AudioFeedArrayForCall from '../views/voip/AudioFeedArrayForCall'; import RoomView from './RoomView'; @@ -142,6 +142,7 @@ interface IState { class LoggedInView extends React.Component { static displayName = 'LoggedInView'; + private dispatcherRef: string; protected readonly _matrixClient: MatrixClient; protected readonly _roomView: React.RefObject; protected readonly _resizeContainer: React.RefObject; @@ -172,7 +173,7 @@ class LoggedInView extends React.Component { componentDidMount() { document.addEventListener('keydown', this.onNativeKeyDown, false); - CallHandler.sharedInstance().addListener(CallHandlerEvent.CallsChanged, this.onCallsChanged); + this.dispatcherRef = dis.register(this.onAction); this.updateServerNoticeEvents(); @@ -197,7 +198,7 @@ class LoggedInView extends React.Component { componentWillUnmount() { document.removeEventListener('keydown', this.onNativeKeyDown, false); - CallHandler.sharedInstance().removeListener(CallHandlerEvent.CallsChanged, this.onCallsChanged); + dis.unregister(this.dispatcherRef); this._matrixClient.removeListener("accountData", this.onAccountData); this._matrixClient.removeListener("sync", this.onSync); this._matrixClient.removeListener("RoomState.events", this.onRoomStateEvents); @@ -205,10 +206,16 @@ class LoggedInView extends React.Component { this.resizer.detach(); } - private onCallsChanged = () => { - this.setState({ - activeCalls: CallHandler.sharedInstance().getAllActiveCalls(), - }); + private onAction = (payload): void => { + switch (payload.action) { + case 'call_state': { + const activeCalls = CallHandler.sharedInstance().getAllActiveCalls(); + if (activeCalls !== this.state.activeCalls) { + this.setState({ activeCalls }); + } + break; + } + } }; public canResetTimelineInRoom = (roomId: string) => { From 1d664f091431fd4303ea10b55857ebd8fe51f25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 17 Aug 2021 10:23:54 +0200 Subject: [PATCH 148/619] Explicitly handle first state change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/CallHandler.tsx | 165 +++++++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 79 deletions(-) diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index f2142f56f4..e11e828864 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -464,85 +464,7 @@ export default class CallHandler extends EventEmitter { this.removeCallForRoom(mappedRoomId); }); call.on(CallEvent.State, (newState: CallState, oldState: CallState) => { - if (!this.matchesCallForThisRoom(call)) return; - - this.setCallState(call, newState); - - switch (oldState) { - case CallState.Ringing: - this.pause(AudioID.Ring); - break; - case CallState.InviteSent: - this.pause(AudioID.Ringback); - break; - } - - if (newState !== CallState.Ringing) { - this.silencedCalls.delete(call.callId); - } - - switch (newState) { - case CallState.Ringing: { - const incomingCallPushRule = ( - new PushProcessor(MatrixClientPeg.get()).getPushRuleById(RuleId.IncomingCall) - ); - const pushRuleEnabled = incomingCallPushRule?.enabled; - const tweakSetToRing = incomingCallPushRule?.actions.some((action: Tweaks) => ( - action.set_tweak === TweakName.Sound && - action.value === "ring" - )); - - if (pushRuleEnabled && tweakSetToRing) { - this.play(AudioID.Ring); - } else { - this.silenceCall(call.callId); - } - break; - } - case CallState.InviteSent: { - this.play(AudioID.Ringback); - break; - } - case CallState.Ended: { - const hangupReason = call.hangupReason; - Analytics.trackEvent('voip', 'callEnded', 'hangupReason', hangupReason); - this.removeCallForRoom(mappedRoomId); - if (oldState === CallState.InviteSent && call.hangupParty === CallParty.Remote) { - this.play(AudioID.Busy); - - // Don't show a modal when we got rejected/the call was hung up - if (!hangupReason || [CallErrorCode.UserHangup, "user hangup"].includes(hangupReason)) break; - - let title; - let description; - // TODO: We should either do away with these or figure out a copy for each code (expect user_hangup...) - if (call.hangupReason === CallErrorCode.UserBusy) { - title = _t("User Busy"); - description = _t("The user you called is busy."); - } else { - title = _t("Call Failed"); - description = _t("The call could not be established"); - } - - Modal.createTrackedDialog('Call Handler', 'Call Failed', ErrorDialog, { - title, description, - }); - } else if ( - hangupReason === CallErrorCode.AnsweredElsewhere && oldState === CallState.Connecting - ) { - Modal.createTrackedDialog('Call Handler', 'Call Failed', ErrorDialog, { - title: _t("Answered Elsewhere"), - description: _t("The call was answered on another device."), - }); - } else if (oldState !== CallState.Fledgling && oldState !== CallState.Ringing) { - // don't play the end-call sound for calls that never got off the ground - this.play(AudioID.CallEnd); - } - - this.logCallStats(call, mappedRoomId); - break; - } - } + this.onCallStateChanged(newState, oldState, call); }); call.on(CallEvent.Replaced, (newCall: MatrixCall) => { if (!this.matchesCallForThisRoom(call)) return; @@ -598,6 +520,89 @@ export default class CallHandler extends EventEmitter { }); } + private onCallStateChanged = (newState: CallState, oldState: CallState, call: MatrixCall): void => { + if (!this.matchesCallForThisRoom(call)) return; + + const mappedRoomId = this.roomIdForCall(call); + this.setCallState(call, newState); + + switch (oldState) { + case CallState.Ringing: + this.pause(AudioID.Ring); + break; + case CallState.InviteSent: + this.pause(AudioID.Ringback); + break; + } + + if (newState !== CallState.Ringing) { + this.silencedCalls.delete(call.callId); + } + + switch (newState) { + case CallState.Ringing: { + const incomingCallPushRule = ( + new PushProcessor(MatrixClientPeg.get()).getPushRuleById(RuleId.IncomingCall) + ); + const pushRuleEnabled = incomingCallPushRule?.enabled; + const tweakSetToRing = incomingCallPushRule?.actions.some((action: Tweaks) => ( + action.set_tweak === TweakName.Sound && + action.value === "ring" + )); + + if (pushRuleEnabled && tweakSetToRing) { + this.play(AudioID.Ring); + } else { + this.silenceCall(call.callId); + } + break; + } + case CallState.InviteSent: { + this.play(AudioID.Ringback); + break; + } + case CallState.Ended: { + const hangupReason = call.hangupReason; + Analytics.trackEvent('voip', 'callEnded', 'hangupReason', hangupReason); + this.removeCallForRoom(mappedRoomId); + if (oldState === CallState.InviteSent && call.hangupParty === CallParty.Remote) { + this.play(AudioID.Busy); + + // Don't show a modal when we got rejected/the call was hung up + if (!hangupReason || [CallErrorCode.UserHangup, "user hangup"].includes(hangupReason)) break; + + let title; + let description; + // TODO: We should either do away with these or figure out a copy for each code (expect user_hangup...) + if (call.hangupReason === CallErrorCode.UserBusy) { + title = _t("User Busy"); + description = _t("The user you called is busy."); + } else { + title = _t("Call Failed"); + description = _t("The call could not be established"); + } + + Modal.createTrackedDialog('Call Handler', 'Call Failed', ErrorDialog, { + title, description, + }); + } else if ( + hangupReason === CallErrorCode.AnsweredElsewhere && oldState === CallState.Connecting + ) { + Modal.createTrackedDialog('Call Handler', 'Call Failed', ErrorDialog, { + title: _t("Answered Elsewhere"), + description: _t("The call was answered on another device."), + }); + } else if (oldState !== CallState.Fledgling && oldState !== CallState.Ringing) { + // don't play the end-call sound for calls that never got off the ground + this.play(AudioID.CallEnd); + } + + this.logCallStats(call, mappedRoomId); + break; + } + } + }; + private async logCallStats(call: MatrixCall, mappedRoomId: string) { const stats = await call.getCurrentCallStats(); logger.debug( @@ -861,6 +866,8 @@ export default class CallHandler extends EventEmitter { this.calls.set(mappedRoomId, call); this.emit(CallHandlerEvent.CallsChanged, this.calls); this.setCallListeners(call); + // Explicitly handle first state change + this.onCallStateChanged(call.state, null, call); // get ready to send encrypted events in the room, so if the user does answer // the call, we'll be ready to send. NB. This is the protocol-level room ID not From 2ea3166b6086854cd926917ba7a40d03167bd18e Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 17 Aug 2021 06:47:26 +0000 Subject: [PATCH 149/619] Translated using Weblate (Swedish) Currently translated at 96.7% (3041 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index b5ef89896f..968836a5ea 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3475,5 +3475,24 @@ "Only invited people can join.": "Endast inbjudna personer kan gå med.", "Private (invite only)": "Privat (endast inbjudan)", "This upgrade will allow members of selected spaces access to this room without an invite.": "Den här uppgraderingen kommer att låta medlemmar i valda utrymmen komma åt det här rummet utan en inbjudan.", - "This space has no local addresses": "Det här utrymmet har inga lokala adresser" + "This space has no local addresses": "Det här utrymmet har inga lokala adresser", + "Image": "Bild", + "Sticker": "Dekal", + "Error processing audio message": "Fel vid hantering av ljudmeddelande", + "Decrypting": "Avkrypterar", + "The call is in an unknown state!": "Det här samtalet är i ett okänt läge!", + "Missed call": "Missat samtal", + "Unknown failure: %(reason)s": "Okänt fel: %(reason)s", + "An unknown error occurred": "Ett okänt fel inträffade", + "Their device couldn't start the camera or microphone": "Deras enhet kunde inte starta kameran eller mikrofonen", + "Connection failed": "Anslutning misslyckad", + "Could not connect media": "Kunde inte ansluta media", + "No answer": "Inget svar", + "Call back": "Ring tillbaka", + "Call declined": "Samtal nekat", + "Connected": "Ansluten", + "Set addresses for this space so users can find this space through your homeserver (%(localDomain)s)": "Sätt adresser för det här utrymmet så att användare kan hitta det genom din hemserver (%(localDomain)s)", + "To publish an address, it needs to be set as a local address first.": "För att publicera en adress så måste den vara satt som en lokal adress först.", + "Published addresses can be used by anyone on any server to join your room.": "Publicerade adresser kan användas av vem som helst på vilken server som helst för att gå med i ditt rum.", + "Published addresses can be used by anyone on any server to join your space.": "Publicerade adresser kan användas av vem som helst på vilken server som helst för att gå med i ditt utrymme." } From 13a70c39580a2cbe07432850eff677c4fd364cf9 Mon Sep 17 00:00:00 2001 From: XoseM Date: Tue, 17 Aug 2021 05:37:29 +0000 Subject: [PATCH 150/619] Translated using Weblate (Galician) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 694eb99883..ec0af57357 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3673,5 +3673,6 @@ "To join an existing space you'll need an invite.": "Para unirte a un espazo existente precisas un convite.", "You can also create a Space from a community.": "Tamén podes crear un Espazo a partir dunha comunidade.", "You can change this later.": "Esto poderalo cambiar máis tarde.", - "What kind of Space do you want to create?": "Que tipo de Espazo queres crear?" + "What kind of Space do you want to create?": "Que tipo de Espazo queres crear?", + "Unknown failure: %(reason)s": "Fallo descoñecido: %(reason)s" } From 88df46012feb87e86489136c1ecc811932f6f860 Mon Sep 17 00:00:00 2001 From: Nguyen Quang Dung Date: Tue, 17 Aug 2021 03:01:56 +0000 Subject: [PATCH 151/619] Translated using Weblate (Vietnamese) Currently translated at 9.6% (303 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ --- src/i18n/strings/vi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json index 9bcb16c061..44af0d0288 100644 --- a/src/i18n/strings/vi.json +++ b/src/i18n/strings/vi.json @@ -354,7 +354,7 @@ "The other party declined the call.": "Bên kia đã từ chối cuộc gọi.", "Call Declined": "Cuộc gọi bị từ chối", "Your user agent": "Hành động của bạn", - "Single Sign On": "Single Sign On", + "Single Sign On": "Đăng nhập một lần", "Confirm adding this email address by using Single Sign On to prove your identity.": "Xác nhận việc thêm địa chỉ email này bằng cách sử dụng Single Sign On để chứng minh danh tính của bạn.", "Use Single Sign On to continue": "Sử dụng Signle Sign On để tiếp tục" } From b935e0cc5f18dd7484914d461a73892fc234b25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 16 Aug 2021 18:47:46 +0000 Subject: [PATCH 152/619] Translated using Weblate (Estonian) Currently translated at 98.8% (3106 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 17e6e87936..c26494b25a 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3585,5 +3585,33 @@ "Communities can now be made into Spaces": "Vanad kogukonnad saab nüüd muuta uuteks kogukonnakeskusteks", "Spaces are a new way to make a community, with new features coming.": "Kogukonnakeskused on nüüd uus ja pidevalt täienev lahendus seniste kogukondade jaoks.", "Communities won't receive further updates.": "Kogukondade vana funktsionaalsus enam ei uuene.", - "Created from ": "Loodud kogukonnas: " + "Created from ": "Loodud kogukonnas: ", + "You can now share your screen by pressing the \"screen share\" button during a call. You can even do this in audio calls if both sides support it!": "Vajutades kõne ajal „Jaga ekraani“ nuppu saad sa nüüd ekraanivaadet jagada. Kui mõlemad osapooled seda toetavad, siis toimib see ka tavakõne ajal!", + "Add space": "Lisa kogukonnakeskus", + "Olm version:": "Olm-teegi versioon:", + "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s muutsid jututoa klammerdatud sõnumeid %(count)s korda.", + "%(oneUser)schanged the pinned messages for the room %(count)s times.|other": "%(oneUser)s muutis jututoa klammerdatud sõnumeid %(count)s korda.", + "Don't send read receipts": "Ära saada lugemisteatisi", + "Delete avatar": "Kustuta tunnuspilt", + "What kind of Space do you want to create?": "Missugust kogukonnakeskust sooviksid sa luua?", + "You can change this later.": "Sa võid seda hiljem muuta.", + "You can also create a Space from a community.": "Sa või uue kogukonnakeskuse teha ka senise kogukonna alusel.", + "To join an existing space you'll need an invite.": "Olemasoleva kogukonnakeskusega liitumiseks vajad sa kutset.", + "Open Space": "Ava kogukonnakeskus", + "Create Space": "Loo kogukonnakeskus", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Senised kogukonnad on nüüd arhiveeritud ning nende asemel on kogukonnakeskused. Soovi korral võid oma senised kogukonnad muuta uuteks kogukonnakeskusteks ning seeläbi saad kasutada ka viimaseid uuendusi.", + "Show my Communities": "Näita minu kogukondi", + "If a community isn't shown you may not have permission to convert it.": "Kui sa kogukonda siin loendis ei näe, siis ei pruugi sul olla piisavalt õigusi.", + "This community has been upgraded into a Space": "Oleme selle vana kogukonna alusel loonud uue kogukonnakeskuse", + "To view Spaces, hide communities in Preferences": "Uute kogukonnakeskuste nägemiseks peida seadistustest vanad kogukonnad", + "Space created": "Kogukonnakeskus on loodud", + " has been made and everyone who was a part of the community has been invited to it.": " on nüüd olemas kõik vanas kogukonnas osalejad said sinna ka kutse.", + "To create a Space from another community, just pick the community in Preferences.": "Kui soovid uut kogukonnakeskust luua mõne teise vana kogukonna alusel, siis vali too seadistustest.", + "Failed to migrate community": "Vana kogukonna muutmine uueks kogukonnakeskuseks ei õnnestunud", + "Create Space from community": "Loo senise kogukonna alusel uus kogukonnakeskus", + "A link to the Space will be put in your community description.": "Uue kogukonnakeskuse viite lisame vana kogukonna kirjeldusele.", + "All rooms will be added and all community members will be invited.": "Lisame kõik jututoad ja saadame kitse kõikidele senise kogukonna liikmetele.", + "Flair won't be available in Spaces for the foreseeable future.": "Me ei plaani lähitulevikus pakkuda kogukondades rinnamärkide funktsionaalsust.", + "This description will be shown to people when they view your space": "Seda kirjeldust kuvame kõigile, kes vaatavad sinu kogukonda", + "Unknown failure: %(reason)s": "Tundmatu viga: %(reason)s" } From e5024c4b71b2552750edf337e212618795b53a7e Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 17 Aug 2021 10:38:09 +0100 Subject: [PATCH 153/619] Adapt threading UI to new backend --- src/components/structures/RightPanel.tsx | 13 ++- src/components/structures/RoomView.tsx | 5 +- src/components/structures/ThreadPanel.tsx | 106 ++++++++++++++++++ src/components/structures/ThreadView.tsx | 22 +++- .../views/right_panel/RoomSummaryCard.tsx | 10 ++ src/i18n/strings/en_EN.json | 1 + src/stores/RightPanelStorePhases.ts | 1 + 7 files changed, 150 insertions(+), 8 deletions(-) create mode 100644 src/components/structures/ThreadPanel.tsx diff --git a/src/components/structures/RightPanel.tsx b/src/components/structures/RightPanel.tsx index f2bd7db0f3..85d3013a58 100644 --- a/src/components/structures/RightPanel.tsx +++ b/src/components/structures/RightPanel.tsx @@ -46,17 +46,20 @@ import UserInfo from "../views/right_panel/UserInfo"; import ThirdPartyMemberInfo from "../views/rooms/ThirdPartyMemberInfo"; import FilePanel from "./FilePanel"; import ThreadView from "./ThreadView"; +import ThreadPanel from "./ThreadPanel"; import NotificationPanel from "./NotificationPanel"; import ResizeNotifier from "../../utils/ResizeNotifier"; import PinnedMessagesCard from "../views/right_panel/PinnedMessagesCard"; import { throttle } from 'lodash'; import SpaceStore from "../../stores/SpaceStore"; +import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; interface IProps { room?: Room; // if showing panels for a given room, this is set groupId?: string; // if showing panels for a given group, this is set user?: User; // used if we know the user ahead of opening the panel resizeNotifier: ResizeNotifier; + permalinkCreator?: RoomPermalinkCreator; } interface IState { @@ -315,7 +318,15 @@ export default class RightPanel extends React.Component { roomId={roomId} resizeNotifier={this.props.resizeNotifier} onClose={this.onClose} - mxEvent={this.state.event} />; + mxEvent={this.state.event} + permalinkCreator={this.props.permalinkCreator} />; + break; + + case RightPanelPhases.ThreadPanel: + panel = ; break; case RightPanelPhases.RoomSummary: diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 474b99262d..baf557ee18 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -2052,7 +2052,10 @@ export default class RoomView extends React.Component { const showRightPanel = this.state.room && this.state.showRightPanel; const rightPanel = showRightPanel - ? + ? : null; const timelineClasses = classNames("mx_RoomView_timeline", { diff --git a/src/components/structures/ThreadPanel.tsx b/src/components/structures/ThreadPanel.tsx new file mode 100644 index 0000000000..c99246ccda --- /dev/null +++ b/src/components/structures/ThreadPanel.tsx @@ -0,0 +1,106 @@ +/* +Copyright 2016 OpenMarket Ltd +Copyright 2019 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import { MatrixEvent, Room } from 'matrix-js-sdk/src'; + +import BaseCard from "../views/right_panel/BaseCard"; +import { RightPanelPhases } from "../../stores/RightPanelStorePhases"; +import { replaceableComponent } from "../../utils/replaceableComponent"; +import { MatrixClientPeg } from '../../MatrixClientPeg'; + +import ResizeNotifier from '../../utils/ResizeNotifier'; +import EventTile from '../views/rooms/EventTile'; +import { Thread } from '../../../../matrix-js-sdk/src/models/thread'; + +interface IProps { + roomId: string; + onClose: () => void; + resizeNotifier: ResizeNotifier; +} + +interface IState { + threads?: Thread[]; +} + +/* + * Component which shows the filtered file using a TimelinePanel + */ +@replaceableComponent("structures.ThreadView") +class ThreadView extends React.Component { + private room: Room; + + constructor(props: IProps) { + super(props); + this.room = MatrixClientPeg.get().getRoom(this.props.roomId); + } + + public componentDidMount(): void { + this.room.on("Thread.update", this.onThreadEventReceived); + this.room.on("Thread.ready", this.onThreadEventReceived); + this.updateThreads(() => { + this.state.threads.forEach(thread => { + if (!thread.ready) { + thread.fetchReplyChain(); + } + }); + }); + } + + public componentWillUnmount(): void { + this.room.removeListener("Thread.update", this.onThreadEventReceived); + this.room.removeListener("Thread.ready", this.onThreadEventReceived); + } + + public onThreadEventReceived = () => this.updateThreads(); + + public updateThreads = (callback?: () => void): void => { + this.setState({ + threads: this.room.getThreads(), + }, callback); + }; + + public renderEventTile(event: MatrixEvent): JSX.Element { + return ; + } + + public render() { + return ( + + { + this.state?.threads.map((thread: Thread) => { + if (thread.ready) { + return this.renderEventTile(thread.rootEvent); + } + }) + } + + ); + } +} + +export default ThreadView; diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index 8b196cb4f0..0f9d499884 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -26,12 +26,14 @@ import { MatrixClientPeg } from '../../MatrixClientPeg'; import ResizeNotifier from '../../utils/ResizeNotifier'; import EventTile from '../views/rooms/EventTile'; import MessageComposer from '../views/rooms/MessageComposer'; +import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; interface IProps { roomId: string; onClose: () => void; resizeNotifier: ResizeNotifier; mxEvent: MatrixEvent; + permalinkCreator?: RoomPermalinkCreator; } interface IState { @@ -44,9 +46,18 @@ interface IState { class ThreadView extends React.Component { state = {}; - public componentDidMount(): void {} + public componentDidMount(): void { + // this.props.mxEvent.getThread().on("Thread.update", this.updateThread); + this.props.mxEvent.getThread().once("Thread.ready", this.updateThread); + } - public componentWillUnmount(): void {} + public componentWillUnmount(): void { + this.props.mxEvent.getThread().removeListener("Thread.update", this.updateThread); + } + + updateThread = () => { + this.forceUpdate(); + }; public renderEventTile(event: MatrixEvent): JSX.Element { return { } public render() { - const client = MatrixClientPeg.get(); - const room = client.getRoom(this.props.roomId); - const thread = room.getThread(this.props.mxEvent.getId()); + const thread = this.props.mxEvent.getThread(); + const room = MatrixClientPeg.get().getRoom(this.props.roomId); return ( { room={room} resizeNotifier={this.props.resizeNotifier} replyToEvent={this.props.mxEvent} - permalinkCreator={null} + permalinkCreator={this.props.permalinkCreator} /> ); diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index 047448d925..eb3d7499f4 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -220,6 +220,13 @@ const onRoomFilesClick = () => { }); }; +const onRoomThreadsClick = () => { + defaultDispatcher.dispatch({ + action: Action.SetRightPanelPhase, + phase: RightPanelPhases.ThreadPanel, + }); +}; + const onRoomSettingsClick = () => { defaultDispatcher.dispatch({ action: "open_room_settings" }); }; @@ -273,6 +280,9 @@ const RoomSummaryCard: React.FC = ({ room, onClose }) => { + diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ca55f45619..ec28be664b 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1790,6 +1790,7 @@ "%(count)s people|other": "%(count)s people", "%(count)s people|one": "%(count)s person", "Show files": "Show files", + "Show threads": "Show threads", "Share room": "Share room", "Room settings": "Room settings", "Trusted": "Trusted", diff --git a/src/stores/RightPanelStorePhases.ts b/src/stores/RightPanelStorePhases.ts index 8f41b17e47..96a585b676 100644 --- a/src/stores/RightPanelStorePhases.ts +++ b/src/stores/RightPanelStorePhases.ts @@ -40,6 +40,7 @@ export enum RightPanelPhases { // Thread stuff ThreadView = "ThreadView", + ThreadPanel = "ThreadPanel", } // These are the phases that are safe to persist (the ones that don't require additional From d1dbfbd014094554a6d3e25e37a5ff33708708f1 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 17 Aug 2021 11:10:02 +0100 Subject: [PATCH 154/619] hide thread events from the timeline --- res/css/views/rooms/_EventTile.scss | 30 +++++++++++++++ res/img/element-icons/message/thread.svg | 4 ++ src/components/structures/MessagePanel.tsx | 7 ++++ src/components/structures/ThreadView.tsx | 29 +++++++++----- src/components/structures/TimelinePanel.tsx | 4 ++ src/components/views/rooms/EventTile.tsx | 38 +++++++++++++++++++ .../views/rooms/MessageComposer.tsx | 9 ++++- 7 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 res/img/element-icons/message/thread.svg diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 1c9d8e87d9..1adfc0cde3 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -670,3 +670,33 @@ $hover-select-border: 4px; margin-right: 0; } } + + +.mx_ThreadView { + + display: flex; + flex-direction: column; + + .mx_ThreadView_List { + flex: 1; + overflow: scroll; + } + + .mx_EventTile_roomName { + display: none; + } + + .mx_EventTile_line { + padding-left: 0 !important; + order: 10 !important; + } + .mx_EventTile { + width: 100%; + display: flex; + flex-direction: column; + border-bottom: 1px solid #888; + margin-top: 0; + padding-bottom: 5px; + margin-bottom: 5px; + } +} diff --git a/res/img/element-icons/message/thread.svg b/res/img/element-icons/message/thread.svg new file mode 100644 index 0000000000..b4a7cc0066 --- /dev/null +++ b/res/img/element-icons/message/thread.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/components/structures/MessagePanel.tsx b/src/components/structures/MessagePanel.tsx index 1691d90651..15275328a6 100644 --- a/src/components/structures/MessagePanel.tsx +++ b/src/components/structures/MessagePanel.tsx @@ -173,6 +173,8 @@ interface IProps { onUnfillRequest?(backwards: boolean, scrollToken: string): void; getRelationsForEvent?(eventId: string, relationType: string, eventType: string): Relations; + + hideThreadedMessages?: boolean; } interface IState { @@ -443,6 +445,11 @@ export default class MessagePanel extends React.Component { // Always show highlighted event if (this.props.highlightedEventId === mxEv.getId()) return true; + const threadingEnabled = SettingsStore.getValue("feature_threading"); + if (threadingEnabled && mxEv.replyEventId && this.props.hideThreadedMessages === true) { + return false; + } + return !shouldHideEvent(mxEv, this.context); } diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index 0f9d499884..f34be87c95 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -24,9 +24,11 @@ import { replaceableComponent } from "../../utils/replaceableComponent"; import { MatrixClientPeg } from '../../MatrixClientPeg'; import ResizeNotifier from '../../utils/ResizeNotifier'; -import EventTile from '../views/rooms/EventTile'; +import EventTile, { TileShape } from '../views/rooms/EventTile'; import MessageComposer from '../views/rooms/MessageComposer'; import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; +import { Layout } from '../../settings/Layout'; +import TimelinePanel from './TimelinePanel'; interface IProps { roomId: string; @@ -37,6 +39,7 @@ interface IProps { } interface IState { + replyToEvent?: MatrixEvent; } /* @@ -65,6 +68,7 @@ class ThreadView extends React.Component { mxEvent={event} enableFlair={false} showReadReceipts={false} + tileShape={TileShape.FileGrid} as="div" />; } @@ -77,19 +81,24 @@ class ThreadView extends React.Component { className="mx_ThreadView" onClose={this.props.onClose} previousPhase={RightPanelPhases.RoomSummary} + withoutScrollContainer={true} > - { this.renderEventTile(this.props.mxEvent) } - - { thread && ( - thread.eventTimeline.map((event: MatrixEvent) => { - return this.renderEventTile(event); - }) - ) } - + empty
    } + alwaysShowTimestamps={true} + layout={Layout.Group} + hideThreadedMessages={false} + /> diff --git a/src/components/structures/TimelinePanel.tsx b/src/components/structures/TimelinePanel.tsx index f62676a4fc..e5fa6967dc 100644 --- a/src/components/structures/TimelinePanel.tsx +++ b/src/components/structures/TimelinePanel.tsx @@ -126,6 +126,8 @@ interface IProps { // callback which is called when we wish to paginate the timeline window. onPaginationRequest?(timelineWindow: TimelineWindow, direction: string, size: number): Promise; + + hideThreadedMessages?: boolean; } interface IState { @@ -214,6 +216,7 @@ class TimelinePanel extends React.Component { timelineCap: Number.MAX_VALUE, className: 'mx_RoomView_messagePanel', sendReadReceiptOnLoad: true, + hideThreadedMessages: true, }; private lastRRSentEventId: string = undefined; @@ -1511,6 +1514,7 @@ class TimelinePanel extends React.Component { showReactions={this.props.showReactions} layout={this.props.layout} enableFlair={SettingsStore.getValue(UIFeature.Flair)} + hideThreadedMessages={this.props.hideThreadedMessages} /> ); } diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 884d004551..30355e55bf 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -55,6 +55,7 @@ import ReadReceiptMarker from "./ReadReceiptMarker"; import MessageActionBar from "../messages/MessageActionBar"; import ReactionsRow from '../messages/ReactionsRow'; import { getEventDisplayInfo } from '../../../utils/EventUtils'; +import { RightPanelPhases } from "../../../stores/RightPanelStorePhases"; const eventTileTypes = { [EventType.RoomMessage]: 'messages.MessageEvent', @@ -299,6 +300,9 @@ interface IProps { // whether or not to display the sender hideSender?: boolean; + + // whether or not to display thread info + showThreadInfo?: boolean; } interface IState { @@ -451,6 +455,7 @@ export default class EventTile extends React.Component { client.on("Room.receipt", this.onRoomReceipt); this.isListeningForReceipts = true; } + this.props.mxEvent.on("Thread.update", this.forceUpdate); } // TODO: [REACT-WARNING] Replace with appropriate lifecycle event @@ -491,6 +496,38 @@ export default class EventTile extends React.Component { } } + private renderThreadInfo(): React.ReactNode { + const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); + const thread = room.getThread(this.props.mxEvent.getId()); + if (!thread || this.props.showThreadInfo === false) { + return null; + } + + const avatars = Array.from(thread.participants).map((mxId: string) => { + const member = room.getMember(mxId); + return ; + }); + + return ( +
    { + dis.dispatch({ + action: Action.SetRightPanelPhase, + phase: RightPanelPhases.ThreadView, + refireParams: { + event: this.props.mxEvent, + }, + }); + }} + > + + { avatars } + + { thread.length } { thread.length === 1 ? 'reply' : 'replies' } +
    + ); + } + private onRoomReceipt = (ev, room) => { // ignore events for other rooms const tileRoom = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); @@ -1167,6 +1204,7 @@ export default class EventTile extends React.Component { { keyRequestInfo } { actionBar } { this.props.layout === Layout.IRC && (reactionsRow) } + { this.renderThreadInfo() }
    { this.props.layout !== Layout.IRC && (reactionsRow) } { msgOption } diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index 8455e9aa11..bd53c9566a 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -183,6 +183,7 @@ interface IProps { resizeNotifier: ResizeNotifier; permalinkCreator: RoomPermalinkCreator; replyToEvent?: MatrixEvent; + showReplyPreview?: boolean; e2eStatus?: E2EStatus; } @@ -201,6 +202,10 @@ export default class MessageComposer extends React.Component { private messageComposerInput: SendMessageComposer; private voiceRecordingButton: VoiceRecordComposerTile; + static defaultProps = { + showReplyPreview: true, + }; + constructor(props) { super(props); VoiceRecordingStore.instance.on(UPDATE_EVENT, this.onVoiceStoreUpdate); @@ -454,7 +459,9 @@ export default class MessageComposer extends React.Component {
    { recordingTooltip }
    - + { this.props.showReplyPreview && ( + + ) }
    { controls }
    From bdb5f3bb9f0325c755afd9130b4218185dbd001d Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Tue, 17 Aug 2021 15:25:10 +0200 Subject: [PATCH 155/619] Refactor GroupFilterPanel to typescript --- ...oupFilterPanel.js => GroupFilterPanel.tsx} | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) rename src/components/structures/{GroupFilterPanel.js => GroupFilterPanel.tsx} (74%) diff --git a/src/components/structures/GroupFilterPanel.js b/src/components/structures/GroupFilterPanel.tsx similarity index 74% rename from src/components/structures/GroupFilterPanel.js rename to src/components/structures/GroupFilterPanel.tsx index 348e1fe497..3e7c6e9b17 100644 --- a/src/components/structures/GroupFilterPanel.js +++ b/src/components/structures/GroupFilterPanel.tsx @@ -15,6 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import type { EventSubscription } from "fbemitter"; import React from 'react'; import GroupFilterOrderStore from '../../stores/GroupFilterOrderStore'; @@ -32,23 +33,41 @@ import UserTagTile from "../views/elements/UserTagTile"; import { replaceableComponent } from "../../utils/replaceableComponent"; import UIStore from "../../stores/UIStore"; -@replaceableComponent("structures.GroupFilterPanel") -class GroupFilterPanel extends React.Component { - static contextType = MatrixClientContext; +interface IGroupFilterPanelProps { - state = { +} + +// FIXME: Properly type this after migrating GroupFilterOrderStore.js to Typescript +type OrderedTagsTemporaryType = Array<{}>; +// FIXME: Properly type this after migrating GroupFilterOrderStore.js to Typescript +type SelectedTagsTemporaryType = Array<{}>; + +interface IGroupFilterPanelState { + // FIXME: Properly type this after migrating GroupFilterOrderStore.js to Typescript + orderedTags: OrderedTagsTemporaryType; + // FIXME: Properly type this after migrating GroupFilterOrderStore.js to Typescript + selectedTags: SelectedTagsTemporaryType; +} + +@replaceableComponent("structures.GroupFilterPanel") +class GroupFilterPanel extends React.Component { + public static contextType = MatrixClientContext; + + public state = { orderedTags: [], selectedTags: [], }; - ref = React.createRef() + private ref = React.createRef(); + private unmounted = false; + private groupFilterOrderStoreToken?: EventSubscription; - componentDidMount() { + public componentDidMount() { this.unmounted = false; - this.context.on("Group.myMembership", this._onGroupMyMembership); - this.context.on("sync", this._onClientSync); + this.context.on("Group.myMembership", this.onGroupMyMembership); + this.context.on("sync", this.onClientSync); - this._groupFilterOrderStoreToken = GroupFilterOrderStore.addListener(() => { + this.groupFilterOrderStoreToken = GroupFilterOrderStore.addListener(() => { if (this.unmounted) { return; } @@ -62,22 +81,22 @@ class GroupFilterPanel extends React.Component { UIStore.instance.trackElementDimensions("GroupPanel", this.ref.current); } - componentWillUnmount() { + public componentWillUnmount() { this.unmounted = true; - this.context.removeListener("Group.myMembership", this._onGroupMyMembership); - this.context.removeListener("sync", this._onClientSync); - if (this._groupFilterOrderStoreToken) { - this._groupFilterOrderStoreToken.remove(); + this.context.removeListener("Group.myMembership", this.onGroupMyMembership); + this.context.removeListener("sync", this.onClientSync); + if (this.groupFilterOrderStoreToken) { + this.groupFilterOrderStoreToken.remove(); } UIStore.instance.stopTrackingElementDimensions("GroupPanel"); } - _onGroupMyMembership = () => { + private onGroupMyMembership = () => { if (this.unmounted) return; dis.dispatch(GroupActions.fetchJoinedGroups(this.context)); }; - _onClientSync = (syncState, prevState) => { + private onClientSync = (syncState, prevState) => { // Consider the client reconnected if there is no error with syncing. // This means the state could be RECONNECTING, SYNCING, PREPARED or CATCHUP. const reconnected = syncState !== "ERROR" && prevState !== syncState; @@ -87,18 +106,18 @@ class GroupFilterPanel extends React.Component { } }; - onClick = e => { + private onClick = e => { // only dispatch if its not a no-op if (this.state.selectedTags.length > 0) { dis.dispatch({ action: 'deselect_tags' }); } }; - onClearFilterClick = ev => { + private onClearFilterClick = ev => { dis.dispatch({ action: 'deselect_tags' }); }; - renderGlobalIcon() { + private renderGlobalIcon() { if (!SettingsStore.getValue("feature_communities_v2_prototypes")) return null; return ( @@ -109,7 +128,7 @@ class GroupFilterPanel extends React.Component { ); } - render() { + public render() { const DNDTagTile = sdk.getComponent('elements.DNDTagTile'); const ActionButton = sdk.getComponent('elements.ActionButton'); From a999cad49db7dec102717b93e6a780bb8ed53bef Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Tue, 17 Aug 2021 16:07:17 +0200 Subject: [PATCH 156/619] Properly cache blur effect --- res/css/structures/_BackdropPanel.scss | 1 + res/themes/dark/css/dark.scss | 4 -- src/components/structures/BackdropPanel.tsx | 78 ++++++++++++++------- src/components/structures/LeftPanel.tsx | 6 +- 4 files changed, 58 insertions(+), 31 deletions(-) diff --git a/res/css/structures/_BackdropPanel.scss b/res/css/structures/_BackdropPanel.scss index 3bcceb1d55..1ed2e4330e 100644 --- a/res/css/structures/_BackdropPanel.scss +++ b/res/css/structures/_BackdropPanel.scss @@ -20,6 +20,7 @@ limitations under the License. top: 0; height: 100vh; width: 100%; + overflow: hidden; &:before { content: ' '; diff --git a/res/themes/dark/css/dark.scss b/res/themes/dark/css/dark.scss index 600cfd528a..df83d6db88 100644 --- a/res/themes/dark/css/dark.scss +++ b/res/themes/dark/css/dark.scss @@ -2,10 +2,6 @@ @import "../../light/css/_paths.scss"; @import "../../light/css/_fonts.scss"; @import "../../light/css/_light.scss"; -// important this goes before _mods, -// as $groupFilterPanel-background-blur-amount and -// $roomlist-background-blur-amount -// are overridden in _dark.scss @import "_dark.scss"; @import "../../light/css/_mods.scss"; @import "../../../../res/css/_components.scss"; diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index c1c1e784aa..e61f783323 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -23,48 +23,54 @@ interface IProps { backgroundImage?: CanvasImageSource; } -export default class BackdropPanel extends React.PureComponent { - private spacesCanvasRef = createRef(); - private roomListCanvasRef = createRef(); +interface IState { + // Left Panel image + lpImage?: string; + // Left-left panel image + llpImage?: string; +} + +export default class BackdropPanel extends React.PureComponent { + private leftLeftPanelRef = createRef(); + private leftPanelRef = createRef(); private sizes = { - spacePanelWidth: 0, - roomListWidth: 0, + leftLeftPanelWidth: 0, + leftPanelWidth: 0, height: 0, }; private style = getComputedStyle(document.documentElement); constructor(props: IProps) { super(props); + this.state = {}; } public componentDidMount() { UIStore.instance.on("SpacePanel", this.onResize); - UIStore.instance.on("LeftPanel", this.onResize); + UIStore.instance.on("GroupFilterPanelContainer", this.onResize); this.onResize(); } public componentWillUnmount() { UIStore.instance.off("SpacePanel", this.onResize); - UIStore.instance.off("LeftPanel", this.onResize); } public componentDidUpdate(prevProps: IProps) { - if (this.props.backgroundImage) { + if (prevProps.backgroundImage !== this.props.backgroundImage) { + this.setState({}); this.onResize(); } - if (prevProps.backgroundImage && !this.props.backgroundImage) { - this.forceUpdate(); - } } private onResize = () => { if (this.props.backgroundImage) { + const groupFilterPanelDimensions = UIStore.instance.getElementDimensions("GroupFilterPanelContainer"); const spacePanelDimensions = UIStore.instance.getElementDimensions("SpacePanel"); const roomListDimensions = UIStore.instance.getElementDimensions("LeftPanel"); this.sizes = { - spacePanelWidth: spacePanelDimensions?.width ?? 0, - roomListWidth: roomListDimensions?.width ?? 0, + leftLeftPanelWidth: spacePanelDimensions?.width ?? groupFilterPanelDimensions?.width ?? 0, + leftPanelWidth: roomListDimensions?.width ?? 0, height: UIStore.instance.windowHeight, }; this.refreshBackdropImage(); @@ -72,10 +78,10 @@ export default class BackdropPanel extends React.PureComponent { }; private refreshBackdropImage = (): void => { - const spacesCtx = this.spacesCanvasRef.current.getContext("2d"); - const roomListCtx = this.roomListCanvasRef.current.getContext("2d"); - const { spacePanelWidth, roomListWidth, height } = this.sizes; - const width = spacePanelWidth + roomListWidth; + const spacesCtx = this.leftLeftPanelRef.current.getContext("2d"); + const roomListCtx = this.leftPanelRef.current.getContext("2d"); + const { leftLeftPanelWidth, leftPanelWidth, height } = this.sizes; + const width = leftLeftPanelWidth + leftPanelWidth; const { backgroundImage } = this.props; const imageWidth = (backgroundImage as ImageBitmap).width @@ -98,11 +104,11 @@ export default class BackdropPanel extends React.PureComponent { const x = (width - resultWidth) / 2; const y = (height - resultHeight) / 2; - this.spacesCanvasRef.current.width = spacePanelWidth; - this.spacesCanvasRef.current.height = height; - this.roomListCanvasRef.current.width = roomListWidth; - this.roomListCanvasRef.current.height = height; - this.roomListCanvasRef.current.style.transform = `translateX(${spacePanelWidth}px)`; + this.leftLeftPanelRef.current.width = leftLeftPanelWidth; + this.leftLeftPanelRef.current.height = height; + this.leftPanelRef.current.width = (window.screen.width * 0.5) - leftLeftPanelWidth; + this.leftPanelRef.current.height = height; + this.leftPanelRef.current.style.transform = `translateX(${leftLeftPanelWidth}px)`; const spacesBlur = this.style.getPropertyValue('--roomlist-background-blur-amount'); const roomListBlur = this.style.getPropertyValue('--groupFilterPanel-background-blur-amount'); @@ -122,29 +128,49 @@ export default class BackdropPanel extends React.PureComponent { backgroundImage, 0, 0, imageWidth, imageHeight, - x - spacePanelWidth, + x - leftLeftPanelWidth, y, resultWidth, resultHeight, ); + this.setState({ + lpImage: this.leftPanelRef.current.toDataURL('image/jpeg', 1), + llpImage: this.leftLeftPanelRef.current.toDataURL('image/jpeg', 1), + + }); }; public render() { if (!this.props.backgroundImage) return null; return
    - + +
    ; diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index 82db9a2e2e..0d8f9d8725 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -69,6 +69,7 @@ export default class LeftPanel extends React.Component { private ref: React.RefObject = createRef(); private listContainerRef: React.RefObject = createRef(); private groupFilterPanelWatcherRef: string; + private groupFilterPanelContainer = createRef(); private bgImageWatcherRef: string; private focusedElement = null; private isDoingStickyHeaders = false; @@ -93,6 +94,9 @@ export default class LeftPanel extends React.Component { public componentDidMount() { UIStore.instance.trackElementDimensions("LeftPanel", this.ref.current); UIStore.instance.trackElementDimensions("ListContainer", this.listContainerRef.current); + if (this.groupFilterPanelContainer.current) { + UIStore.instance.trackElementDimensions("GroupFilterPanelContainer", this.groupFilterPanelContainer.current); + } UIStore.instance.on("ListContainer", this.refreshStickyHeaders); // Using the passive option to not block the main thread // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners @@ -420,7 +424,7 @@ export default class LeftPanel extends React.Component { let leftLeftPanel; if (this.state.showGroupFilterPanel) { leftLeftPanel = ( -
    +
    { SettingsStore.getValue("feature_custom_tags") ? : null }
    From 2ee26d0681d9283b27201b210dc1046128c85f48 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Tue, 17 Aug 2021 17:47:40 +0200 Subject: [PATCH 157/619] Make the blur as-close to the css one as possible --- res/css/structures/_BackdropPanel.scss | 10 +++---- res/themes/dark/css/_dark.scss | 4 +-- res/themes/light/css/_light.scss | 4 +-- src/components/structures/BackdropPanel.tsx | 31 +++++++++------------ 4 files changed, 22 insertions(+), 27 deletions(-) diff --git a/res/css/structures/_BackdropPanel.scss b/res/css/structures/_BackdropPanel.scss index 1ed2e4330e..79af211ba4 100644 --- a/res/css/structures/_BackdropPanel.scss +++ b/res/css/structures/_BackdropPanel.scss @@ -29,7 +29,7 @@ limitations under the License. top: 0; height: 100vh; width: 100%; - background-color: rgba(255, 255, 255, .02); + background-color: rgba(255, 255, 255, .055); } } @@ -42,10 +42,10 @@ limitations under the License. pointer-events: none; overflow: hidden; - &:first-of-type { - opacity: 0.19; + &:nth-of-type(2n-1) { + opacity: 0.2; } - &:last-of-type { - opacity:0.12; + &:nth-of-type(2n) { + opacity:0.1; } } diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index 53cba6f440..854fa9f168 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -240,8 +240,8 @@ $appearance-tab-border-color: $room-highlight-color; // blur amounts for left left panel (only for element theme, used in _mods.scss) :root { - --roomlist-background-blur-amount: 60px; - --groupFilterPanel-background-blur-amount: 30px; + --llp-background-blur: 60px; + --lp-background-blur: 30px; } $composer-shadow-color: rgba(0, 0, 0, 0.28); diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 4978edee55..706f4946fa 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -363,8 +363,8 @@ $appearance-tab-border-color: $input-darker-bg-color; // blur amounts for left left panel (only for element theme, used in _mods.scss) :root { - --roomlist-background-blur-amount: 40px; - --groupFilterPanel-background-blur-amount: 20px; + --llp-background-blur: 40px; + --lp-background-blur: 20px; } $composer-shadow-color: rgba(0, 0, 0, 0.04); diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index e61f783323..6faf47fcaf 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -78,16 +78,14 @@ export default class BackdropPanel extends React.PureComponent { }; private refreshBackdropImage = (): void => { - const spacesCtx = this.leftLeftPanelRef.current.getContext("2d"); - const roomListCtx = this.leftPanelRef.current.getContext("2d"); + const leftLeftPanelContext = this.leftLeftPanelRef.current.getContext("2d"); + const leftPanelContext = this.leftPanelRef.current.getContext("2d"); const { leftLeftPanelWidth, leftPanelWidth, height } = this.sizes; const width = leftLeftPanelWidth + leftPanelWidth; const { backgroundImage } = this.props; - const imageWidth = (backgroundImage as ImageBitmap).width - || (backgroundImage as HTMLImageElement).naturalWidth; - const imageHeight = (backgroundImage as ImageBitmap).height - || (backgroundImage as HTMLImageElement).naturalHeight; + const imageWidth = (backgroundImage as ImageBitmap).width; + const imageHeight = (backgroundImage as ImageBitmap).height; const contentRatio = imageWidth / imageHeight; const containerRatio = width / height; @@ -101,7 +99,9 @@ export default class BackdropPanel extends React.PureComponent { resultHeight = width / contentRatio; } - const x = (width - resultWidth) / 2; + // This value has been chosen to be as close with rendering as the css-only + // backdrop-filter: blur effect was, mostly takes effect for vertical pictures. + const x = width * 0.1; const y = (height - resultHeight) / 2; this.leftLeftPanelRef.current.width = leftLeftPanelWidth; @@ -110,12 +110,12 @@ export default class BackdropPanel extends React.PureComponent { this.leftPanelRef.current.height = height; this.leftPanelRef.current.style.transform = `translateX(${leftLeftPanelWidth}px)`; - const spacesBlur = this.style.getPropertyValue('--roomlist-background-blur-amount'); - const roomListBlur = this.style.getPropertyValue('--groupFilterPanel-background-blur-amount'); + const spacesBlur = this.style.getPropertyValue('--llp-background-blur'); + const roomListBlur = this.style.getPropertyValue('--lp-background-blur'); - spacesCtx.filter = `blur(${spacesBlur})`; - roomListCtx.filter = `blur(${roomListBlur})`; - spacesCtx.drawImage( + leftLeftPanelContext.filter = `blur(${spacesBlur})`; + leftPanelContext.filter = `blur(${roomListBlur})`; + leftLeftPanelContext.drawImage( backgroundImage, 0, 0, imageWidth, imageHeight, @@ -124,7 +124,7 @@ export default class BackdropPanel extends React.PureComponent { resultWidth, resultHeight, ); - roomListCtx.drawImage( + leftPanelContext.drawImage( backgroundImage, 0, 0, imageWidth, imageHeight, @@ -146,13 +146,11 @@ export default class BackdropPanel extends React.PureComponent { { className="mx_BackdropPanel--canvas" style={{ display: this.state.lpImage ? 'none' : 'block', - opacity: .19, }} /> Date: Tue, 17 Aug 2021 17:59:26 +0200 Subject: [PATCH 158/619] Satisfy linter --- res/css/structures/_BackdropPanel.scss | 26 +++++++++++----------- src/components/structures/LeftPanel.tsx | 3 ++- src/components/views/spaces/SpacePanel.tsx | 11 ++++++++- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/res/css/structures/_BackdropPanel.scss b/res/css/structures/_BackdropPanel.scss index 79af211ba4..1960bd94e4 100644 --- a/res/css/structures/_BackdropPanel.scss +++ b/res/css/structures/_BackdropPanel.scss @@ -15,22 +15,22 @@ limitations under the License. */ .mx_BackdropPanel { - position: absolute; - left: 0; - top: 0; - height: 100vh; - width: 100%; - overflow: hidden; - - &:before { - content: ' '; position: absolute; left: 0; top: 0; height: 100vh; width: 100%; - background-color: rgba(255, 255, 255, .055); - } + overflow: hidden; + + &::before { + content: " "; + position: absolute; + left: 0; + top: 0; + height: 100vh; + width: 100%; + background-color: rgba(255, 255, 255, 0.055); + } } .mx_BackdropPanel--canvas { @@ -43,9 +43,9 @@ limitations under the License. overflow: hidden; &:nth-of-type(2n-1) { - opacity: 0.2; + opacity: 0.2; } &:nth-of-type(2n) { - opacity:0.1; + opacity: 0.1; } } diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index 0d8f9d8725..6c418e9366 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -95,7 +95,8 @@ export default class LeftPanel extends React.Component { UIStore.instance.trackElementDimensions("LeftPanel", this.ref.current); UIStore.instance.trackElementDimensions("ListContainer", this.listContainerRef.current); if (this.groupFilterPanelContainer.current) { - UIStore.instance.trackElementDimensions("GroupFilterPanelContainer", this.groupFilterPanelContainer.current); + const componentName = "GroupFilterPanelContainer"; + UIStore.instance.trackElementDimensions(componentName, this.groupFilterPanelContainer.current); } UIStore.instance.on("ListContainer", this.refreshStickyHeaders); // Using the passive option to not block the main thread diff --git a/src/components/views/spaces/SpacePanel.tsx b/src/components/views/spaces/SpacePanel.tsx index 2fa08e2108..d2e09c0d69 100644 --- a/src/components/views/spaces/SpacePanel.tsx +++ b/src/components/views/spaces/SpacePanel.tsx @@ -14,7 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { ComponentProps, Dispatch, ReactNode, SetStateAction, useEffect, useLayoutEffect, useRef, useState } from "react"; +import React, { + ComponentProps, + Dispatch, + ReactNode, + SetStateAction, + useEffect, + useLayoutEffect, + useRef, + useState, +} from "react"; import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd"; import classNames from "classnames"; import { Room } from "matrix-js-sdk/src/models/room"; From 515fc244b6ef03f02f859599d41e35d35e14e883 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Tue, 17 Aug 2021 18:00:39 +0200 Subject: [PATCH 159/619] Revert useless change --- res/css/structures/_MatrixChat.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index c837aee791..90e28fb0a9 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -65,7 +65,7 @@ limitations under the License. } /* not the left panel, and not the resize handle, so the roomview/groupview/... */ -.mx_MatrixChat > :not(.mx_LeftPanel):not(.mx_SpacePanel):not(.mx_ResizeHandle):not(canvas) { +.mx_MatrixChat > :not(.mx_LeftPanel):not(.mx_SpacePanel):not(.mx_ResizeHandle) { background-color: $primary-bg-color; flex: 1 1 0; From 78d48b1d8bb847570f9e17bdd882d1000539637f Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Tue, 17 Aug 2021 18:03:22 +0200 Subject: [PATCH 160/619] Fix weird code style --- src/components/structures/BackdropPanel.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 6faf47fcaf..47b967edd1 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -145,17 +145,12 @@ export default class BackdropPanel extends React.PureComponent { return
    Date: Tue, 17 Aug 2021 17:42:47 +0100 Subject: [PATCH 161/619] Make UI respond to thread events --- res/css/views/messages/_MessageActionBar.scss | 4 ++-- .../views/right_panel/_RoomSummaryCard.scss | 4 ++++ src/components/structures/MessagePanel.tsx | 1 + src/components/structures/ThreadPanel.tsx | 7 ------ src/components/structures/ThreadView.tsx | 23 +++++++++++++++---- .../views/right_panel/RoomSummaryCard.tsx | 2 +- src/components/views/rooms/EventTile.tsx | 20 +++++++++++++--- 7 files changed, 44 insertions(+), 17 deletions(-) diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index 509ded8ee8..3e5ab87ca9 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -89,11 +89,11 @@ limitations under the License. } .mx_MessageActionBar_replyButton::after { - mask-image: url('$(res)/img/element-icons/room/message-bar/reply.svg'); + mask-image: url('$(res)/img/element-icons/room/files.svg'); } .mx_MessageActionBar_threadButton::after { - mask-image: url('$(res)/img/element-icons/room/files.svg'); + mask-image: url('$(res)/img/element-icons/message/thread.svg'); } .mx_MessageActionBar_editButton::after { diff --git a/res/css/views/right_panel/_RoomSummaryCard.scss b/res/css/views/right_panel/_RoomSummaryCard.scss index dc7804d072..d93e593679 100644 --- a/res/css/views/right_panel/_RoomSummaryCard.scss +++ b/res/css/views/right_panel/_RoomSummaryCard.scss @@ -232,6 +232,10 @@ limitations under the License. mask-image: url('$(res)/img/element-icons/room/files.svg'); } +.mx_RoomSummaryCard_icon_threads::before { + mask-image: url('$(res)/img/element-icons/message/thread.svg'); +} + .mx_RoomSummaryCard_icon_share::before { mask-image: url('$(res)/img/element-icons/room/share.svg'); } diff --git a/src/components/structures/MessagePanel.tsx b/src/components/structures/MessagePanel.tsx index 15275328a6..fd716041c2 100644 --- a/src/components/structures/MessagePanel.tsx +++ b/src/components/structures/MessagePanel.tsx @@ -267,6 +267,7 @@ export default class MessagePanel extends React.Component { componentDidMount() { this.calculateRoomMembersCount(); this.props.room?.on("RoomState.members", this.calculateRoomMembersCount); + this.props.room?.getThreads().forEach(thread => thread.fetchReplyChain()); this.isMounted = true; } diff --git a/src/components/structures/ThreadPanel.tsx b/src/components/structures/ThreadPanel.tsx index c99246ccda..f0b85e9723 100644 --- a/src/components/structures/ThreadPanel.tsx +++ b/src/components/structures/ThreadPanel.tsx @@ -52,13 +52,6 @@ class ThreadView extends React.Component { public componentDidMount(): void { this.room.on("Thread.update", this.onThreadEventReceived); this.room.on("Thread.ready", this.onThreadEventReceived); - this.updateThreads(() => { - this.state.threads.forEach(thread => { - if (!thread.ready) { - thread.fetchReplyChain(); - } - }); - }); } public componentWillUnmount(): void { diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index f34be87c95..7767e5929e 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -29,6 +29,7 @@ import MessageComposer from '../views/rooms/MessageComposer'; import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; import { Layout } from '../../settings/Layout'; import TimelinePanel from './TimelinePanel'; +import { Thread } from '../../../../matrix-js-sdk/src/models/thread'; interface IProps { roomId: string; @@ -40,6 +41,7 @@ interface IProps { interface IState { replyToEvent?: MatrixEvent; + thread?: Thread; } /* @@ -50,16 +52,29 @@ class ThreadView extends React.Component { state = {}; public componentDidMount(): void { - // this.props.mxEvent.getThread().on("Thread.update", this.updateThread); - this.props.mxEvent.getThread().once("Thread.ready", this.updateThread); + this.setupThread(); } public componentWillUnmount(): void { - this.props.mxEvent.getThread().removeListener("Thread.update", this.updateThread); + if (this.state.thread) { + this.state.thread.removeListener("Thread.update", this.updateThread); + this.state.thread.removeListener("Thread.ready", this.updateThread); + } } + setupThread = () => { + const thread = this.props.mxEvent.getThread(); + if (thread) { + thread.on("Thread.update", this.updateThread); + thread.once("Thread.ready", this.updateThread); + this.updateThread(); + } + }; + updateThread = () => { - this.forceUpdate(); + this.setState({ + thread: this.props.mxEvent.getThread(), + }); }; public renderEventTile(event: MatrixEvent): JSX.Element { diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index eb3d7499f4..a09fabc06d 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -280,7 +280,7 @@ const RoomSummaryCard: React.FC = ({ room, onClose }) => { - - + { SettingsStore.getValue("experimentalThreadSupport") && ( + + ) } diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 6f807f66d6..74d9fc5ca6 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -57,6 +57,7 @@ import ReactionsRow from '../messages/ReactionsRow'; import { getEventDisplayInfo } from '../../../utils/EventUtils'; import { RightPanelPhases } from "../../../stores/RightPanelStorePhases"; import { Thread } from '../../../../../matrix-js-sdk/src/models/thread'; +import SettingsStore from "../../../settings/SettingsStore"; const eventTileTypes = { [EventType.RoomMessage]: 'messages.MessageEvent', @@ -461,8 +462,10 @@ export default class EventTile extends React.Component { this.isListeningForReceipts = true; } - this.props.mxEvent.once("Thread.ready", this.updateThread); - this.props.mxEvent.on("Thread.update", this.updateThread); + if (SettingsStore.getValue("experimentalThreadSupport")) { + this.props.mxEvent.once("Thread.ready", this.updateThread); + this.props.mxEvent.on("Thread.update", this.updateThread); + } } private updateThread = (thread) => { @@ -511,6 +514,10 @@ export default class EventTile extends React.Component { } private renderThreadInfo(): React.ReactNode { + if (!SettingsStore.getValue("experimentalThreadSupport")) { + return null; + } + const thread = this.state.thread; const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); if (!thread || this.props.showThreadInfo === false) { From f5a284a1f044fddb17773552200267a0ae1b016f Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Thu, 19 Aug 2021 16:10:09 +0200 Subject: [PATCH 213/619] Fix flex values after blur changes --- res/css/structures/_LeftPanel.scss | 5 +++++ res/css/structures/_MatrixChat.scss | 5 ++--- src/components/structures/LoggedInView.tsx | 24 ++++++++++++---------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index db634cd71f..29077811d6 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -24,6 +24,11 @@ $roomListCollapsedWidth: 68px; } } +.mx_LeftPanel_wrapper { + display: flex; + max-width: 50%; +} + .mx_LeftPanel { background-color: $roomlist-bg-color; // TODO decrease this once Spaces launches as it'll no longer need to include the 56px Community Panel diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index 90e28fb0a9..147bf2a1d1 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -33,6 +33,7 @@ limitations under the License. height: 100%; } + .mx_MatrixToolbar { order: 1; @@ -47,9 +48,7 @@ limitations under the License. display: flex; flex: 1; - flex-grow: 0; min-height: 0; - max-width: 50%; } .mx_MatrixChat_syncError { @@ -65,7 +64,7 @@ limitations under the License. } /* not the left panel, and not the resize handle, so the roomview/groupview/... */ -.mx_MatrixChat > :not(.mx_LeftPanel):not(.mx_SpacePanel):not(.mx_ResizeHandle) { +.mx_MatrixChat > :not(.mx_LeftPanel):not(.mx_SpacePanel):not(.mx_ResizeHandle):not(.mx_LeftPanel_wrapper) { background-color: $primary-bg-color; flex: 1 1 0; diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 44c65c73ff..85b62637e6 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -644,18 +644,20 @@ class LoggedInView extends React.Component { aria-hidden={this.props.hideToSRUsers} > -
    - - { SpaceStore.spacesEnabled ? : null } - - +
    +
    + + { SpaceStore.spacesEnabled ? : null } + + +
    + { pageElement }
    - { pageElement }
    From 3f1c35d71c33eb90ca2924a06200f071f17ffaea Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Thu, 19 Aug 2021 19:26:19 +0200 Subject: [PATCH 214/619] Fix backdrop panel empty image --- src/components/structures/BackdropPanel.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 2dd4b18fb9..5f94692fc7 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -140,12 +140,13 @@ export default class BackdropPanel extends React.PureComponent { public render() { if (!this.props.backgroundImage) return null; return
    - - } + + { this.state?.lpImage !== 'data:,' && + src={this.state.lpImage} /> } Date: Thu, 19 Aug 2021 12:03:48 +0000 Subject: [PATCH 215/619] Translated using Weblate (Albanian) Currently translated at 99.7% (3133 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 44462fadfb..e09442c7dd 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3660,5 +3660,8 @@ "You can change this later.": "Këtë mund ta ndryshoni më vonë.", "What kind of Space do you want to create?": "Ç’lloj Hapësire doni të krijoni?", "Delete avatar": "Fshije avatarin", - "Don't send read receipts": "Mos dërgo dëftesa leximi" + "Don't send read receipts": "Mos dërgo dëftesa leximi", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Regjistrat e diagnostikimit përmbajnë të dhëna mbi përdorimin e aplikacionit, përfshi emrin tuaj të përdoruesit, ID-të ose aliaset e dhomave apo grupeve që keni vizituar, me cilat elemente të UI-t keni ndërvepruar së fundi, dhe emrat e përdoruesve të përdoruesve të tjerë. Në to nuk përmbahen mesazhe.", + "Unknown failure: %(reason)s": "Dështim për arsye të panjohur: %(reason)s", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Nëse keni parashtruar një të metë përmes GitHub-it, regjistrat e diagnostikimit mund të na ndihmojnë të zbulojmë problemin. Regjistrat e diagnostikimit përmbajnë të dhëna mbi përdorimin e aplikacionit, përfshi emrin tuaj të përdoruesit, ID-të ose aliaset e dhomave apo grupeve që keni vizituar, me cilat elemente të UI-t keni ndërvepruar së fundi, dhe emrat e përdoruesve të përdoruesve të tjerë. Në to nuk përmbahen mesazhe." } From 5ce82266810ade801f1918fbf2a1ed7b1ab9a2f8 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 19 Aug 2021 18:55:20 +0000 Subject: [PATCH 216/619] Translated using Weblate (Hungarian) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 0f9ea05386..b0343072e2 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3668,5 +3668,7 @@ "You can also create a Space from a community.": "Közösségből is lehet Teret készíteni.", "You can change this later.": "Ezt később meg lehet változtatni.", "What kind of Space do you want to create?": "Milyen típusú teret szeretne készíteni?", - "Delete avatar": "Profilkép törlése" + "Delete avatar": "Profilkép törlése", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "A hibakereső napló alkalmazás használati adatokat tartalmaz beleértve a felhasználói nevedet, az általad meglátogatott szobák és csoportok azonosítóit alternatív neveit, az utolsó felhasználói felület elemét amit használt és más felhasználói neveket. Csevegés üzenetek szövegét nem tartalmazza.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Ha a GitHubon keresztül küldted be a hibát, a hibakeresési napló segíthet nekünk a javításban. A napló felhasználási adatokat tartalmaz mint a felhasználói neved, az általad meglátogatott szobák vagy csoportok azonosítóját vagy alternatív nevét, az utolsó felhasználói felület elemét amit használt és mások felhasználói nevét. De nem tartalmazzák az üzeneteket." } From 02259a17364b8fb655c7fda272e7d66901ec442f Mon Sep 17 00:00:00 2001 From: XoseM Date: Fri, 20 Aug 2021 05:09:37 +0000 Subject: [PATCH 217/619] Translated using Weblate (Galician) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index ec0af57357..1094a60fae 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3674,5 +3674,7 @@ "You can also create a Space from a community.": "Tamén podes crear un Espazo a partir dunha comunidade.", "You can change this later.": "Esto poderalo cambiar máis tarde.", "What kind of Space do you want to create?": "Que tipo de Espazo queres crear?", - "Unknown failure: %(reason)s": "Fallo descoñecido: %(reason)s" + "Unknown failure: %(reason)s": "Fallo descoñecido: %(reason)s", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Os rexistros de depuración conteñen datos de uso da aplicación incluíndo o teu nome de usuaria, IDs ou alias das salas e grupos que visitaches, os últimos elementos da interface cos que interactuaches así como nomes de usuaria de outras usuarias. Non conteñen mensaxes.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Se informaches dun fallo en GitHub, os rexistros de depuración poden axudarnos a solucionar o problema. Estos rexistros conteñen datos de uso da aplicación incluíndo o nome de usuaria, IDs ou alias das salas ou grupos que visitaches, os últimos elementos da interface cos que interactuaches así como nomes de usuaria de outras usuarias. Non conteñen mensaxes." } From c0d98ba65878c335eee2ec2a40429267590891cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 20 Aug 2021 08:37:30 +0200 Subject: [PATCH 218/619] Show "Enable encryption in settings" only when the user can do that MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/NewRoomIntro.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/NewRoomIntro.tsx b/src/components/views/rooms/NewRoomIntro.tsx index 674bcdaec2..8a96b8a9ba 100644 --- a/src/components/views/rooms/NewRoomIntro.tsx +++ b/src/components/views/rooms/NewRoomIntro.tsx @@ -36,6 +36,7 @@ import { showSpaceInvite } from "../../../utils/space"; import { privateShouldBeEncrypted } from "../../../createRoom"; import EventTileBubble from "../messages/EventTileBubble"; import { ROOM_SECURITY_TAB } from "../dialogs/RoomSettingsDialog"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; function hasExpectedEncryptionSettings(matrixClient: MatrixClient, room: Room): boolean { const isEncrypted: boolean = matrixClient.isRoomEncrypted(room.roomId); @@ -191,11 +192,21 @@ const NewRoomIntro = () => { }); } - const sub2 = _t( + const subText = _t( "Your private messages are normally encrypted, but this room isn't. "+ "Usually this is due to an unsupported device or method being used, " + - "like email invites. Enable encryption in settings.", {}, - { a: sub => { sub } }, + "like email invites.", + ); + + let subButton; + if (room.currentState.mayClientSendStateEvent(EventType.RoomEncryption, MatrixClientPeg.get())) { + subButton = ( + { _t("Enable encryption in settings.") } + ); + } + + const subtitle = ( + { subText } { subButton } ); return
    @@ -204,7 +215,7 @@ const NewRoomIntro = () => { ) } From ac9ebd8a108804f7c82217aa77987ec6af286bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 20 Aug 2021 08:37:46 +0200 Subject: [PATCH 219/619] i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/i18n/strings/en_EN.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index e3b1978bee..38442624f6 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1571,7 +1571,8 @@ "Invite to just this room": "Invite to just this room", "Add a photo, so people can easily spot your room.": "Add a photo, so people can easily spot your room.", "This is the start of .": "This is the start of .", - "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites. Enable encryption in settings.": "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites. Enable encryption in settings.", + "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites.": "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites.", + "Enable encryption in settings.": "Enable encryption in settings.", "End-to-end encryption isn't enabled": "End-to-end encryption isn't enabled", "Unpin": "Unpin", "View message": "View message", From 952fdd04c18375dc41ca27da333b189f6c270374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 20 Aug 2021 10:04:40 +0200 Subject: [PATCH 220/619] Fix call tiles on the bubble layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_EventBubbleTile.scss | 1 + src/components/views/rooms/EventTile.tsx | 8 +++++++- src/utils/EventUtils.ts | 11 ++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/_EventBubbleTile.scss b/res/css/views/rooms/_EventBubbleTile.scss index c6170bf7c0..f270146606 100644 --- a/res/css/views/rooms/_EventBubbleTile.scss +++ b/res/css/views/rooms/_EventBubbleTile.scss @@ -264,6 +264,7 @@ limitations under the License. } .mx_EventTile.mx_EventTile_bubbleContainer[data-layout=bubble], +.mx_EventTile.mx_EventTile_leftAlignedBubble[data-layout=bubble], .mx_EventTile.mx_EventTile_info[data-layout=bubble], .mx_EventListSummary[data-layout=bubble][data-expanded=false] { --backgroundColor: transparent; diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index c97b28b368..dd954e46ce 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -857,7 +857,12 @@ export default class EventTile extends React.Component { render() { const msgtype = this.props.mxEvent.getContent().msgtype; const eventType = this.props.mxEvent.getType() as EventType; - const { tileHandler, isBubbleMessage, isInfoMessage } = getEventDisplayInfo(this.props.mxEvent); + const { + tileHandler, + isBubbleMessage, + isInfoMessage, + isLeftAlignedBubbleMessage, + } = getEventDisplayInfo(this.props.mxEvent); // This shouldn't happen: the caller should check we support this type // before trying to instantiate us @@ -879,6 +884,7 @@ export default class EventTile extends React.Component { const isEditing = !!this.props.editState; const classes = classNames({ mx_EventTile_bubbleContainer: isBubbleMessage, + mx_EventTile_leftAlignedBubble: isLeftAlignedBubbleMessage, mx_EventTile: true, mx_EventTile_isEditing: isEditing, mx_EventTile_info: isInfoMessage, diff --git a/src/utils/EventUtils.ts b/src/utils/EventUtils.ts index 7aef05c523..d5a5c416ba 100644 --- a/src/utils/EventUtils.ts +++ b/src/utils/EventUtils.ts @@ -103,6 +103,7 @@ export function getEventDisplayInfo(mxEvent: MatrixEvent): { isInfoMessage: boolean; tileHandler: string; isBubbleMessage: boolean; + isLeftAlignedBubbleMessage: boolean; } { const content = mxEvent.getContent(); const msgtype = content.msgtype; @@ -118,12 +119,16 @@ export function getEventDisplayInfo(mxEvent: MatrixEvent): { (eventType === EventType.RoomEncryption) || (tileHandler === "messages.MJitsiWidgetEvent") ); + const isLeftAlignedBubbleMessage = ( + !isBubbleMessage && + eventType === EventType.CallInvite + ); let isInfoMessage = ( !isBubbleMessage && + !isLeftAlignedBubbleMessage && eventType !== EventType.RoomMessage && eventType !== EventType.Sticker && - eventType !== EventType.RoomCreate && - eventType !== EventType.CallInvite + eventType !== EventType.RoomCreate ); // If we're showing hidden events in the timeline, we should use the @@ -137,5 +142,5 @@ export function getEventDisplayInfo(mxEvent: MatrixEvent): { isInfoMessage = true; } - return { tileHandler, isInfoMessage, isBubbleMessage }; + return { tileHandler, isInfoMessage, isBubbleMessage, isLeftAlignedBubbleMessage }; } From 0be1e7cf70930d5a405ce555bd57a644dd98b185 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 20 Aug 2021 07:57:59 +0000 Subject: [PATCH 221/619] Translated using Weblate (Swedish) Currently translated at 97.3% (3058 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 7a4c4ec5fa..833438b315 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3506,5 +3506,12 @@ "Application window": "Programfönster", "Share entire screen": "Dela hela skärmen", "Message search initialisation failed, check your settings for more information": "Initialisering av meddelandesök misslyckades, kolla dina inställningar för mer information", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Om du har rapporterat en bugg via GitHub så kan felsökningsloggar hjälpa oss att hitta problemet. Felsökningsloggar innehåller användningsdata som inkluderar ditt användarnamn, ID:n eller alias för rum och grupper du har besökt, vilka UI-element du har interagerat med, och användarnamn för andra användare. De innehåller inte meddelanden." + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Om du har rapporterat en bugg via GitHub så kan felsökningsloggar hjälpa oss att hitta problemet. Felsökningsloggar innehåller användningsdata som inkluderar ditt användarnamn, ID:n eller alias för rum och grupper du har besökt, vilka UI-element du har interagerat med, och användarnamn för andra användare. De innehåller inte meddelanden.", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Felsökningsloggar innehåller användningsdata som inkluderar ditt användarnamn, ID:n eller alias för rum och grupper du har besökt, vilka UI-element du har interagerat med, och användarnamn för andra användare. De innehåller inte meddelanden.", + "Adding spaces has moved.": "Tilläggning av utrymmen har flyttats.", + "Search for rooms": "Sök efter rum", + "Search for spaces": "Sök efter utrymmen", + "Create a new space": "Skapa ett nytt utrymme", + "Want to add a new space instead?": "Vill du lägga till ett nytt utrymme istället?", + "Add existing space": "Lägg till existerande utrymme" } From fd3787ce822797a9de294917887d77ee3ec73f96 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Fri, 20 Aug 2021 13:03:08 +0200 Subject: [PATCH 222/619] Fix modern layout --- src/components/structures/LoggedInView.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 44c65c73ff..f4ad933d64 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -623,9 +623,12 @@ class LoggedInView extends React.Component { break; } + const wrapperClasses = classNames({ + 'mx_MatrixChat_wrapper': true, + 'mx_MatrixChat_useCompactLayout': this.state.useCompactLayout, + }); const bodyClasses = classNames({ 'mx_MatrixChat': true, - 'mx_MatrixChat_useCompactLayout': this.state.useCompactLayout, 'mx_MatrixChat--with-avatar': this.state.backgroundImage, }); @@ -640,7 +643,7 @@ class LoggedInView extends React.Component {
    From 67ce0815103a2e1b0dcfe5efc3fbc67bd9f29d54 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Fri, 20 Aug 2021 13:04:45 +0200 Subject: [PATCH 223/619] Fix one line too much in scss --- res/css/structures/_MatrixChat.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/structures/_MatrixChat.scss b/res/css/structures/_MatrixChat.scss index 147bf2a1d1..5232c14e74 100644 --- a/res/css/structures/_MatrixChat.scss +++ b/res/css/structures/_MatrixChat.scss @@ -33,7 +33,6 @@ limitations under the License. height: 100%; } - .mx_MatrixToolbar { order: 1; From 30a762944af85a7134e3a4829d2f95ab53001d6c Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Fri, 20 Aug 2021 12:11:04 +0100 Subject: [PATCH 224/619] Implement a very low fidelity UI for threads --- res/css/views/rooms/_EventTile.scss | 25 ++++++++++++++++++- res/css/views/rooms/_MessageComposer.scss | 14 +++++++++++ src/components/structures/ThreadView.tsx | 1 + .../views/rooms/MessageComposer.tsx | 12 +++++++-- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 4dd91eb7f2..4b48ec971b 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -681,6 +681,30 @@ $hover-select-border: 4px; display: flex; flex-direction: column; + .mx_ScrollPanel { + margin-top: 20px; + .mx_RoomView_MessageList { + padding: 0; + } + } + + .mx_EventTile_senderDetails { + display: flex; + align-items: center; + gap: 6px; + margin-bottom: 6px; + a { + flex: 1; + min-width: none; + max-width: 100%; + display: flex; + align-items: center; + .mx_SenderProfile { + flex: 1; + } + } + } + .mx_ThreadView_List { flex: 1; overflow: scroll; @@ -698,7 +722,6 @@ $hover-select-border: 4px; width: 100%; display: flex; flex-direction: column; - border-bottom: 1px solid #888; margin-top: 0; padding-bottom: 5px; margin-bottom: 5px; diff --git a/res/css/views/rooms/_MessageComposer.scss b/res/css/views/rooms/_MessageComposer.scss index 5e2eff4047..b2747f7a9b 100644 --- a/res/css/views/rooms/_MessageComposer.scss +++ b/res/css/views/rooms/_MessageComposer.scss @@ -340,3 +340,17 @@ limitations under the License. height: 50px; } } + +/** + * Unstable compact mode + */ + +.mx_MessageComposer.mx_MessageComposer--compact { + margin-right: 0; + .mx_MessageComposer_wrapper { + padding: 0; + } + .mx_MessageComposer_button:last-child { + margin-right: 0; + } +} diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index 7767e5929e..5d07b7feaa 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -115,6 +115,7 @@ class ThreadView extends React.Component { replyToEvent={thread?.replyToEvent} showReplyPreview={false} permalinkCreator={this.props.permalinkCreator} + compact={true} /> ); diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index bd53c9566a..fbf3b58570 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -185,6 +185,7 @@ interface IProps { replyToEvent?: MatrixEvent; showReplyPreview?: boolean; e2eStatus?: E2EStatus; + compact?: boolean; } interface IState { @@ -204,6 +205,7 @@ export default class MessageComposer extends React.Component { static defaultProps = { showReplyPreview: true, + compact: false, }; constructor(props) { @@ -367,7 +369,7 @@ export default class MessageComposer extends React.Component { render() { const controls = [ - this.state.me ? : null, + this.state.me && !this.props.compact ? : null, this.props.e2eStatus ? : null, @@ -455,8 +457,14 @@ export default class MessageComposer extends React.Component { />; } + const classes = classNames({ + "mx_MessageComposer": true, + "mx_GroupLayout": true, + "mx_MessageComposer--compact": this.props.compact, + }); + return ( -
    +
    { recordingTooltip }
    { this.props.showReplyPreview && ( From b5b0a9bc4e439fc1a79eaa01b1ed2259a0776151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 20 Aug 2021 15:10:42 +0200 Subject: [PATCH 225/619] Show emoji autocomplete only after the user has type 2 characters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/autocomplete/EmojiProvider.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/autocomplete/EmojiProvider.tsx b/src/autocomplete/EmojiProvider.tsx index 0aae8c6372..8a1a2d97e7 100644 --- a/src/autocomplete/EmojiProvider.tsx +++ b/src/autocomplete/EmojiProvider.tsx @@ -91,7 +91,8 @@ export default class EmojiProvider extends AutocompleteProvider { let completions = []; const { command, range } = this.getCurrentCommand(query, selection); - if (command) { + + if (command && command[0].length > 2) { const matchedString = command[0]; completions = this.matcher.match(matchedString, limit); From 5ffa3783ddfb9b0de7f5bbc53b5d8f9eb5e1922d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 20 Aug 2021 15:16:22 +0200 Subject: [PATCH 226/619] Don't show emoticons in emoji autocomplete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/autocomplete/EmojiProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/autocomplete/EmojiProvider.tsx b/src/autocomplete/EmojiProvider.tsx index 8a1a2d97e7..326651e037 100644 --- a/src/autocomplete/EmojiProvider.tsx +++ b/src/autocomplete/EmojiProvider.tsx @@ -67,7 +67,7 @@ export default class EmojiProvider extends AutocompleteProvider { constructor() { super(EMOJI_REGEX); this.matcher = new QueryMatcher(SORTED_EMOJI, { - keys: ['emoji.emoticon'], + keys: [], funcs: [o => o.emoji.shortcodes.map(s => `:${s}:`)], // For matching against ascii equivalents shouldMatchWordsOnly: false, From 74d79ff205b2fa9430feaf2b612d13b45c24fa36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 20 Aug 2021 15:55:52 +0200 Subject: [PATCH 227/619] Watch RoomList.backgroundImage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/LoggedInView.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 44c65c73ff..1462cc646a 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -152,6 +152,7 @@ class LoggedInView extends React.Component { protected readonly _roomView: React.RefObject; protected readonly _resizeContainer: React.RefObject; protected compactLayoutWatcherRef: string; + protected backgroundImageWatcherRef: string; protected resizer: Resizer; constructor(props, context) { @@ -195,6 +196,9 @@ class LoggedInView extends React.Component { this.compactLayoutWatcherRef = SettingsStore.watchSetting( "useCompactLayout", null, this.onCompactLayoutChanged, ); + this.backgroundImageWatcherRef = SettingsStore.watchSetting( + "RoomList.backgroundImage", null, this.refreshBackgroundImage, + ); this.resizer = this.createResizer(); this.resizer.attach(); @@ -212,6 +216,7 @@ class LoggedInView extends React.Component { this._matrixClient.removeListener("RoomState.events", this.onRoomStateEvents); OwnProfileStore.instance.off(UPDATE_EVENT, this.refreshBackgroundImage); SettingsStore.unwatchSetting(this.compactLayoutWatcherRef); + SettingsStore.unwatchSetting(this.backgroundImageWatcherRef); this.resizer.detach(); } From 86b6c6a83637b6e5e19c93bb445ac208ba2f5732 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Fri, 20 Aug 2021 15:57:22 +0200 Subject: [PATCH 228/619] Fix room views not having proper container --- res/css/structures/_RoomView.scss | 7 +++++++ src/components/structures/LoggedInView.tsx | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss index 84f28b5ada..5c20f675f9 100644 --- a/res/css/structures/_RoomView.scss +++ b/res/css/structures/_RoomView.scss @@ -14,6 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_RoomView_wrapper { + display: flex; + flex-direction: column; + flex: 1; + position: relative; +} + .mx_RoomView { word-wrap: break-word; display: flex; diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 85b62637e6..6008268877 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -656,7 +656,9 @@ class LoggedInView extends React.Component { />
    - { pageElement } +
    + { pageElement } +
    From d9b79888fd1b1d0074266b3c59c6d464061cedee Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Fri, 20 Aug 2021 18:15:57 +0200 Subject: [PATCH 229/619] Fix content not being centered --- res/css/structures/_RoomView.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/structures/_RoomView.scss b/res/css/structures/_RoomView.scss index 5c20f675f9..81ea75c442 100644 --- a/res/css/structures/_RoomView.scss +++ b/res/css/structures/_RoomView.scss @@ -19,6 +19,7 @@ limitations under the License. flex-direction: column; flex: 1; position: relative; + justify-content: center; } .mx_RoomView { From 9a3a5a7e63590fad482f17d5ccc0354d3c0f3382 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Sat, 21 Aug 2021 10:16:26 +0200 Subject: [PATCH 230/619] Fix spaces preview screen --- res/css/structures/_SpaceRoomView.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/res/css/structures/_SpaceRoomView.scss b/res/css/structures/_SpaceRoomView.scss index 945de01eba..76183f6931 100644 --- a/res/css/structures/_SpaceRoomView.scss +++ b/res/css/structures/_SpaceRoomView.scss @@ -62,6 +62,9 @@ $SpaceRoomViewInnerWidth: 428px; } .mx_SpaceRoomView { + overflow-y: auto; + flex: 1; + .mx_MainSplit > div:first-child { padding: 80px 60px; flex-grow: 1; @@ -248,6 +251,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceRoomView_landing { display: flex; flex-direction: column; + min-width: 0; > .mx_BaseAvatar_image, > .mx_BaseAvatar > .mx_BaseAvatar_image { From 81d64bec58fd4d9a042b52b0fb7c6f01b384e532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 21 Aug 2021 18:18:53 +0200 Subject: [PATCH 231/619] Fix autocomplete scrollbar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_Autocomplete.scss | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/res/css/views/rooms/_Autocomplete.scss b/res/css/views/rooms/_Autocomplete.scss index f87bb571d6..b555a625d3 100644 --- a/res/css/views/rooms/_Autocomplete.scss +++ b/res/css/views/rooms/_Autocomplete.scss @@ -8,12 +8,14 @@ border-bottom: none; border-radius: 8px 8px 0 0; max-height: 50vh; - overflow: auto; + overflow: clip; + display: flex; box-shadow: 0px -16px 32px $composer-shadow-color; } .mx_Autocomplete_ProviderSection { border-bottom: 1px solid $primary-hairline-color; + width: 100%; } /* a "block" completion takes up a whole line */ @@ -59,8 +61,8 @@ .mx_Autocomplete_Completion_container_pill { margin: 12px; - display: flex; - flex-direction: column; + height: 100%; + overflow-y: scroll; } .mx_Autocomplete_Completion_container_truncate { From b58184d61e5eb3d07fc05358f095b3e808d35f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 21 Aug 2021 19:04:26 +0200 Subject: [PATCH 232/619] Make autocomplete smaller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/rooms/_Autocomplete.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/rooms/_Autocomplete.scss b/res/css/views/rooms/_Autocomplete.scss index b555a625d3..ffe1011f51 100644 --- a/res/css/views/rooms/_Autocomplete.scss +++ b/res/css/views/rooms/_Autocomplete.scss @@ -7,7 +7,7 @@ background: $primary-bg-color; border-bottom: none; border-radius: 8px 8px 0 0; - max-height: 50vh; + max-height: 35vh; overflow: clip; display: flex; box-shadow: 0px -16px 32px $composer-shadow-color; From cb7e44f4f5e5dfbb211b10a887136c7e0c917954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 22 Aug 2021 09:08:33 +0200 Subject: [PATCH 233/619] Always show a transparent border to avoid icon jumps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/voip/_VideoFeed.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/res/css/views/voip/_VideoFeed.scss b/res/css/views/voip/_VideoFeed.scss index ec7260a8bb..72c45991a2 100644 --- a/res/css/views/voip/_VideoFeed.scss +++ b/res/css/views/voip/_VideoFeed.scss @@ -18,6 +18,7 @@ limitations under the License. overflow: hidden; position: relative; box-sizing: border-box; + border: transparent 2px solid; &.mx_VideoFeed_voice { background-color: $inverted-bg-color; From d29a18b1828be38dbddd7889315d6a6ade178dfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 22 Aug 2021 10:10:05 +0200 Subject: [PATCH 234/619] Fix some sizing issue on video feeds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/voip/_CallViewSidebar.scss | 3 +-- res/css/views/voip/_VideoFeed.scss | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/res/css/views/voip/_CallViewSidebar.scss b/res/css/views/voip/_CallViewSidebar.scss index dbadc22028..fd9c76defc 100644 --- a/res/css/views/voip/_CallViewSidebar.scss +++ b/res/css/views/voip/_CallViewSidebar.scss @@ -33,10 +33,9 @@ limitations under the License. > .mx_VideoFeed { width: 100%; + border-radius: 4px; &.mx_VideoFeed_voice { - border-radius: 4px; - display: flex; align-items: center; justify-content: center; diff --git a/res/css/views/voip/_VideoFeed.scss b/res/css/views/voip/_VideoFeed.scss index 72c45991a2..1f17a54692 100644 --- a/res/css/views/voip/_VideoFeed.scss +++ b/res/css/views/voip/_VideoFeed.scss @@ -19,6 +19,7 @@ limitations under the License. position: relative; box-sizing: border-box; border: transparent 2px solid; + display: flex; &.mx_VideoFeed_voice { background-color: $inverted-bg-color; @@ -27,6 +28,10 @@ limitations under the License. &.mx_VideoFeed_speaking { border: $accent-color 2px solid; + + .mx_VideoFeed_video { + border-radius: 0; + } } .mx_VideoFeed_video { From 0ddb71a4fec426ca44431170c1db68dedce9edb7 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Sun, 22 Aug 2021 13:05:23 +0200 Subject: [PATCH 235/619] Optimize backdrop blur --- src/components/structures/BackdropPanel.tsx | 69 ++++++--------------- 1 file changed, 19 insertions(+), 50 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 5f94692fc7..de20705436 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -31,9 +31,6 @@ interface IState { } export default class BackdropPanel extends React.PureComponent { - private leftLeftPanelRef = createRef(); - private leftPanelRef = createRef(); - private sizes = { leftLeftPanelWidth: 0, leftPanelWidth: 0, @@ -76,36 +73,22 @@ export default class BackdropPanel extends React.PureComponent { }; private refreshBackdropImage = (): void => { - const leftLeftPanelContext = this.leftLeftPanelRef.current.getContext("2d"); - const leftPanelContext = this.leftPanelRef.current.getContext("2d"); - const { leftLeftPanelWidth, leftPanelWidth, height } = this.sizes; - const width = leftLeftPanelWidth + leftPanelWidth; + const leftLeftPanelCanvas = document.createElement('canvas'); + const leftPanelCanvas = document.createElement('canvas'); + const leftLeftPanelContext = leftLeftPanelCanvas.getContext("2d"); + const leftPanelContext = leftPanelCanvas.getContext("2d"); + const { leftLeftPanelWidth, height } = this.sizes; const { backgroundImage } = this.props; const imageWidth = (backgroundImage as ImageBitmap).width; const imageHeight = (backgroundImage as ImageBitmap).height; - - const contentRatio = imageWidth / imageHeight; - const containerRatio = width / height; - let resultHeight; - let resultWidth; - if (contentRatio > containerRatio) { - resultHeight = height; - resultWidth = height * contentRatio; - } else { - resultWidth = width; - resultHeight = width / contentRatio; - } - // This value has been chosen to be as close with rendering as the css-only // backdrop-filter: blur effect was, mostly takes effect for vertical pictures. - const x = width * 0.1; - const y = (height - resultHeight) / 2; - this.leftLeftPanelRef.current.width = leftLeftPanelWidth; - this.leftLeftPanelRef.current.height = height; - this.leftPanelRef.current.width = (window.screen.width * 0.5); - this.leftPanelRef.current.height = height; + leftLeftPanelCanvas.width = leftLeftPanelWidth; + leftLeftPanelCanvas.height = height; + leftPanelCanvas.width = window.screen.width * 0.5; + leftPanelCanvas.height = height; const spacesBlur = this.style.getPropertyValue('--llp-background-blur'); const roomListBlur = this.style.getPropertyValue('--lp-background-blur'); @@ -116,23 +99,23 @@ export default class BackdropPanel extends React.PureComponent { backgroundImage, 0, 0, imageWidth, imageHeight, - x, - y, - resultWidth, - resultHeight, + 0, + 0, + leftLeftPanelWidth, + window.screen.height, ); leftPanelContext.drawImage( backgroundImage, 0, 0, imageWidth, imageHeight, - x - leftLeftPanelWidth, - y, - resultWidth, - resultHeight, + 0, + 0, + window.screen.width * 0.5, + window.screen.height, ); this.setState({ - lpImage: this.leftPanelRef.current.toDataURL('image/jpeg', 1), - llpImage: this.leftLeftPanelRef.current.toDataURL('image/jpeg', 1), + lpImage: leftPanelCanvas.toDataURL('image/jpeg', 1), + llpImage: leftLeftPanelCanvas.toDataURL('image/jpeg', 1), }); }; @@ -147,20 +130,6 @@ export default class BackdropPanel extends React.PureComponent { { this.state?.lpImage !== 'data:,' && } - -
    ; } } From 99a935534c14e73d09c9ec33e92764ce11ad7f4e Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Sun, 22 Aug 2021 13:08:33 +0200 Subject: [PATCH 236/619] test --- src/components/structures/BackdropPanel.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index de20705436..d816109e0b 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -98,11 +98,6 @@ export default class BackdropPanel extends React.PureComponent { leftLeftPanelContext.drawImage( backgroundImage, 0, 0, - imageWidth, imageHeight, - 0, - 0, - leftLeftPanelWidth, - window.screen.height, ); leftPanelContext.drawImage( backgroundImage, From 1c93e18c0a5735604186ae6c4f0678faaf3fe208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 22 Aug 2021 15:22:21 +0200 Subject: [PATCH 237/619] Move CallPreview CSS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/voip/_CallContainer.scss | 13 ------------- res/css/views/voip/_CallPreview.scss | 11 +++++++++++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index d11ab9bf9f..a0137b18e8 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -26,19 +26,6 @@ limitations under the License. // different level. pointer-events: none; - .mx_CallPreview { - pointer-events: initial; // restore pointer events so the user can leave/interact - - .mx_VideoFeed_remote.mx_VideoFeed_voice { - min-height: 150px; - } - - .mx_VideoFeed_local { - border-radius: 8px; - overflow: hidden; - } - } - .mx_AppTile_persistedWrapper div { min-width: 350px; } diff --git a/res/css/views/voip/_CallPreview.scss b/res/css/views/voip/_CallPreview.scss index 92348fb465..0fd97d4676 100644 --- a/res/css/views/voip/_CallPreview.scss +++ b/res/css/views/voip/_CallPreview.scss @@ -18,4 +18,15 @@ limitations under the License. position: fixed; left: 0; top: 0; + + pointer-events: initial; // restore pointer events so the user can leave/interact + + .mx_VideoFeed_remote.mx_VideoFeed_voice { + min-height: 150px; + } + + .mx_VideoFeed_local { + border-radius: 8px; + overflow: hidden; + } } From 8f0199c5dbff2a71d66c15cc8c07e74d14f45754 Mon Sep 17 00:00:00 2001 From: jelv Date: Sun, 22 Aug 2021 20:33:45 +0000 Subject: [PATCH 238/619] Translated using Weblate (Dutch) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 5b3c9d484c..920add953f 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3321,7 +3321,7 @@ "Published addresses can be used by anyone on any server to join your room.": "Gepubliceerde adressen kunnen door iedereen op elke server gebruikt worden om bij uw gesprek te komen.", "Published addresses can be used by anyone on any server to join your space.": "Gepubliceerde adressen kunnen door iedereen op elke server gebruikt worden om uw space te betreden.", "This space has no local addresses": "Deze space heeft geen lokaaladres", - "Space information": "Space informatie", + "Space information": "Spaceinformatie", "Collapse": "Invouwen", "Expand": "Uitvouwen", "Recommended for public spaces.": "Aanbevolen voor openbare spaces.", @@ -3562,5 +3562,7 @@ "Space created": "Space aangemaakt", "To view Spaces, hide communities in Preferences": "Om Spaces te zien, verberg gemeenschappen in uw Instellingen", "This community has been upgraded into a Space": "Deze gemeenschap is geupgrade naar een Space", - "Unknown failure: %(reason)s": "Onbekende fout: %(reason)s" + "Unknown failure: %(reason)s": "Onbekende fout: %(reason)s", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Debug logs bevatten applicatie gebruiksgegevens inclusief uw inlognaam, de ID's of aliassen van de kamers of groepen die u hebt bezocht, welke UI elementen u het laatst hebt gebruikt, en de inlognamen van andere personen. Ze bevatten geen berichten.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Als u een bug hebt ingediend via GitHub, kunnen debug logs ons helpen het probleem op te sporen. Debug logs bevatten applicatie gebruiksgegevens inclusief uw inlognaam, de ID's of aliassen van de kamers of groepen die u hebt bezocht, welke UI elementen u het laatst hebt gebruikt, en de inlognamen van andere personen. Ze bevatten geen berichten." } From cdf399ebf4b13ef6d09eae54d74ca3f8f1e2d64e Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sun, 22 Aug 2021 18:37:21 +0000 Subject: [PATCH 239/619] Translated using Weblate (Swedish) Currently translated at 100.0% (3142 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 86 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 833438b315..abfc0ef8fc 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3354,7 +3354,7 @@ "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s accepterade inbjudan för %(displayName)s", "Some invites couldn't be sent": "Vissa inbjudningar kunde inte skickas", "We sent the others, but the below people couldn't be invited to ": "Vi skickade de andra, men personerna nedan kunde inte bjudas in till ", - "What this user is writing is wrong.\nThis will be reported to the room moderators.": "Vad användaren skriver är fel.\nDet här kommer att anmälas till rumsmoderatorerna.", + "What this user is writing is wrong.\nThis will be reported to the room moderators.": "Vad användaren skriver är fel.\nDetta kommer att anmälas till rumsmoderatorerna.", "Report to moderators prototype. In rooms that support moderation, the `report` button will let you report abuse to room moderators": "Prototyp av anmälan till moderatorer. I rum som söder moderering så kommer `anmäl`-knappen att låta dig anmäla olämpligt beteende till rummets moderatorer", "Report": "Rapportera", "Integration manager": "Integrationshanterare", @@ -3513,5 +3513,87 @@ "Search for spaces": "Sök efter utrymmen", "Create a new space": "Skapa ett nytt utrymme", "Want to add a new space instead?": "Vill du lägga till ett nytt utrymme istället?", - "Add existing space": "Lägg till existerande utrymme" + "Add existing space": "Lägg till existerande utrymme", + "[number]": "[nummer]", + "We're working on this, but just want to let you know.": "Vi jobbar på detta, men vill bara låta dig veta.", + "Search for rooms or spaces": "Sök efter rum eller gemenskaper", + "Created from ": "Skapad från ", + "To view %(spaceName)s, you need an invite": "För att se %(spaceName)s så behöver du en inbjudan", + "You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "Du kan klicka på en avatar i filterpanelen när som helst för att se endast rum och personer associerade med gemenskapen.", + "Unable to copy a link to the room to the clipboard.": "Kunde inte kopiera en länk till rummet till klippbordet.", + "Unable to copy room link": "Kunde inte kopiera rumslänken", + "Communities won't receive further updates.": "Gemenskaper kommer inte att uppgraderas vidare.", + "Spaces are a new way to make a community, with new features coming.": "Utrymmen är att nytt sätt att skapa en gemenskap, med ny funktionalitet inkommande.", + "Communities can now be made into Spaces": "Gemenskaper kan nu göras om till utrymmen", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Be administratören för den här gemenskapen att göra om den till ett utrymme och håll utkik efter en inbjudan.", + "You can create a Space from this community here.": "Du kan skapa ett utrymme från den här gemenskapen här.", + "Error downloading audio": "Fel vid nedladdning av ljud", + "Unnamed audio": "Namnlöst ljud", + "Move down": "Flytta ner", + "Move up": "Flytta upp", + "Add space": "Lägg till utrymme", + "Collapse reply thread": "Kollapsa svarstråd", + "Show preview": "Visa förhandsgranskning", + "View source": "Visa källkod", + "Forward": "Vidarebefordra", + "Settings - %(spaceName)s": "Inställningar - %(spaceName)s", + "Please note upgrading will make a new version of the room. All current messages will stay in this archived room.": "Observera att en uppgradering kommer att skapa en ny version av rummet. Alla nuvarande meddelanden kommer att stanna i det arkiverade rummet.", + "Automatically invite members from this room to the new one": "Bjud automatiskt in medlemmar från det här rummet till det nya", + "Report the entire room": "Rapportera hela rummet", + "Spam or propaganda": "Spam eller propaganda", + "Illegal Content": "Olagligt innehåll", + "Toxic Behaviour": "Stötande beteende", + "Disagree": "Håll inte med", + "Please pick a nature and describe what makes this message abusive.": "Välj en art och beskriv vad som gör detta meddelande kränkande.", + "This room is dedicated to illegal or toxic content or the moderators fail to moderate illegal or toxic content.\n This will be reported to the administrators of %(homeserver)s.": "Det här rummet är dedikerat till olagligt eller stötande innehåll, eller så modererar inte moderatorerna olagligt eller stötande innehåll ordentligt.\nDetta kommer att rapporteras till administratörerna för %(homeserver)s.", + "This room is dedicated to illegal or toxic content or the moderators fail to moderate illegal or toxic content.\nThis will be reported to the administrators of %(homeserver)s. The administrators will NOT be able to read the encrypted content of this room.": "Det här rummet är dedikerat till olagligt eller stötande innehåll, eller så modererar inte moderatorerna olagligt eller stötande innehåll ordentligt.\nDetta kommer att rapporteras till administratörerna för %(homeserver)s. Administratörerna kommer inte kunna läsa krypterat innehåll i rummet.", + "Any other reason. Please describe the problem.\nThis will be reported to the room moderators.": "Annan orsak. Beskriv problemet tack.\nDetta kommer att rapporteras till rumsmoderatorerna.", + "This user is spamming the room with ads, links to ads or to propaganda.\nThis will be reported to the room moderators.": "Användaren spammar rummet med reklam eller länkar till reklam eller propaganda.\nDetta kommer att rapporteras till rumsmoderatorerna.", + "This user is displaying illegal behaviour, for instance by doxing people or threatening violence.\nThis will be reported to the room moderators who may escalate this to legal authorities.": "Användaren påvisar olagligt beteende, som att doxa folk eller hota med våld.\nDetta kommer att rapporteras till rumsmoderatorerna som kanske eskalerar detta till juridiska myndigheter.", + "This user is displaying toxic behaviour, for instance by insulting other users or sharing adult-only content in a family-friendly room or otherwise violating the rules of this room.\nThis will be reported to the room moderators.": "Användaren påvisar stötande beteende, som att förolämpa andra användare, att dela vuxet innehåll i ett familjevänligt rum eller på annat sätt bryta mot reglerna i rummet.\nDetta kommer att rapporteras till rummets moderatorer.", + "These are likely ones other room admins are a part of.": "Dessa är troligen såna andra rumsadmins är med i.", + "Other spaces or rooms you might not know": "Andra utrymmen du kanske inte känner till", + "Spaces you know that contain this room": "Utrymmen du känner till som innehåller det här rummet", + "Search spaces": "Sök i utrymmen", + "Decide which spaces can access this room. If a space is selected, its members can find and join .": "Bestäm vilka utrymmen som kan komma åt det hör rummet. Om ett utrymme väljs så kan dess medlemmar hitta och gå med i .", + "Select spaces": "Välj utrymmen", + "You're removing all spaces. Access will default to invite only": "Du tar bort alla utrymmen. Åtkomst kommer att sättas som förval till endast inbjudan", + "Are you sure you want to leave ?": "Är du säker på att du vill lämna ?", + "Leave %(spaceName)s": "Lämna %(spaceName)s", + "You're the only admin of some of the rooms or spaces you wish to leave. Leaving them will leave them without any admins.": "Du är den enda administratören i vissa rum eller utrymmen du vill lämna. Om du lämnar så kommer vissa av dem sakna administratör.", + "You're the only admin of this space. Leaving it will mean no one has control over it.": "Du är den enda administratören i utrymmet. Om du lämnar nu så kommer ingen ha kontroll över det.", + "You won't be able to rejoin unless you are re-invited.": "Du kommer inte kunna gå med igen om du inte bjuds in igen.", + "Search %(spaceName)s": "Sök i %(spaceName)s", + "Leave specific rooms and spaces": "Lämna specifika rum och utrymmen", + "Don't leave any": "Lämna inte några", + "Leave all rooms and spaces": "Lämna alla rum och utrymmen", + "User Directory": "Användarkatalog", + "Want to add an existing space instead?": "Vill du lägga till ett existerande utrymme istället?", + "Add a space to a space you manage.": "Lägg till ett utrymme till ett utrymme du kan hantera.", + "Only people invited will be able to find and join this space.": "Bara inbjudna personer kommer kunna hitta och gå med i det här utrymmet.", + "Anyone will be able to find and join this space, not just members of .": "Vem som helst kommer kunna hitta och gå med i det här utrymme, inte bara medlemmar i .", + "Anyone in will be able to find and join.": "Vem som helst i kommer kunna hitta och gå med.", + "Private space (invite only)": "Privat utrymme (endast inbjudan)", + "Space visibility": "Utrymmessynlighet", + "This description will be shown to people when they view your space": "Den här beskrivningen kommer att visas för personer när de ser ditt utrymme", + "Flair won't be available in Spaces for the foreseeable future.": "Emblem kommer inte vara tillgängliga i utrymmen i den överskådliga framtiden.", + "All rooms will be added and all community members will be invited.": "Alla rum kommer att läggas till och alla gemenskapsmedlemmar kommer att bjudas in .", + "A link to the Space will be put in your community description.": "En länk till utrymmet kommer att läggas i gemenskapens beskrivning.", + "Create Space from community": "Skapa utrymme av gemenskapen", + "Failed to migrate community": "Misslyckades att migrera gemenskap", + "To create a Space from another community, just pick the community in Preferences.": "För att skapa ett utrymme från en annan gemenskap, välj en gemenskap i inställningarna.", + " has been made and everyone who was a part of the community has been invited to it.": " har skapats och alla som var med i gemenskapen har bjudits in till det.", + "Space created": "Utrymme skapat", + "To view Spaces, hide communities in Preferences": "För att se utrymmen, göm gemenskaper i inställningarna", + "This community has been upgraded into a Space": "Den här gemenskapen har uppgraderats till ett utrymme", + "Visible to space members": "Synligt för utrymmesmedlemmar", + "Public room": "Offentligt rum", + "Private room (invite only)": "Privat rum (endast inbjudan)", + "Room visibility": "Rumssynlighet", + "Create a room": "Skapa ett rum", + "Only people invited will be able to find and join this room.": "Bara inbjudna personer kommer kunna hitta och gå med i det här rummet.", + "Anyone will be able to find and join this room.": "Vem som helst kommer kunna hitta och gå med i det här rummet.", + "Anyone will be able to find and join this room, not just members of .": "Vem som helst kommer kunna hitta och gå med i det här rummet, inta bara medlemmar i .", + "You can change this at any time from room settings.": "Du kan ändra detta när som helst i rumsinställningarna.", + "Everyone in will be able to find and join this room.": "Alla i kommer kunna hitta och gå med i det här rummet." } From 5f2ed86b2d0d8a81aea67acdd3832eaf5f4a7c92 Mon Sep 17 00:00:00 2001 From: random Date: Sat, 21 Aug 2021 10:13:08 +0000 Subject: [PATCH 240/619] Translated using Weblate (Italian) Currently translated at 99.9% (3141 of 3142 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index febeab8678..55b1f4ddba 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3673,5 +3673,7 @@ "You can change this later.": "Puoi cambiarlo in seguito.", "What kind of Space do you want to create?": "Che tipo di spazio vuoi creare?", "Delete avatar": "Elimina avatar", - "Don't send read receipts": "Non inviare ricevute di lettura" + "Don't send read receipts": "Non inviare ricevute di lettura", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati, gli ultimi elementi dell'interfaccia con cui hai interagito e i nomi degli altri utenti. Non contengono messaggi.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Se hai segnalato un errore via Github, i log di debug possono aiutarci a identificare il problema. I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati, gli ultimi elementi dell'interfaccia con cui hai interagito e i nomi degli altri utenti. Non contengono messaggi." } From 7de102d7e7fd5e27486227e7c144f602f77e10e6 Mon Sep 17 00:00:00 2001 From: libexus Date: Mon, 23 Aug 2021 09:21:27 +0000 Subject: [PATCH 241/619] Translated using Weblate (German) Currently translated at 98.7% (3104 of 3144 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 45b7697caa..c9eb0059f8 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -3622,5 +3622,14 @@ "Create Space from community": "Space aus einer Community erstellen", "Failed to migrate community": "Fehler beim konvertieren der Community", " has been made and everyone who was a part of the community has been invited to it.": " wurde erfolgreich erstellt. Alle aus der alten Community wurden eingeladen.", - "Space created": "Space erstellt" + "Space created": "Space erstellt", + "Please note upgrading will make a new version of the room. All current messages will stay in this archived room.": "Upgraden wird eine neue Version des Raums erstellen. Die alten Nachrichten bleiben im alten Raum archiviert.", + "Other spaces or rooms you might not know": "Andere Spaces, die du möglicherweise nicht kennst", + "Spaces you know that contain this room": "Spaces, in denen du Mitglied bist und diesen Raum enthalten", + "You're removing all spaces. Access will default to invite only": "Du entfernst alle Spaces. Neue Personen können nur mehr mit Einladung beitreten", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Debug Logs enthalten Nutzungsdaten wie Nutzernamen von dir und anderen Personen, Raum-IDs deiner beigetretenen Räume und Spaces sowie mit welchen Elementen der Oberfläche du kürzlich interagiert hast aber keine Nachrichteninhalte.", + "People with supported clients will be able to join the room without having a registered account.": "Personen können diesen Raum ohne registrierten Account betreten.", + "Anyone can find and join.": "Jeder kann finden und beitreten.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Wenn du einen Bugreport bei GitHub einreichst, können uns Debug Logs helfen, das Problem ausfindig zu machen. Sie enthalten Nutzungsdaten wie Nutzernamen von dir und anderen Personen, Raum-IDs deiner beigetretenen Räume und Spaces sowie mit welchen Elementen der Oberfläche du kürzlich interagiert hast.", + "Mute the microphone": "Stummschalten" } From 93dccc8b55f476b73e7b320bf4e836fb79fd91a2 Mon Sep 17 00:00:00 2001 From: Timo Gurr Date: Mon, 23 Aug 2021 09:02:16 +0000 Subject: [PATCH 242/619] Translated using Weblate (German) Currently translated at 98.7% (3104 of 3144 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c9eb0059f8..f42bac0ca3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -3631,5 +3631,6 @@ "People with supported clients will be able to join the room without having a registered account.": "Personen können diesen Raum ohne registrierten Account betreten.", "Anyone can find and join.": "Jeder kann finden und beitreten.", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Wenn du einen Bugreport bei GitHub einreichst, können uns Debug Logs helfen, das Problem ausfindig zu machen. Sie enthalten Nutzungsdaten wie Nutzernamen von dir und anderen Personen, Raum-IDs deiner beigetretenen Räume und Spaces sowie mit welchen Elementen der Oberfläche du kürzlich interagiert hast.", - "Mute the microphone": "Stummschalten" + "Mute the microphone": "Stummschalten", + "Unmute the microphone": "Stummschaltung deaktivieren" } From 952b5bfa2a56bed1a8a90a015dd26ab59336adbd Mon Sep 17 00:00:00 2001 From: random Date: Mon, 23 Aug 2021 09:53:51 +0000 Subject: [PATCH 243/619] Translated using Weblate (Italian) Currently translated at 99.9% (3143 of 3144 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 55b1f4ddba..637714b3ef 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3675,5 +3675,8 @@ "Delete avatar": "Elimina avatar", "Don't send read receipts": "Non inviare ricevute di lettura", "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati, gli ultimi elementi dell'interfaccia con cui hai interagito e i nomi degli altri utenti. Non contengono messaggi.", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Se hai segnalato un errore via Github, i log di debug possono aiutarci a identificare il problema. I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati, gli ultimi elementi dell'interfaccia con cui hai interagito e i nomi degli altri utenti. Non contengono messaggi." + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Se hai segnalato un errore via Github, i log di debug possono aiutarci a identificare il problema. I log di debug contengono dati di utilizzo dell'applicazione inclusi il nome utente, gli ID o alias delle stanze o gruppi visitati, gli ultimi elementi dell'interfaccia con cui hai interagito e i nomi degli altri utenti. Non contengono messaggi.", + "Enable encryption in settings.": "Attiva la crittografia nelle impostazioni.", + "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites.": "I tuoi messaggi privati normalmente sono cifrati, ma questa stanza non lo è. Di solito ciò è dovuto ad un dispositivo non supportato o dal metodo usato, come gli inviti per email.", + "Cross-signing is ready but keys are not backed up.": "La firma incrociata è pronta ma c'è un backup delle chiavi." } From b1a2f16e439bc8726ddb4fec67af21a38f195f4c Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 23 Aug 2021 13:03:09 +0200 Subject: [PATCH 244/619] optimize --- src/components/structures/BackdropPanel.tsx | 31 +++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index d816109e0b..58d458aae8 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -77,13 +77,29 @@ export default class BackdropPanel extends React.PureComponent { const leftPanelCanvas = document.createElement('canvas'); const leftLeftPanelContext = leftLeftPanelCanvas.getContext("2d"); const leftPanelContext = leftPanelCanvas.getContext("2d"); - const { leftLeftPanelWidth, height } = this.sizes; const { backgroundImage } = this.props; + const { leftLeftPanelWidth, leftPanelWidth, height } = this.sizes; + const width = leftLeftPanelWidth + leftPanelWidth; const imageWidth = (backgroundImage as ImageBitmap).width; const imageHeight = (backgroundImage as ImageBitmap).height; + + const contentRatio = imageWidth / imageHeight; + const containerRatio = width / height; + let resultHeight; + let resultWidth; + if (contentRatio > containerRatio) { + resultHeight = height; + resultWidth = height * contentRatio; + } else { + resultWidth = width; + resultHeight = width / contentRatio; + } + // This value has been chosen to be as close with rendering as the css-only // backdrop-filter: blur effect was, mostly takes effect for vertical pictures. + const x = width * 0.1; + const y = (height - resultHeight) / 2; leftLeftPanelCanvas.width = leftLeftPanelWidth; leftLeftPanelCanvas.height = height; @@ -98,15 +114,20 @@ export default class BackdropPanel extends React.PureComponent { leftLeftPanelContext.drawImage( backgroundImage, 0, 0, + imageWidth, imageHeight, + x, + y, + resultWidth, + resultHeight, ); leftPanelContext.drawImage( backgroundImage, 0, 0, imageWidth, imageHeight, - 0, - 0, - window.screen.width * 0.5, - window.screen.height, + x - leftLeftPanelWidth, + y, + resultWidth, + resultHeight, ); this.setState({ lpImage: leftPanelCanvas.toDataURL('image/jpeg', 1), From 60e7c18e622add52ec7b3fa277a6c557b522c107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 23 Aug 2021 13:17:40 +0200 Subject: [PATCH 245/619] Add choose to new issue link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/BugReportDialog.tsx | 2 +- src/components/views/dialogs/FeedbackDialog.js | 2 +- src/components/views/elements/ErrorBoundary.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/BugReportDialog.tsx b/src/components/views/dialogs/BugReportDialog.tsx index 8f22c7ca9a..38566cdf04 100644 --- a/src/components/views/dialogs/BugReportDialog.tsx +++ b/src/components/views/dialogs/BugReportDialog.tsx @@ -215,7 +215,7 @@ export default class BugReportDialog extends React.Component { { a: (sub) => { sub } , diff --git a/src/components/views/dialogs/FeedbackDialog.js b/src/components/views/dialogs/FeedbackDialog.js index 85171c9bf6..ceb8cb2175 100644 --- a/src/components/views/dialogs/FeedbackDialog.js +++ b/src/components/views/dialogs/FeedbackDialog.js @@ -28,7 +28,7 @@ import StyledRadioGroup from "../elements/StyledRadioGroup"; const existingIssuesUrl = "https://github.com/vector-im/element-web/issues" + "?q=is%3Aopen+is%3Aissue+sort%3Areactions-%2B1-desc"; -const newIssueUrl = "https://github.com/vector-im/element-web/issues/new"; +const newIssueUrl = "https://github.com/vector-im/element-web/issues/new/choose"; export default (props) => { const [rating, setRating] = useState(""); diff --git a/src/components/views/elements/ErrorBoundary.tsx b/src/components/views/elements/ErrorBoundary.tsx index 03d331bd9f..50ea7d9a56 100644 --- a/src/components/views/elements/ErrorBoundary.tsx +++ b/src/components/views/elements/ErrorBoundary.tsx @@ -77,7 +77,7 @@ export default class ErrorBoundary extends React.PureComponent<{}, IState> { render() { if (this.state.error) { - const newIssueUrl = "https://github.com/vector-im/element-web/issues/new"; + const newIssueUrl = "https://github.com/vector-im/element-web/issues/new/choose"; let bugReportSection; if (SdkConfig.get().bug_report_endpoint_url) { From 9facb0d963afa4932f5b48ff3f20aa7128bef30a Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 23 Aug 2021 14:44:44 +0100 Subject: [PATCH 246/619] Polish UI --- res/css/views/messages/_MessageActionBar.scss | 2 +- res/css/views/rooms/_EventTile.scss | 4 + src/components/structures/ThreadView.tsx | 88 +++++++++++++------ src/components/views/rooms/EventTile.tsx | 3 +- 4 files changed, 67 insertions(+), 30 deletions(-) diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index 3e5ab87ca9..c2f3c2ebca 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -89,7 +89,7 @@ limitations under the License. } .mx_MessageActionBar_replyButton::after { - mask-image: url('$(res)/img/element-icons/room/files.svg'); + mask-image: url('$(res)/img/element-icons/room/message-bar/reply.svg'); } .mx_MessageActionBar_threadButton::after { diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 4b48ec971b..1bf62d3fb1 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -676,6 +676,10 @@ $hover-select-border: 4px; } +.mx_ThreadInfo:hover { + cursor: pointer; +} + .mx_ThreadView { display: flex; diff --git a/src/components/structures/ThreadView.tsx b/src/components/structures/ThreadView.tsx index 5d07b7feaa..cac4054dfb 100644 --- a/src/components/structures/ThreadView.tsx +++ b/src/components/structures/ThreadView.tsx @@ -30,6 +30,8 @@ import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; import { Layout } from '../../settings/Layout'; import TimelinePanel from './TimelinePanel'; import { Thread } from '../../../../matrix-js-sdk/src/models/thread'; +import dis from "../../dispatcher/dispatcher"; +import { ActionPayload } from '../../dispatcher/payloads'; interface IProps { roomId: string; @@ -49,32 +51,61 @@ interface IState { */ @replaceableComponent("structures.ThreadView") class ThreadView extends React.Component { - state = {}; + private dispatcherRef: string; + + constructor(props: IProps) { + super(props); + this.state = {}; + } public componentDidMount(): void { - this.setupThread(); + this.setupThread(this.props.mxEvent); + this.dispatcherRef = dis.register(this.onAction); } public componentWillUnmount(): void { + this.teardownThread(); + dis.unregister(this.dispatcherRef); + } + + public componentDidUpdate(prevProps) { + if (prevProps.mxEvent !== this.props.mxEvent) { + this.teardownThread(); + this.setupThread(this.props.mxEvent); + } + } + + private onAction = (payload: ActionPayload): void => { + if (payload.phase == RightPanelPhases.ThreadView && payload.event) { + if (payload.event !== this.props.mxEvent) { + this.teardownThread(); + this.setupThread(payload.event); + } + } + }; + + setupThread = (mxEv: MatrixEvent) => { + const thread = mxEv.getThread(); + if (thread) { + thread.on("Thread.update", this.updateThread); + thread.once("Thread.ready", this.updateThread); + this.updateThread(thread); + } + }; + + teardownThread = () => { if (this.state.thread) { this.state.thread.removeListener("Thread.update", this.updateThread); this.state.thread.removeListener("Thread.ready", this.updateThread); } - } - - setupThread = () => { - const thread = this.props.mxEvent.getThread(); - if (thread) { - thread.on("Thread.update", this.updateThread); - thread.once("Thread.ready", this.updateThread); - this.updateThread(); - } }; - updateThread = () => { - this.setState({ - thread: this.props.mxEvent.getThread(), - }); + updateThread = (thread?: Thread) => { + if (thread) { + this.setState({ thread }); + } else { + this.forceUpdate(); + } }; public renderEventTile(event: MatrixEvent): JSX.Element { @@ -89,7 +120,6 @@ class ThreadView extends React.Component { } public render() { - const thread = this.props.mxEvent.getThread(); const room = MatrixClientPeg.get().getRoom(this.props.roomId); return ( { previousPhase={RightPanelPhases.RoomSummary} withoutScrollContainer={true} > - empty
    } - alwaysShowTimestamps={true} - layout={Layout.Group} - hideThreadedMessages={false} - /> + { this.state.thread && ( + empty
    } + alwaysShowTimestamps={true} + layout={Layout.Group} + hideThreadedMessages={false} + /> + ) } { return (
    { dis.dispatch({ action: Action.SetRightPanelPhase, @@ -544,7 +545,7 @@ export default class EventTile extends React.Component { { avatars } - { thread.length } { thread.length === 1 ? 'reply' : 'replies' } + { thread.length - 1 } { thread.length === 2 ? 'reply' : 'replies' }
    ); } From ef51a46d247b1ed673532632ac1cfaf5445c46ec Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 23 Aug 2021 14:55:14 +0100 Subject: [PATCH 247/619] Fix linting --- src/components/views/messages/MessageActionBar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index 29212449d1..83e063ab8c 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -180,7 +180,7 @@ export default class MessageActionBar extends React.PureComponent { allowClose: false, refireParams: { event: this.props.mxEvent, - } + }, }); } @@ -282,7 +282,7 @@ export default class MessageActionBar extends React.PureComponent { onClick={this.onThreadClick} key="thread" /> - )} + ) } ); } if (this.context.canReact) { From 27dbd172b04a88460dc0d9e4cd6010fd68dacbf1 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 23 Aug 2021 16:18:14 +0200 Subject: [PATCH 248/619] Fix resizer to properly find children --- src/resizer/resizer.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/resizer/resizer.ts b/src/resizer/resizer.ts index e430c68e17..0496615188 100644 --- a/src/resizer/resizer.ts +++ b/src/resizer/resizer.ts @@ -182,8 +182,6 @@ export default class Resizer { private getResizeHandles() { if (!this.container.children) return []; - return Array.from(this.container.children).filter(el => { - return this.isResizeHandle(el); - }) as HTMLElement[]; + return Array.from(this.container.querySelectorAll(`.${this.classNames.handle}`)) as HTMLElement[]; } } From 51b5b0145bc6c07e7ade5696a44416d6409dd8ab Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 23 Aug 2021 16:18:40 +0200 Subject: [PATCH 249/619] Fix resizer on LoggedInView --- src/components/structures/LoggedInView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 6008268877..55731eb2ca 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -284,7 +284,7 @@ class LoggedInView extends React.Component { if (isNaN(lhsSize)) { lhsSize = 350; } - this.resizer.forHandleAt(0).resize(lhsSize); + this.resizer.forHandleWithId('lp-resizer').resize(lhsSize); } private onAccountData = (event: MatrixEvent) => { @@ -654,7 +654,7 @@ class LoggedInView extends React.Component { isMinimized={this.props.collapseLhs || false} resizeNotifier={this.props.resizeNotifier} /> - +
    { pageElement } From ca92101c7293fcf35424ba262c8ba513dc0e33b5 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 23 Aug 2021 16:20:21 +0200 Subject: [PATCH 250/619] Optimize and rewrite backdrop rendering --- res/css/structures/_BackdropPanel.scss | 10 ---- res/css/structures/_LeftPanel.scss | 29 ++++++++++ res/themes/dark/css/_dark.scss | 1 - res/themes/light/css/_light.scss | 1 - src/components/structures/BackdropPanel.tsx | 60 +++------------------ src/components/structures/LoggedInView.tsx | 15 ++++-- 6 files changed, 45 insertions(+), 71 deletions(-) diff --git a/res/css/structures/_BackdropPanel.scss b/res/css/structures/_BackdropPanel.scss index c7ada2b0a5..0dbab0a415 100644 --- a/res/css/structures/_BackdropPanel.scss +++ b/res/css/structures/_BackdropPanel.scss @@ -21,16 +21,6 @@ limitations under the License. height: 100vh; width: 100%; overflow: hidden; - - &::before { - content: " "; - position: absolute; - left: 0; - top: 0; - height: 100vh; - width: 100%; - background-color: var(--lp-background-overlay); - } } .mx_BackdropPanel--canvas { diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index 29077811d6..ba7d9c4523 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -27,8 +27,37 @@ $roomListCollapsedWidth: 68px; .mx_LeftPanel_wrapper { display: flex; max-width: 50%; + + .mx_LeftPanel_background { + + &::before { + content: " "; + position: absolute; + left: 0; + top: 0; + height: 100vh; + width: 100%; + background-color: var(--lp-background-overlay); + } + + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: $roomlist-bg-color; + opacity: 0.5; + } + + .mx_LeftPanel_wrapper--user { + display: flex; + overflow: hidden; + position: relative; + } } + + .mx_LeftPanel { background-color: $roomlist-bg-color; // TODO decrease this once Spaces launches as it'll no longer need to include the 56px Community Panel diff --git a/res/themes/dark/css/_dark.scss b/res/themes/dark/css/_dark.scss index cce7d6ab67..360c6ef85d 100644 --- a/res/themes/dark/css/_dark.scss +++ b/res/themes/dark/css/_dark.scss @@ -240,7 +240,6 @@ $appearance-tab-border-color: $room-highlight-color; // blur amounts for left left panel (only for element theme) :root { - --llp-background-blur: 160px; --lp-background-blur: 90px; --lp-background-overlay: rgba(255, 255, 255, 0.055); } diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 982ca7cf08..ab04111d62 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -363,7 +363,6 @@ $appearance-tab-border-color: $input-darker-bg-color; // blur amounts for left left panel (only for element theme) :root { - --llp-background-blur: 120px; --lp-background-blur: 60px; --lp-background-overlay: rgba(0, 0, 0, 0.055); } diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index 58d458aae8..c9531c6490 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { createRef } from "react"; +import React from "react"; import "context-filter-polyfill"; import UIStore from "../../stores/UIStore"; @@ -31,24 +31,15 @@ interface IState { } export default class BackdropPanel extends React.PureComponent { - private sizes = { - leftLeftPanelWidth: 0, - leftPanelWidth: 0, - height: 0, - }; private style = getComputedStyle(document.documentElement); public state: IState = {}; public componentDidMount() { - UIStore.instance.on("SpacePanel", this.onResize); - UIStore.instance.on("GroupFilterPanelContainer", this.onResize); this.onResize(); } public componentWillUnmount() { - UIStore.instance.off("SpacePanel", this.onResize); - UIStore.instance.on("GroupFilterPanelContainer", this.onResize); } public componentDidUpdate(prevProps: IProps) { @@ -73,65 +64,30 @@ export default class BackdropPanel extends React.PureComponent { }; private refreshBackdropImage = (): void => { - const leftLeftPanelCanvas = document.createElement('canvas'); const leftPanelCanvas = document.createElement('canvas'); - const leftLeftPanelContext = leftLeftPanelCanvas.getContext("2d"); const leftPanelContext = leftPanelCanvas.getContext("2d"); const { backgroundImage } = this.props; - const { leftLeftPanelWidth, leftPanelWidth, height } = this.sizes; - const width = leftLeftPanelWidth + leftPanelWidth; const imageWidth = (backgroundImage as ImageBitmap).width; const imageHeight = (backgroundImage as ImageBitmap).height; - const contentRatio = imageWidth / imageHeight; - const containerRatio = width / height; - let resultHeight; - let resultWidth; - if (contentRatio > containerRatio) { - resultHeight = height; - resultWidth = height * contentRatio; - } else { - resultWidth = width; - resultHeight = width / contentRatio; - } - - // This value has been chosen to be as close with rendering as the css-only - // backdrop-filter: blur effect was, mostly takes effect for vertical pictures. - const x = width * 0.1; - const y = (height - resultHeight) / 2; - - leftLeftPanelCanvas.width = leftLeftPanelWidth; - leftLeftPanelCanvas.height = height; leftPanelCanvas.width = window.screen.width * 0.5; - leftPanelCanvas.height = height; + leftPanelCanvas.height = window.screen.height; - const spacesBlur = this.style.getPropertyValue('--llp-background-blur'); const roomListBlur = this.style.getPropertyValue('--lp-background-blur'); - leftLeftPanelContext.filter = `blur(${spacesBlur})`; leftPanelContext.filter = `blur(${roomListBlur})`; - leftLeftPanelContext.drawImage( - backgroundImage, - 0, 0, - imageWidth, imageHeight, - x, - y, - resultWidth, - resultHeight, - ); leftPanelContext.drawImage( backgroundImage, 0, 0, imageWidth, imageHeight, - x - leftLeftPanelWidth, - y, - resultWidth, - resultHeight, + 0, + 0, + window.screen.width * 0.5, + window.screen.height, ); this.setState({ lpImage: leftPanelCanvas.toDataURL('image/jpeg', 1), - llpImage: leftLeftPanelCanvas.toDataURL('image/jpeg', 1), }); }; @@ -139,10 +95,6 @@ export default class BackdropPanel extends React.PureComponent { public render() { if (!this.props.backgroundImage) return null; return
    - { this.state?.llpImage !== 'data:,' && } - { this.state?.lpImage !== 'data:,' && } diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 55731eb2ca..4d0c82e0b8 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -645,16 +645,21 @@ class LoggedInView extends React.Component { >
    -
    +
    { SpaceStore.spacesEnabled ? : null } - +
    +
    + +
    { pageElement } From 92aa953934fe567f4310b3e3eab87e825992d5a3 Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 23 Aug 2021 16:28:24 +0200 Subject: [PATCH 251/619] Make eslint happy --- src/components/structures/BackdropPanel.tsx | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx index c9531c6490..ca138eac0e 100644 --- a/src/components/structures/BackdropPanel.tsx +++ b/src/components/structures/BackdropPanel.tsx @@ -17,8 +17,6 @@ limitations under the License. import React from "react"; import "context-filter-polyfill"; -import UIStore from "../../stores/UIStore"; - interface IProps { backgroundImage?: CanvasImageSource; } @@ -26,8 +24,6 @@ interface IProps { interface IState { // Left Panel image lpImage?: string; - // Left-left panel image - llpImage?: string; } export default class BackdropPanel extends React.PureComponent { @@ -39,26 +35,14 @@ export default class BackdropPanel extends React.PureComponent { this.onResize(); } - public componentWillUnmount() { - } - public componentDidUpdate(prevProps: IProps) { if (prevProps.backgroundImage !== this.props.backgroundImage) { - this.setState({}); this.onResize(); } } private onResize = () => { if (this.props.backgroundImage) { - const groupFilterPanelDimensions = UIStore.instance.getElementDimensions("GroupFilterPanelContainer"); - const spacePanelDimensions = UIStore.instance.getElementDimensions("SpacePanel"); - const roomListDimensions = UIStore.instance.getElementDimensions("LeftPanel"); - this.sizes = { - leftLeftPanelWidth: spacePanelDimensions?.width ?? groupFilterPanelDimensions?.width ?? 0, - leftPanelWidth: roomListDimensions?.width ?? 0, - height: UIStore.instance.windowHeight, - }; this.refreshBackdropImage(); } }; From 7dfe57833afc073138b165acaa5892df7e43238e Mon Sep 17 00:00:00 2001 From: Dariusz Niemczyk Date: Mon, 23 Aug 2021 16:57:24 +0200 Subject: [PATCH 252/619] Fix GroupFilterPanel not having proper backdrop --- res/css/structures/_GroupFilterPanel.scss | 15 ++++++++++++ res/css/structures/_LeftPanel.scss | 14 ----------- src/components/structures/LeftPanel.tsx | 27 ---------------------- src/components/structures/LoggedInView.tsx | 8 +++++++ 4 files changed, 23 insertions(+), 41 deletions(-) diff --git a/res/css/structures/_GroupFilterPanel.scss b/res/css/structures/_GroupFilterPanel.scss index c62230edfc..11afe855b8 100644 --- a/res/css/structures/_GroupFilterPanel.scss +++ b/res/css/structures/_GroupFilterPanel.scss @@ -20,6 +20,21 @@ limitations under the License. } } +$groupFilterPanelWidth: 56px; // only applies in this file, used for calculations + +.mx_GroupFilterPanelContainer { + flex-grow: 0; + flex-shrink: 0; + width: $groupFilterPanelWidth; + height: 100%; + + // Create another flexbox so the GroupFilterPanel fills the container + display: flex; + flex-direction: column; + + // GroupFilterPanel handles its own CSS +} + .mx_GroupFilterPanel { background-color: $groupFilterPanel-bg-color; flex: 1; diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index ba7d9c4523..a172b6c26b 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -$groupFilterPanelWidth: 56px; // only applies in this file, used for calculations $roomListCollapsedWidth: 68px; .mx_MatrixChat--with-avatar { @@ -68,19 +67,6 @@ $roomListCollapsedWidth: 68px; contain: content; position: relative; - .mx_LeftPanel_GroupFilterPanelContainer { - flex-grow: 0; - flex-shrink: 0; - flex-basis: $groupFilterPanelWidth; - height: 100%; - - // Create another flexbox so the GroupFilterPanel fills the container - display: flex; - flex-direction: column; - - // GroupFilterPanel handles its own CSS - } - // Note: The 'room list' in this context is actually everything that isn't the tag // panel, such as the menu options, breadcrumbs, filtering, etc .mx_LeftPanel_roomListContainer { diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index 6c418e9366..d955271249 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -19,8 +19,6 @@ import { createRef } from "react"; import classNames from "classnames"; import { Room } from "matrix-js-sdk/src/models/room"; -import GroupFilterPanel from "./GroupFilterPanel"; -import CustomRoomTagPanel from "./CustomRoomTagPanel"; import dis from "../../dispatcher/dispatcher"; import { _t } from "../../languageHandler"; import RoomList from "../views/rooms/RoomList"; @@ -33,7 +31,6 @@ import RoomBreadcrumbs from "../views/rooms/RoomBreadcrumbs"; import { BreadcrumbsStore } from "../../stores/BreadcrumbsStore"; import { UPDATE_EVENT } from "../../stores/AsyncStore"; import ResizeNotifier from "../../utils/ResizeNotifier"; -import SettingsStore from "../../settings/SettingsStore"; import RoomListStore, { LISTS_UPDATE_EVENT } from "../../stores/room-list/RoomListStore"; import IndicatorScrollbar from "../structures/IndicatorScrollbar"; import AccessibleTooltipButton from "../views/elements/AccessibleTooltipButton"; @@ -51,7 +48,6 @@ interface IProps { interface IState { showBreadcrumbs: boolean; - showGroupFilterPanel: boolean; activeSpace?: Room; } @@ -68,9 +64,6 @@ const cssClasses = [ export default class LeftPanel extends React.Component { private ref: React.RefObject = createRef(); private listContainerRef: React.RefObject = createRef(); - private groupFilterPanelWatcherRef: string; - private groupFilterPanelContainer = createRef(); - private bgImageWatcherRef: string; private focusedElement = null; private isDoingStickyHeaders = false; @@ -79,25 +72,17 @@ export default class LeftPanel extends React.Component { this.state = { showBreadcrumbs: BreadcrumbsStore.instance.visible, - showGroupFilterPanel: SettingsStore.getValue('TagPanel.enableTagPanel'), activeSpace: SpaceStore.instance.activeSpace, }; BreadcrumbsStore.instance.on(UPDATE_EVENT, this.onBreadcrumbsUpdate); RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.onBreadcrumbsUpdate); SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.updateActiveSpace); - this.groupFilterPanelWatcherRef = SettingsStore.watchSetting("TagPanel.enableTagPanel", null, () => { - this.setState({ showGroupFilterPanel: SettingsStore.getValue("TagPanel.enableTagPanel") }); - }); } public componentDidMount() { UIStore.instance.trackElementDimensions("LeftPanel", this.ref.current); UIStore.instance.trackElementDimensions("ListContainer", this.listContainerRef.current); - if (this.groupFilterPanelContainer.current) { - const componentName = "GroupFilterPanelContainer"; - UIStore.instance.trackElementDimensions(componentName, this.groupFilterPanelContainer.current); - } UIStore.instance.on("ListContainer", this.refreshStickyHeaders); // Using the passive option to not block the main thread // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners @@ -105,7 +90,6 @@ export default class LeftPanel extends React.Component { } public componentWillUnmount() { - SettingsStore.unwatchSetting(this.groupFilterPanelWatcherRef); BreadcrumbsStore.instance.off(UPDATE_EVENT, this.onBreadcrumbsUpdate); RoomListStore.instance.off(LISTS_UPDATE_EVENT, this.onBreadcrumbsUpdate); SpaceStore.instance.off(UPDATE_SELECTED_SPACE, this.updateActiveSpace); @@ -422,16 +406,6 @@ export default class LeftPanel extends React.Component { } public render(): React.ReactNode { - let leftLeftPanel; - if (this.state.showGroupFilterPanel) { - leftLeftPanel = ( -
    - - { SettingsStore.getValue("feature_custom_tags") ? : null } -
    - ); - } - const roomList = { return (
    - { leftLeftPanel }