Ignore decline events from the local user

This commit is contained in:
Robin
2025-09-05 21:22:32 +02:00
parent 1193a22658
commit 1e32b355ce
2 changed files with 26 additions and 6 deletions

View File

@@ -26,6 +26,7 @@ import {
MatrixEvent, MatrixEvent,
type IRoomTimelineData, type IRoomTimelineData,
EventType, EventType,
type IEvent,
} from "matrix-js-sdk"; } from "matrix-js-sdk";
import { import {
ConnectionState, ConnectionState,
@@ -248,12 +249,14 @@ function summarizeLayout$(l$: Observable<Layout>): Observable<LayoutSummary> {
function mockRingEvent( function mockRingEvent(
eventId: string, eventId: string,
lifetimeMs: number | undefined, lifetimeMs: number | undefined,
sender = local.userId,
): { event_id: string } & IRTCNotificationContent { ): { event_id: string } & IRTCNotificationContent {
return { return {
event_id: eventId, event_id: eventId,
...(lifetimeMs === undefined ? {} : { lifetime: lifetimeMs }), ...(lifetimeMs === undefined ? {} : { lifetime: lifetimeMs }),
notification_type: "ring", notification_type: "ring",
} as { event_id: string } & IRTCNotificationContent; sender,
} as unknown as { event_id: string } & IRTCNotificationContent;
} }
// The app doesn't really care about the content of these legacy events, we just // The app doesn't really care about the content of these legacy events, we just
@@ -1436,7 +1439,7 @@ describe("waitForCallPickup$", () => {
}); });
test("decline after timeout window ends -> stays timeout", () => { test("decline after timeout window ends -> stays timeout", () => {
withTestScheduler(({ hot, schedule, expectObservable, scope }) => { withTestScheduler(({ schedule, expectObservable }) => {
withCallViewModel( withCallViewModel(
{}, {},
(vm, rtcSession) => { (vm, rtcSession) => {
@@ -1475,8 +1478,8 @@ describe("waitForCallPickup$", () => {
}); });
}); });
test("decline with wrong id is ignored (stays ringing)", () => { function testStaysRinging(declineEvent: Partial<IEvent>): void {
withTestScheduler(({ hot, schedule, expectObservable, scope }) => { withTestScheduler(({ schedule, expectObservable }) => {
withCallViewModel( withCallViewModel(
{}, {},
(vm, rtcSession) => { (vm, rtcSession) => {
@@ -1492,7 +1495,7 @@ describe("waitForCallPickup$", () => {
d: () => { d: () => {
rtcSession.room.emit( rtcSession.room.emit(
MatrixRoomEvent.Timeline, MatrixRoomEvent.Timeline,
new MatrixEvent({ event_id: "$wrong", type: "m.rtc.decline" }), new MatrixEvent(declineEvent),
rtcSession.room, rtcSession.room,
undefined, undefined,
false, false,
@@ -1512,6 +1515,22 @@ describe("waitForCallPickup$", () => {
}, },
); );
}); });
}
test("decline with wrong id is ignored (stays ringing)", () => {
testStaysRinging({
event_id: "$wrong",
type: "m.rtc.decline",
sender: local.userId,
});
});
test("decline with sender being the local user is ignored (stays ringing)", () => {
testStaysRinging({
event_id: "$right",
type: "m.rtc.decline",
sender: alice.userId,
});
}); });
}); });

View File

@@ -936,7 +936,8 @@ export class CallViewModel extends ViewModel {
([event]) => ([event]) =>
event.getType() === EventType.RTCDecline && event.getType() === EventType.RTCDecline &&
event.getRelation()?.rel_type === "m.reference" && event.getRelation()?.rel_type === "m.reference" &&
event.getRelation()?.event_id === notificationEvent.event_id, event.getRelation()?.event_id === notificationEvent.event_id &&
event.getSender() !== this.userId,
), ),
), ),
), ),