From ffdffb643d0a23c2a43e2d2b2e952fcdf7cecd06 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 4 Aug 2017 17:22:01 +0100 Subject: [PATCH 1/6] allow hiding of avatar/display name changes --- src/components/structures/UserSettings.js | 4 ++ src/i18n/strings/en_EN.json | 1 + src/shouldHideEvent.js | 48 +++++++++++------------ 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 1e0fcff445..483aab7e58 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -85,6 +85,10 @@ const SETTINGS_LABELS = [ id: 'hideJoinLeaves', label: 'Hide join/leave messages (invites/kicks/bans unaffected)', }, + { + id: 'hideAvatarDisplaynameChanges', + label: 'Hide Avatar and Display Name changes', + }, { id: 'useCompactLayout', label: 'Use compact timeline layout', diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0402c242aa..3edebc0284 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -346,6 +346,7 @@ "Hangup": "Hangup", "Hide Apps": "Hide Apps", "Hide join/leave messages (invites/kicks/bans unaffected)": "Hide join/leave messages (invites/kicks/bans unaffected)", + "Hide Avatar and Display Name changes": "Hide Avatar and Display Name changes", "Hide read receipts": "Hide read receipts", "Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar", "Historical": "Historical", diff --git a/src/shouldHideEvent.js b/src/shouldHideEvent.js index afc8fdc596..c7bb547512 100644 --- a/src/shouldHideEvent.js +++ b/src/shouldHideEvent.js @@ -14,38 +14,36 @@ limitations under the License. */ -function _isLeaveOrJoin(ev) { - const isMemberEvent = ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined; - if (!isMemberEvent) { - return false; // bail early: all the checks below concern member events only - } +function memberEventDiff(ev) { + const diff = { + isMembershipEvent: ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined, + }; - // TODO: These checks are done to make sure we're dealing with membership transitions not avatar changes / dupe joins - // These checks are also being done in TextForEvent and should really reside in the JS SDK as a helper function - const membership = ev.getContent().membership; - const prevMembership = ev.getPrevContent().membership; - if (membership === prevMembership && membership === 'join') { - // join -> join : This happens when display names change / avatars are set / genuine dupe joins with no changes. - // Find out which we're dealing with. - if (ev.getPrevContent().displayname !== ev.getContent().displayname) { - return false; // display name changed - } - if (ev.getPrevContent().avatar_url !== ev.getContent().avatar_url) { - return false; // avatar url changed - } - // dupe join event, fall through to hide rules - } + if (!diff.isMembershipEvent) return diff; + const content = ev.getContent(); + const prevContent = ev.getPrevContent(); - // this only applies to joins/invited joins/leaves not invites/kicks/bans - const isJoin = membership === 'join' && prevMembership !== 'ban'; - const isLeave = membership === 'leave' && ev.getStateKey() === ev.getSender(); - return isJoin || isLeave; + diff.isJoin = content.membership === 'join' && prevContent.membership !== 'ban'; + diff.isPart = content.membership === 'leave' && ev.getStateKey() === ev.getSender(); + + const isJoinToJoin = content.membership === prevContent.membership && content.membership === 'join'; + diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname; + diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url; + return diff; } export default function(ev, syncedSettings) { // Hide redacted events if (syncedSettings['hideRedactions'] && ev.isRedacted()) return true; - if (syncedSettings['hideJoinLeaves'] && _isLeaveOrJoin(ev)) return true; + + const eventDiff = memberEventDiff(ev); + + if (eventDiff.isMembershipEvent) { + if (syncedSettings['hideJoinLeaves'] && (eventDiff.isJoin || eventDiff.isPart)) return true; + const isMemberAvatarDisplaynameChange = eventDiff.isAvatarChange || eventDiff.isDisplaynameChange; + if (syncedSettings['hideAvatarDisplaynameChanges'] && isMemberAvatarDisplaynameChange) return true; + } + return false; } From 1603360c138262a7e20c11b138b0150f328cdaa3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 10 Aug 2017 13:58:19 +0100 Subject: [PATCH 2/6] s/Membership/Member/ Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/shouldHideEvent.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shouldHideEvent.js b/src/shouldHideEvent.js index c7bb547512..8554557b38 100644 --- a/src/shouldHideEvent.js +++ b/src/shouldHideEvent.js @@ -16,10 +16,10 @@ function memberEventDiff(ev) { const diff = { - isMembershipEvent: ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined, + isMemberEvent: ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined, }; - if (!diff.isMembershipEvent) return diff; + if (!diff.isMemberEvent) return diff; const content = ev.getContent(); const prevContent = ev.getPrevContent(); @@ -39,7 +39,7 @@ export default function(ev, syncedSettings) { const eventDiff = memberEventDiff(ev); - if (eventDiff.isMembershipEvent) { + if (eventDiff.isMemberEvent) { if (syncedSettings['hideJoinLeaves'] && (eventDiff.isJoin || eventDiff.isPart)) return true; const isMemberAvatarDisplaynameChange = eventDiff.isAvatarChange || eventDiff.isDisplaynameChange; if (syncedSettings['hideAvatarDisplaynameChanges'] && isMemberAvatarDisplaynameChange) return true; From ab3abd2f7f5a1b42c2dd5873b8f92e68922b63bd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 10 Aug 2017 13:59:55 +0100 Subject: [PATCH 3/6] fix string casing Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/structures/UserSettings.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index 483aab7e58..3fd4a70c52 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -87,7 +87,7 @@ const SETTINGS_LABELS = [ }, { id: 'hideAvatarDisplaynameChanges', - label: 'Hide Avatar and Display Name changes', + label: 'Hide avatar and display name changes', }, { id: 'useCompactLayout', diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3edebc0284..c5cd6b516d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -346,7 +346,7 @@ "Hangup": "Hangup", "Hide Apps": "Hide Apps", "Hide join/leave messages (invites/kicks/bans unaffected)": "Hide join/leave messages (invites/kicks/bans unaffected)", - "Hide Avatar and Display Name changes": "Hide Avatar and Display Name changes", + "Hide avatar and display name changes": "Hide avatar and display name changes", "Hide read receipts": "Hide read receipts", "Hide Text Formatting Toolbar": "Hide Text Formatting Toolbar", "Historical": "Historical", From a6064c53d3985027f5d8fedad284077889949df3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 10 Aug 2017 14:00:26 +0100 Subject: [PATCH 4/6] export shouldHideEvent fn named Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/shouldHideEvent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shouldHideEvent.js b/src/shouldHideEvent.js index 8554557b38..36aa2ae17d 100644 --- a/src/shouldHideEvent.js +++ b/src/shouldHideEvent.js @@ -33,7 +33,7 @@ function memberEventDiff(ev) { return diff; } -export default function(ev, syncedSettings) { +export default function shouldHideEvent(ev, syncedSettings) { // Hide redacted events if (syncedSettings['hideRedactions'] && ev.isRedacted()) return true; From 625ca96d864c1da6e4c054680e65c8f34f8996cc Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 10 Aug 2017 14:01:24 +0100 Subject: [PATCH 5/6] add comment about why state key must be not undefined Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/shouldHideEvent.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shouldHideEvent.js b/src/shouldHideEvent.js index 36aa2ae17d..0eec756390 100644 --- a/src/shouldHideEvent.js +++ b/src/shouldHideEvent.js @@ -16,6 +16,7 @@ function memberEventDiff(ev) { const diff = { + // a Member Event is a State Event and so its State Key must not be undefined. isMemberEvent: ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined, }; From 5450d6b9cafb2eba2ebb5bdba7e3d03676124a82 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 10 Aug 2017 15:22:53 +0100 Subject: [PATCH 6/6] remove redundant check and add comment Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- src/shouldHideEvent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shouldHideEvent.js b/src/shouldHideEvent.js index 0eec756390..1501e28875 100644 --- a/src/shouldHideEvent.js +++ b/src/shouldHideEvent.js @@ -16,10 +16,10 @@ function memberEventDiff(ev) { const diff = { - // a Member Event is a State Event and so its State Key must not be undefined. - isMemberEvent: ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined, + isMemberEvent: ev.getType() === 'm.room.member', }; + // If is not a Member Event then the other checks do not apply, so bail early. if (!diff.isMemberEvent) return diff; const content = ev.getContent();