Refactor EventTile using the MVVM pattern - #5a (#33587)
* Extract EventTile receipt state * Extract EventTile thread state * Extract EventTile reaction relation state * Extract EventTile reply-chain state * Keep reply chain collapse wiring in EventTile * Reuse message event eligibility for receipts
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
Copyright 2026 Element Creations Ltd.
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { EventType, type MatrixEvent, type Relations, MsgType, RelationType } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import { mkEvent } from "../../test-utils";
|
||||
import {
|
||||
EVENT_TILE_REACTION_EVENT_TYPE,
|
||||
EVENT_TILE_REACTION_RELATION_TYPE,
|
||||
getEventTileReactionRelations,
|
||||
isEventTileReactionRelation,
|
||||
type GetRelationsForEvent,
|
||||
} from "../../../src/viewmodels/room/timeline/event-tile/reactions/EventTileReactionState";
|
||||
|
||||
const roomId = "!room:example.org";
|
||||
const userId = "@alice:example.org";
|
||||
|
||||
function makeEvent(): MatrixEvent {
|
||||
return mkEvent({
|
||||
event: true,
|
||||
id: "$event",
|
||||
type: EventType.RoomMessage,
|
||||
room: roomId,
|
||||
user: userId,
|
||||
content: {
|
||||
msgtype: MsgType.Text,
|
||||
body: "Hello",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
describe("EventTileReactionState", () => {
|
||||
it("gets annotation reaction relations when reactions are enabled", () => {
|
||||
const relations = {} as Relations;
|
||||
const getRelationsForEvent: jest.MockedFunction<GetRelationsForEvent> = jest.fn().mockReturnValue(relations);
|
||||
|
||||
expect(
|
||||
getEventTileReactionRelations({
|
||||
mxEvent: makeEvent(),
|
||||
showReactions: true,
|
||||
getRelationsForEvent,
|
||||
}),
|
||||
).toBe(relations);
|
||||
expect(getRelationsForEvent).toHaveBeenCalledWith(
|
||||
"$event",
|
||||
EVENT_TILE_REACTION_RELATION_TYPE,
|
||||
EVENT_TILE_REACTION_EVENT_TYPE,
|
||||
);
|
||||
});
|
||||
|
||||
it("does not get relations when reactions are disabled", () => {
|
||||
const getRelationsForEvent: jest.MockedFunction<GetRelationsForEvent> = jest.fn();
|
||||
|
||||
expect(
|
||||
getEventTileReactionRelations({
|
||||
mxEvent: makeEvent(),
|
||||
showReactions: false,
|
||||
getRelationsForEvent,
|
||||
}),
|
||||
).toBeNull();
|
||||
expect(getRelationsForEvent).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("does not get relations without a relation lookup", () => {
|
||||
expect(
|
||||
getEventTileReactionRelations({
|
||||
mxEvent: makeEvent(),
|
||||
showReactions: true,
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it("normalizes missing relations to null", () => {
|
||||
const getRelationsForEvent: jest.MockedFunction<GetRelationsForEvent> = jest.fn().mockReturnValue(undefined);
|
||||
|
||||
expect(
|
||||
getEventTileReactionRelations({
|
||||
mxEvent: makeEvent(),
|
||||
showReactions: true,
|
||||
getRelationsForEvent,
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it("matches reaction relation creation events", () => {
|
||||
expect(isEventTileReactionRelation(RelationType.Annotation, EventType.Reaction)).toBe(true);
|
||||
});
|
||||
|
||||
it("does not match unrelated relation creation events", () => {
|
||||
expect(isEventTileReactionRelation(RelationType.Reference, EventType.RoomMessage)).toBe(false);
|
||||
expect(isEventTileReactionRelation(RelationType.Annotation, EventType.RoomMessage)).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user