|
14 | 14 | limitations under the License.
|
15 | 15 | */
|
16 | 16 |
|
17 |
| -function _isLeaveOrJoin(ev) { |
18 |
| - const isMemberEvent = ev.getType() === 'm.room.member' && ev.getStateKey() !== undefined; |
19 |
| - if (!isMemberEvent) { |
20 |
| - return false; // bail early: all the checks below concern member events only |
21 |
| - } |
| 17 | +function memberEventDiff(ev) { |
| 18 | + const diff = { |
| 19 | + isMemberEvent: ev.getType() === 'm.room.member', |
| 20 | + }; |
22 | 21 |
|
23 |
| - // TODO: These checks are done to make sure we're dealing with membership transitions not avatar changes / dupe joins |
24 |
| - // These checks are also being done in TextForEvent and should really reside in the JS SDK as a helper function |
25 |
| - const membership = ev.getContent().membership; |
26 |
| - const prevMembership = ev.getPrevContent().membership; |
27 |
| - if (membership === prevMembership && membership === 'join') { |
28 |
| - // join -> join : This happens when display names change / avatars are set / genuine dupe joins with no changes. |
29 |
| - // Find out which we're dealing with. |
30 |
| - if (ev.getPrevContent().displayname !== ev.getContent().displayname) { |
31 |
| - return false; // display name changed |
32 |
| - } |
33 |
| - if (ev.getPrevContent().avatar_url !== ev.getContent().avatar_url) { |
34 |
| - return false; // avatar url changed |
35 |
| - } |
36 |
| - // dupe join event, fall through to hide rules |
37 |
| - } |
| 22 | + // If is not a Member Event then the other checks do not apply, so bail early. |
| 23 | + if (!diff.isMemberEvent) return diff; |
38 | 24 |
|
| 25 | + const content = ev.getContent(); |
| 26 | + const prevContent = ev.getPrevContent(); |
39 | 27 |
|
40 |
| - // this only applies to joins/invited joins/leaves not invites/kicks/bans |
41 |
| - const isJoin = membership === 'join' && prevMembership !== 'ban'; |
42 |
| - const isLeave = membership === 'leave' && ev.getStateKey() === ev.getSender(); |
43 |
| - return isJoin || isLeave; |
| 28 | + diff.isJoin = content.membership === 'join' && prevContent.membership !== 'ban'; |
| 29 | + diff.isPart = content.membership === 'leave' && ev.getStateKey() === ev.getSender(); |
| 30 | + |
| 31 | + const isJoinToJoin = content.membership === prevContent.membership && content.membership === 'join'; |
| 32 | + diff.isDisplaynameChange = isJoinToJoin && content.displayname !== prevContent.displayname; |
| 33 | + diff.isAvatarChange = isJoinToJoin && content.avatar_url !== prevContent.avatar_url; |
| 34 | + return diff; |
44 | 35 | }
|
45 | 36 |
|
46 |
| -export default function(ev, syncedSettings) { |
| 37 | +export default function shouldHideEvent(ev, syncedSettings) { |
47 | 38 | // Hide redacted events
|
48 | 39 | if (syncedSettings['hideRedactions'] && ev.isRedacted()) return true;
|
49 |
| - if (syncedSettings['hideJoinLeaves'] && _isLeaveOrJoin(ev)) return true; |
| 40 | + |
| 41 | + const eventDiff = memberEventDiff(ev); |
| 42 | + |
| 43 | + if (eventDiff.isMemberEvent) { |
| 44 | + if (syncedSettings['hideJoinLeaves'] && (eventDiff.isJoin || eventDiff.isPart)) return true; |
| 45 | + const isMemberAvatarDisplaynameChange = eventDiff.isAvatarChange || eventDiff.isDisplaynameChange; |
| 46 | + if (syncedSettings['hideAvatarDisplaynameChanges'] && isMemberAvatarDisplaynameChange) return true; |
| 47 | + } |
| 48 | + |
50 | 49 | return false;
|
51 | 50 | }
|
0 commit comments