From 2e32a4d4b655e94c821dabe71190474cc2c715c9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 10 Aug 2022 14:33:13 +0100 Subject: [PATCH] Fix invisible power levels tile when showing hidden events (#9162) * Fix invisible power levels tile when showing hidden events * Add regression test --- src/TextForEvent.tsx | 34 +++++++++++++------------- src/events/EventTileFactory.tsx | 4 ++++ test/events/EventTileFactory-test.ts | 36 ++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 17 deletions(-) create mode 100644 test/events/EventTileFactory-test.ts diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index 10530d7c9b..9310391e3e 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -434,29 +434,29 @@ function textForHistoryVisibilityEvent(event: MatrixEvent): () => string | null // Currently will only display a change if a user's power level is changed function textForPowerEvent(event: MatrixEvent): () => string | null { const senderName = getSenderName(event); - if (!event.getPrevContent() || !event.getPrevContent().users || - !event.getContent() || !event.getContent().users) { + if (!event.getPrevContent()?.users || !event.getContent()?.users) { return null; } - const previousUserDefault = event.getPrevContent().users_default || 0; - const currentUserDefault = event.getContent().users_default || 0; + const previousUserDefault: number = event.getPrevContent().users_default || 0; + const currentUserDefault: number = event.getContent().users_default || 0; // Construct set of userIds - const users = []; - Object.keys(event.getContent().users).forEach( - (userId) => { - if (users.indexOf(userId) === -1) users.push(userId); - }, - ); - Object.keys(event.getPrevContent().users).forEach( - (userId) => { - if (users.indexOf(userId) === -1) users.push(userId); - }, - ); + const users: string[] = []; + Object.keys(event.getContent().users).forEach((userId) => { + if (users.indexOf(userId) === -1) users.push(userId); + }); + Object.keys(event.getPrevContent().users).forEach((userId) => { + if (users.indexOf(userId) === -1) users.push(userId); + }); - const diffs = []; + const diffs: { + userId: string; + name: string; + from: number; + to: number; + }[] = []; users.forEach((userId) => { // Previous power level - let from = event.getPrevContent().users[userId]; + let from: number = event.getPrevContent().users[userId]; if (!Number.isInteger(from)) { from = previousUserDefault; } diff --git a/src/events/EventTileFactory.tsx b/src/events/EventTileFactory.tsx index 9315741c59..88982b373f 100644 --- a/src/events/EventTileFactory.tsx +++ b/src/events/EventTileFactory.tsx @@ -225,6 +225,10 @@ export function pickFactory( return noEventFactoryFactory(); // improper event type to render } + if (STATE_EVENT_TILE_TYPES[evType] === TextualEventFactory && !hasText(mxEvent, showHiddenEvents)) { + return noEventFactoryFactory(); + } + return STATE_EVENT_TILE_TYPES[evType] ?? noEventFactoryFactory(); } diff --git a/test/events/EventTileFactory-test.ts b/test/events/EventTileFactory-test.ts new file mode 100644 index 0000000000..ebda574dfc --- /dev/null +++ b/test/events/EventTileFactory-test.ts @@ -0,0 +1,36 @@ +/* +Copyright 2022 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 { EventType, MatrixEvent } from "matrix-js-sdk/src/matrix"; + +import { JSONEventFactory, pickFactory } from "../../src/events/EventTileFactory"; +import { createTestClient } from "../test-utils"; + +const roomId = "!room:example.com"; + +describe("pickFactory", () => { + it("should return JSONEventFactory for a no-op m.room.power_levels event", () => { + const cli = createTestClient(); + const event = new MatrixEvent({ + type: EventType.RoomPowerLevels, + state_key: "", + content: {}, + sender: cli.getUserId(), + room_id: roomId, + }); + expect(pickFactory(event, cli, true)).toBe(JSONEventFactory); + }); +});