Move EventTile to shared components - #2 (#33828)

* Add pure sender render inputs to EventTileViewModel

* Move sender/avatar normalization to EventTile

* Split sender and avatar adapters into focused leaf components

* Add tests for the sender and avatar adapters

* Fix sonar issues

* Make sender profile consume pure member info

* Collapse sender adapter onto snapshot-driven props

* Share current-member resolution for event and reply tiles

* Fix Prettier issues

* Keep settings preview on historical sender profiles

* Update the proprty name to reflect the use of the event-time sender data instead of resolving the current room member

* Fix Sonar issue

* Tighten member to MemberInfo | null in the view model
This commit is contained in:
rbondesson
2026-07-27 09:26:06 +00:00
committed by GitHub
parent c82bddf1b0
commit 4decd338fb
15 changed files with 477 additions and 67 deletions
@@ -22,6 +22,7 @@ import {
RelationType,
type Relations,
Room,
RoomMember,
TweakName,
} from "matrix-js-sdk/src/matrix";
import {
@@ -518,7 +519,7 @@ describe("EventTile", () => {
});
describe("sender and avatar rendering", () => {
it("shows sender and avatar in room timelines", () => {
it("keeps the sender/avatar composition in room timelines", () => {
const { container } = getComponent();
expect(container.querySelector(".mx_DisambiguatedProfile")).not.toBeNull();
@@ -1060,6 +1061,25 @@ describe("EventTile", () => {
},
);
it("uses the current room member when current profiles are enabled", async () => {
const senderId = mxEvent.getSender()!;
const currentMember = new RoomMember(room.roomId, senderId);
currentMember.rawDisplayName = "Alan (away)";
jest.spyOn(room, "getMember").mockImplementation((userId) => (userId === senderId ? currentMember : null));
jest.spyOn(SettingsStore, "getValue").mockImplementation(
(settingName) => settingName === "useOnlyCurrentProfiles",
);
const { container } = getComponent();
await waitFor(() =>
expect(container.querySelector(".mx_DisambiguatedProfile_displayName")).toHaveTextContent(
"Alan (away)",
),
);
});
it("renders the tile error fallback when tile rendering throws", async () => {
jest.spyOn(console, "error").mockImplementation(() => {});
jest.spyOn(EventTileFactory, "renderTile").mockImplementation(() => {