diff --git a/src/Notifier.ts b/src/Notifier.ts index aa68b386a3..bd457cc73c 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -25,7 +25,7 @@ import { } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; import { type PermissionChanged as PermissionChangedEvent } from "@matrix-org/analytics-events/types/typescript/PermissionChanged"; -import { type IRTCNotificationContent, MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc"; +import { type IRTCNotificationContent } from "matrix-js-sdk/src/matrixrtc"; import { MatrixClientPeg } from "./MatrixClientPeg"; import { PosthogAnalytics } from "./PosthogAnalytics"; @@ -486,8 +486,13 @@ class NotifierClass extends TypedEventEmitter m.sender === cli.getUserId()); + const rtcSession = room ? cli.matrixRTC.getRoomSession(room) : null; + let thisUserHasConnectedDevice = false; + if (rtcSession?.slotDescription?.application == "m.call") { + // Get the current state, the actual IncomingCallToast will update as needed by + // listening to the rtcSession directly. + thisUserHasConnectedDevice = rtcSession.memberships.some((m) => m.userId === cli.getUserId()); + } if (EventType.RTCNotification === ev.getType() && !thisUserHasConnectedDevice) { const content = ev.getContent() as IRTCNotificationContent; diff --git a/test/unit-tests/Notifier-test.ts b/test/unit-tests/Notifier-test.ts index 5ff4b0bf77..008606fedd 100644 --- a/test/unit-tests/Notifier-test.ts +++ b/test/unit-tests/Notifier-test.ts @@ -19,7 +19,7 @@ import { type AccountDataEvents, } from "matrix-js-sdk/src/matrix"; import { waitFor } from "jest-matrix-react"; -import { CallMembership, MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc"; +import { CallMembership, type MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc"; import type BasePlatform from "../../src/BasePlatform"; import Notifier from "../../src/Notifier"; @@ -433,7 +433,7 @@ describe("Notifier", () => { }); it("should not show toast when group call is already connected", () => { - const spyCallMemberships = jest.spyOn(MatrixRTCSession, "callMembershipsForRoom").mockReturnValue([ + const members = [ new CallMembership( mkEvent({ event: true, @@ -450,14 +450,17 @@ describe("Notifier", () => { device_id: "DEVICE", }, ), - ]); + ]; - const roomSession = MatrixRTCSession.roomSessionForRoom(mockClient, testRoom); + const mockRtcSession = { + memberships: members, + slotDescription: { application: "m.call", id: "" }, + } as unknown as MatrixRTCSession; + + mockClient.matrixRTC.getRoomSession.mockReturnValue(mockRtcSession); - mockClient.matrixRTC.getRoomSession.mockReturnValue(roomSession); emitCallNotificationEvent(); expect(ToastStore.sharedInstance().addOrReplaceToast).not.toHaveBeenCalled(); - spyCallMemberships.mockRestore(); }); it("should not show toast when calling with a different event type to org.matrix.msc4075.rtc.notification", () => { diff --git a/test/unit-tests/createRoom-test.ts b/test/unit-tests/createRoom-test.ts index 04f7101ff9..2775ad5409 100644 --- a/test/unit-tests/createRoom-test.ts +++ b/test/unit-tests/createRoom-test.ts @@ -17,7 +17,6 @@ import { RoomVersionStability, } from "matrix-js-sdk/src/matrix"; import { type CryptoApi } from "matrix-js-sdk/src/crypto-api"; -import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc"; import { act } from "jest-matrix-react"; import { @@ -292,8 +291,6 @@ describe("createRoom", () => { it("sets up Element video rooms correctly", async () => { const createCallSpy = jest.spyOn(ElementCall, "create"); - const callMembershipSpy = jest.spyOn(MatrixRTCSession, "callMembershipsForRoom"); - callMembershipSpy.mockReturnValue([]); await createRoom(client, { roomType: RoomType.UnstableCall });