diff --git a/apps/web/src/stores/widgets/ElementWidgetDriver.ts b/apps/web/src/stores/widgets/ElementWidgetDriver.ts index 725f149f0d..d1d373ea38 100644 --- a/apps/web/src/stores/widgets/ElementWidgetDriver.ts +++ b/apps/web/src/stores/widgets/ElementWidgetDriver.ts @@ -378,6 +378,21 @@ export class ElementWidgetDriver extends WidgetDriver { return { roomId, eventId: r.event_id }; } + public async readStickyEvents(roomId: string): Promise { + const room = MatrixClientPeg.safeGet().getRoom(roomId); + if (!room) { + logger.warn(`[ElementWidgetDriver] readStickyEvents: room ${roomId} not found`); + return Promise.resolve([]); + } + const stickyEvents: IRoomEvent[] = []; + for (const ev of room._unstable_getStickyEvents()) { + stickyEvents.push(ev.getEffectiveEvent() as IRoomEvent); + } + // Notice that the capability checks are not done here; they are done in the matrix-widget-api. + // The ClientWidgetAPI will do the filtering of events based on the capabilities advertised by the driver. + return stickyEvents; + } + private getSendDelayedEventOpts(delay: number | null, parentDelayId: string | null): SendDelayedEventRequestOpts { if (delay !== null) { return { diff --git a/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts b/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts index a95a6ed958..7820cd6783 100644 --- a/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts +++ b/apps/web/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts @@ -595,7 +595,7 @@ describe("ElementWidgetDriver", () => { }); }); - describe("sendStickyEvent", () => { + describe("StickyEvent", () => { let driver: WidgetDriver; const roomId = "!this-room-id"; @@ -621,6 +621,41 @@ describe("ElementWidgetDriver", () => { {}, ); }); + + it("Reads sticky message", async () => { + const mockStickyEvent = new MatrixEvent({ + sender: "@alice:example.org", + type: EventType.RTCMembership, + content: { + msc4354_sticky_key: "7f433807-26aa-441b-810f-43b3fd6d0955", + }, + }); + const mockRoom: Partial = { + roomId: roomId, + _unstable_getStickyEvents: jest.fn().mockReturnValue([mockStickyEvent]), + }; + client.getRoom.mockImplementation((roomId) => { + if (roomId === mockRoom.roomId) return mockRoom as Room; + return null; + }); + + { + const stickyEvents = await driver.readStickyEvents(roomId); + + expect(stickyEvents.length).toBe(1); + const stickyEvent = stickyEvents[0]; + expect(stickyEvent.type).toEqual(mockStickyEvent.getType()); + expect(stickyEvent.sender).toEqual(mockStickyEvent.getSender()); + expect(stickyEvent.content).toEqual(mockStickyEvent.getContent()); + } + + { + const stickyEvents = await driver.readStickyEvents("!another-room-id"); + expect(stickyEvents.length).toBe(0); + } + + expect(mockRoom._unstable_getStickyEvents).toHaveBeenCalled(); + }); }); describe("sendDelayedStickyEvent", () => { diff --git a/package.json b/package.json index 9460ea5a43..69660014b5 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "testcontainers": "^11.0.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0", "wrap-ansi": "npm:wrap-ansi@^7.0.0", - "matrix-widget-api": "^1.16.1", + "matrix-widget-api": "^1.17.0", "qs": "6.14.2" }, "dependencies": {}, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ff2f5b91c..0a85653cc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,7 +48,7 @@ overrides: testcontainers: ^11.0.0 wrap-ansi-cjs: npm:wrap-ansi@^7.0.0 wrap-ansi: npm:wrap-ansi@^7.0.0 - matrix-widget-api: ^1.16.1 + matrix-widget-api: ^1.17.0 qs: 6.14.2 packageExtensionsChecksum: sha256-OFePh8Fn8A1ZEWgJF51vTMPT/HEVyXQyj6YGIztPb0w= @@ -285,7 +285,7 @@ importers: specifier: github:matrix-org/matrix-js-sdk#develop version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/5739b59faaf33fa55457dcaa76ffebe0506d1466 matrix-widget-api: - specifier: ^1.16.1 + specifier: ^1.17.0 version: 1.17.0 memoize-one: specifier: ^6.0.0