Fix room list often showing the wrong icons for calls (#32881)
* Give rooms with calls a proper accessible description Besides improving accessibility, this makes it possible to check for the presence of a call indicator in the room list in Playwright tests. * Make room list react to calls in a room, even when not connected to them To use the results of CallStore.getRoom reactively, you need to listen for Call events, not ConnectedCalls events. * Don't assume that every call starts off as a video call If a Call object is created by way of someone starting a voice call, then of course the call's initial type needs to be 'voice'. * Make room list items react to changes in call type The type of a call may change over time; therefore room list items explicitly need to react to the changes. * Update a call's type before notifying listeners of the change If we notify listeners of a change in a call's type before actually making that change, the listeners will be working with glitched state. This would cause the room list to show the wrong call type in certain situations. * Ignore the Vitest attachments directory
This commit is contained in:
@@ -26,6 +26,7 @@ import {
|
||||
MatrixRTCSession,
|
||||
MatrixRTCSessionEvent,
|
||||
} from "matrix-js-sdk/src/matrixrtc";
|
||||
import { CallType } from "matrix-js-sdk/src/webrtc/call";
|
||||
|
||||
import type { Mocked } from "jest-mock";
|
||||
import type { ClientWidgetApi } from "matrix-widget-api";
|
||||
@@ -987,6 +988,35 @@ describe("ElementCall", () => {
|
||||
call.off(CallEvent.Participants, onParticipants);
|
||||
});
|
||||
|
||||
it("emits events when call type changes", async () => {
|
||||
const onCallTypeChanged = jest.fn();
|
||||
call.on(CallEvent.CallTypeChanged, onCallTypeChanged);
|
||||
// Should default to video when unknown
|
||||
expect(call.callType).toBe(CallType.Video);
|
||||
|
||||
// Change call type to voice
|
||||
roomSession.memberships = [
|
||||
{ sender: alice.userId, deviceId: "alices_device", callIntent: "audio" } as Mocked<CallMembership>,
|
||||
];
|
||||
roomSession.getConsensusCallIntent.mockReturnValue("audio");
|
||||
roomSession.emit(MatrixRTCSessionEvent.MembershipsChanged, [], []);
|
||||
|
||||
expect(call.callType).toBe(CallType.Voice);
|
||||
expect(onCallTypeChanged.mock.calls).toEqual([[CallType.Voice]]);
|
||||
|
||||
// Change call type back to video
|
||||
roomSession.memberships = [
|
||||
{ sender: alice.userId, deviceId: "alices_device", callIntent: "video" } as Mocked<CallMembership>,
|
||||
];
|
||||
roomSession.getConsensusCallIntent.mockReturnValue("video");
|
||||
roomSession.emit(MatrixRTCSessionEvent.MembershipsChanged, [], []);
|
||||
|
||||
expect(call.callType).toBe(CallType.Video);
|
||||
expect(onCallTypeChanged.mock.calls).toEqual([[CallType.Voice], [CallType.Video]]);
|
||||
|
||||
call.off(CallEvent.CallTypeChanged, onCallTypeChanged);
|
||||
});
|
||||
|
||||
it("ends the call immediately if the session ended", async () => {
|
||||
await connect(call, widgetApi);
|
||||
const onDestroy = jest.fn();
|
||||
|
||||
Reference in New Issue
Block a user