From 1546c04a5bd5ee8174619d01ee8a6ce1e52e0a81 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 6 Oct 2025 09:45:32 +0100 Subject: [PATCH] Fixup call detection logic to allow sticky events --- src/home/useGroupCallRooms.ts | 46 ++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/home/useGroupCallRooms.ts b/src/home/useGroupCallRooms.ts index 3493ea0d..056b7d56 100644 --- a/src/home/useGroupCallRooms.ts +++ b/src/home/useGroupCallRooms.ts @@ -114,19 +114,41 @@ const roomIsJoinable = (room: Room): boolean => { } }; +/** + * Determines if a given room has call events in it, and therefore + * is likely to be a call room. + * @param room The Matrix room instance. + * @returns `true` if the room has call events. + */ const roomHasCallMembershipEvents = (room: Room): boolean => { - switch (room.getMyMembership()) { - case KnownMembership.Join: - return !!room - .getLiveTimeline() - .getState(EventTimeline.FORWARDS) - ?.events?.get(EventType.GroupCallMemberPrefix); - case KnownMembership.Knock: - // Assume that a room you've knocked on is able to hold calls - return true; - default: - return false; + // Legacy events. + const myMembership = room.getMyMembership(); + if (myMembership === KnownMembership.Knock) { + // Assume that a room you've knocked on is able to hold calls + return true; + } else if (myMembership !== KnownMembership.Join) { + // Otherwise, non-joined rooms should never show up. + return false; } + + const timeline = room.getLiveTimeline(); + + // Check legacy events first, because it's cheaper. + if ( + timeline + .getState(EventTimeline.FORWARDS) + ?.events?.has(EventType.GroupCallMemberPrefix) + ) { + return true; + } + + // There was call membership events at some point in the timeline. + return timeline.getEvents().some( + (e) => + // Membership events only count if both of these are true + e.unstableStickyInfo && e.getType() === EventType.GroupCallMemberPrefix, + ); + // Otherwise, it's *unlikely* this room was ever a call. }; export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] { @@ -137,7 +159,7 @@ export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] { // We want to show all rooms that historically had a call and which we are (or can become) part of. const rooms = client .getRooms() - // .filter(roomHasCallMembershipEvents) + .filter(roomHasCallMembershipEvents) .filter(roomIsJoinable); const sortedRooms = sortRooms(client, rooms); Promise.all(