diff --git a/playwright/e2e/integration-manager/kick.spec.ts b/playwright/e2e/integration-manager/kick.spec.ts index b12215fe33..acd50bfbd4 100644 --- a/playwright/e2e/integration-manager/kick.spec.ts +++ b/playwright/e2e/integration-manager/kick.spec.ts @@ -69,29 +69,15 @@ async function sendActionFromIntegrationManager( await iframe.getByRole("button", { name: "Press to send action" }).click(); } -async function clickUntilGone(page: Page, selector: string, attempt = 0) { - if (attempt === 11) { - throw new Error("clickUntilGone attempt count exceeded"); - } - - await page.locator(selector).last().click(); - - const count = await page.locator(selector).count(); - if (count > 0) { - return clickUntilGone(page, selector, ++attempt); - } -} - async function expectKickedMessage(page: Page, shouldExist: boolean) { - // Expand any event summaries, we can't use a click multiple here because clicking one might de-render others - // This is quite horrible but seems the most stable way of clicking 0-N buttons, - // one at a time with a full re-evaluation after each click - await clickUntilGone(page, ".mx_GenericEventListSummary_toggle[aria-expanded=false]"); + await expect(async () => { + await page.locator(".mx_GenericEventListSummary_toggle[aria-expanded=false]").last().click(); + await expect(page.getByText(`${USER_DISPLAY_NAME} removed ${BOT_DISPLAY_NAME}: ${KICK_REASON}`)).toBeVisible({ + visible: shouldExist, + }); + }).toPass(); // Check for the event message (or lack thereof) - await expect(page.getByText(`${USER_DISPLAY_NAME} removed ${BOT_DISPLAY_NAME}: ${KICK_REASON}`)).toBeVisible({ - visible: shouldExist, - }); } test.describe("Integration Manager: Kick", () => { diff --git a/playwright/pages/bot.ts b/playwright/pages/bot.ts index 1d414c7bf6..159d7fcbc2 100644 --- a/playwright/pages/bot.ts +++ b/playwright/pages/bot.ts @@ -121,7 +121,7 @@ export class Bot extends Client { return logger as unknown as Logger; } - const logger = getLogger(`cypress bot ${credentials.userId}`); + const logger = getLogger(`playwright bot ${credentials.userId}`); const keys = {}; diff --git a/playwright/stale-screenshot-reporter.ts b/playwright/stale-screenshot-reporter.ts index 3e38f78ca9..dc934827c1 100644 --- a/playwright/stale-screenshot-reporter.ts +++ b/playwright/stale-screenshot-reporter.ts @@ -23,6 +23,7 @@ class StaleScreenshotReporter implements Reporter { private success = true; public onTestEnd(test: TestCase): void { + if (!test.ok()) return; for (const annotation of test.annotations) { if (annotation.type === "_screenshot") { this.screenshots.add(annotation.description); diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index bdb7e8cbe0..1194e4ca71 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -107,9 +107,8 @@ function textForMemberEvent( allowJSX: boolean, showHiddenEvents?: boolean, ): (() => string) | null { - // XXX: SYJS-16 "sender is sometimes null for join messages" - const senderName = ev.sender?.name || getRoomMemberDisplayname(client, ev); - const targetName = ev.target?.name || getRoomMemberDisplayname(client, ev, ev.getStateKey()); + const senderName = getRoomMemberDisplayname(client, ev); + const targetName = getRoomMemberDisplayname(client, ev, ev.getStateKey()); const prevContent = ev.getPrevContent(); const content = ev.getContent(); const reason = content.reason; diff --git a/src/components/views/messages/TextualEvent.tsx b/src/components/views/messages/TextualEvent.tsx index 8549fc5cab..831aaee117 100644 --- a/src/components/views/messages/TextualEvent.tsx +++ b/src/components/views/messages/TextualEvent.tsx @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; -import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { MatrixEvent, RoomMember, RoomMemberEvent } from "matrix-js-sdk/src/matrix"; import RoomContext from "../../../contexts/RoomContext"; import * as TextForEvent from "../../../TextForEvent"; @@ -21,6 +21,20 @@ export default class TextualEvent extends React.Component { public static contextType = RoomContext; declare public context: React.ContextType; + public componentDidMount(): void { + MatrixClientPeg.get()?.on(RoomMemberEvent.Name, this.onMemberNameUpdate); + } + + public componentWillUnmount(): void { + MatrixClientPeg.get()?.off(RoomMemberEvent.Name, this.onMemberNameUpdate); + } + + private onMemberNameUpdate = (event: MatrixEvent, member: RoomMember): void => { + if (member.userId === this.props.mxEvent.getSender() || member.userId === this.props.mxEvent.getStateKey()) { + this.forceUpdate(); + } + }; + public render(): React.ReactNode { const text = TextForEvent.textForEvent( this.props.mxEvent,