diff --git a/src/components/structures/LeftPanel.js b/src/components/structures/LeftPanel.js index 0ae9b032d1..bd49f8acd4 100644 --- a/src/components/structures/LeftPanel.js +++ b/src/components/structures/LeftPanel.js @@ -190,10 +190,13 @@ const LeftPanel = React.createClass({ const tagPanelEnabled = SettingsStore.getValue("TagPanel.enableTagPanel"); let tagPanelContainer; + + const isCustomTagsEnabled = SettingsStore.isFeatureEnabled("feature_custom_tags"); + if (tagPanelEnabled) { tagPanelContainer = (
- + { isCustomTagsEnabled ? : undefined }
); } diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 8418ab6d6f..56eb4b713d 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -172,11 +172,14 @@ module.exports = React.createClass({ this._delayedRefreshRoomList(); }); - this._customTagStoreToken = CustomRoomTagStore.addListener(() => { - this.setState({ - customTags: CustomRoomTagStore.getTags(), + + if (SettingsStore.isFeatureEnabled("feature_custom_tags")) { + this._customTagStoreToken = CustomRoomTagStore.addListener(() => { + this.setState({ + customTags: CustomRoomTagStore.getTags(), + }); }); - }); + } this.refreshRoomList(); @@ -728,7 +731,8 @@ module.exports = React.createClass({ ]; const tagSubLists = Object.keys(this.state.lists) .filter((tagName) => { - return this.state.customTags[tagName] && !tagName.match(STANDARD_TAGS_REGEX); + return (!this.state.customTags || this.state.customTags[tagName]) && + !tagName.match(STANDARD_TAGS_REGEX); }).map((tagName) => { return { list: this.state.lists[tagName], diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6fd9b4d190..d612ae78ef 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -264,6 +264,7 @@ "Failed to join room": "Failed to join room", "Message Pinning": "Message Pinning", "Custom user status messages": "Custom user status messages", + "Group & filter rooms by custom tags (refresh to apply changes)": "Group & filter rooms by custom tags (refresh to apply changes)", "Backup of encryption keys to server": "Backup of encryption keys to server", "Render simple counters in room header": "Render simple counters in room header", "Two-way device verification using short text": "Two-way device verification using short text", diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 833bdc7f8c..02c2bad14b 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -99,6 +99,12 @@ export const SETTINGS = { default: false, controller: new CustomStatusController(), }, + "feature_custom_tags": { + isFeature: true, + displayName: _td("Group & filter rooms by custom tags (refresh to apply changes)"), + supportedLevels: LEVELS_FEATURE, + default: false, + }, "feature_keybackup": { isFeature: true, displayName: _td("Backup of encryption keys to server"), diff --git a/src/stores/CustomRoomTagStore.js b/src/stores/CustomRoomTagStore.js index 9795abadc6..0f7f99aad9 100644 --- a/src/stores/CustomRoomTagStore.js +++ b/src/stores/CustomRoomTagStore.js @@ -18,6 +18,7 @@ import * as RoomNotifs from '../RoomNotifs'; import RoomListStore from './RoomListStore'; import EventEmitter from 'events'; import { throttle } from "lodash"; +import SettingsStore from "../settings/SettingsStore"; const STANDARD_TAGS_REGEX = /^(m\.(favourite|lowpriority|server_notice)|im\.vector\.fake\.(invite|recent|direct|archived))$/; @@ -50,6 +51,7 @@ class CustomRoomTagStore extends EventEmitter { super(); // Initialise state this._state = {tags: {}}; + // as RoomListStore gets updated by every timeline event // throttle this to only run every 500ms this._getUpdatedTags = throttle( @@ -133,6 +135,10 @@ class CustomRoomTagStore extends EventEmitter { } _getUpdatedTags() { + if (!SettingsStore.isFeatureEnabled("feature_custom_tags")) { + return; + } + const newTagNames = Object.keys(RoomListStore.getRoomLists()) .filter((tagName) => { return !tagName.match(STANDARD_TAGS_REGEX); diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index 61e17821bd..d98adc5cae 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -202,6 +202,8 @@ class RoomListStore extends Store { // If somehow we dispatched a RoomListActions.tagRoom.failure before a MatrixActions.sync if (!this._matrixClient) return; + const isCustomTagsEnabled = SettingsStore.isFeatureEnabled("feature_custom_tags"); + this._matrixClient.getRooms().forEach((room, index) => { const myUserId = this._matrixClient.getUserId(); const membership = room.getMyMembership(); @@ -226,7 +228,7 @@ class RoomListStore extends Store { // ignore any m. tag names we don't know about tagNames = tagNames.filter((t) => { - return !t.startsWith('m.') || lists[t] !== undefined; + return (isCustomTagsEnabled && !t.startsWith('m.')) || lists[t] !== undefined; }); if (tagNames.length) {