From b90bf7da2d4e2b328ef5f6da6229902c249dac43 Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 13 Oct 2025 12:05:01 +0100 Subject: [PATCH] More tidy --- src/home/useGroupCallRooms.ts | 51 +++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/home/useGroupCallRooms.ts b/src/home/useGroupCallRooms.ts index 056b7d56..bd54fabb 100644 --- a/src/home/useGroupCallRooms.ts +++ b/src/home/useGroupCallRooms.ts @@ -20,7 +20,6 @@ import { MatrixRTCSessionManagerEvents, type MatrixRTCSession, } from "matrix-js-sdk/lib/matrixrtc"; -import { logger } from "matrix-js-sdk/lib/logger"; import { getKeyForRoom } from "../e2ee/sharedKeyManagement"; @@ -121,7 +120,8 @@ const roomIsJoinable = (room: Room): boolean => { * @returns `true` if the room has call events. */ const roomHasCallMembershipEvents = (room: Room): boolean => { - // Legacy events. + // Check our room membership first, to rule out any rooms + // we can't have a call in. const myMembership = room.getMyMembership(); if (myMembership === KnownMembership.Knock) { // Assume that a room you've knocked on is able to hold calls @@ -131,9 +131,8 @@ const roomHasCallMembershipEvents = (room: Room): boolean => { return false; } + // Legacy member state checks (cheaper to check.) const timeline = room.getLiveTimeline(); - - // Check legacy events first, because it's cheaper. if ( timeline .getState(EventTimeline.FORWARDS) @@ -142,7 +141,15 @@ const roomHasCallMembershipEvents = (room: Room): boolean => { return true; } - // There was call membership events at some point in the timeline. + // Check for *active* calls using sticky events. + for (const sticky of room._unstable_getStickyEvents()) { + if (sticky.getType() === EventType.GroupCallMemberPrefix) { + return true; + } + } + + // Otherwise, check recent event history to see if anyone had + // sent a call membership in here. return timeline.getEvents().some( (e) => // Membership events only count if both of these are true @@ -162,24 +169,22 @@ export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] { .filter(roomHasCallMembershipEvents) .filter(roomIsJoinable); const sortedRooms = sortRooms(client, rooms); - Promise.all( - sortedRooms.map(async (room) => { - const session = await client.matrixRTC.getRoomSession(room); - return { - roomAlias: room.getCanonicalAlias() ?? undefined, - roomName: room.name, - avatarUrl: room.getMxcAvatarUrl()!, - room, - session, - participants: session.memberships - .filter((m) => m.sender) - .map((m) => room.getMember(m.sender!)) - .filter((m) => m) as RoomMember[], - }; - }), - ) - .then((items) => setRooms(items)) - .catch(logger.error); + const items = sortedRooms.map((room) => { + const session = client.matrixRTC.getRoomSession(room); + return { + roomAlias: room.getCanonicalAlias() ?? undefined, + roomName: room.name, + avatarUrl: room.getMxcAvatarUrl()!, + room, + session, + participants: session.memberships + .filter((m) => m.sender) + .map((m) => room.getMember(m.sender!)) + .filter((m) => m) as RoomMember[], + }; + }); + + setRooms(items); } updateRooms();