More tidy

This commit is contained in:
Half-Shot
2025-10-13 12:05:01 +01:00
parent 6580555bda
commit b90bf7da2d

View File

@@ -20,7 +20,6 @@ import {
MatrixRTCSessionManagerEvents, MatrixRTCSessionManagerEvents,
type MatrixRTCSession, type MatrixRTCSession,
} from "matrix-js-sdk/lib/matrixrtc"; } from "matrix-js-sdk/lib/matrixrtc";
import { logger } from "matrix-js-sdk/lib/logger";
import { getKeyForRoom } from "../e2ee/sharedKeyManagement"; import { getKeyForRoom } from "../e2ee/sharedKeyManagement";
@@ -121,7 +120,8 @@ const roomIsJoinable = (room: Room): boolean => {
* @returns `true` if the room has call events. * @returns `true` if the room has call events.
*/ */
const roomHasCallMembershipEvents = (room: Room): boolean => { 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(); const myMembership = room.getMyMembership();
if (myMembership === KnownMembership.Knock) { if (myMembership === KnownMembership.Knock) {
// Assume that a room you've knocked on is able to hold calls // Assume that a room you've knocked on is able to hold calls
@@ -131,9 +131,8 @@ const roomHasCallMembershipEvents = (room: Room): boolean => {
return false; return false;
} }
// Legacy member state checks (cheaper to check.)
const timeline = room.getLiveTimeline(); const timeline = room.getLiveTimeline();
// Check legacy events first, because it's cheaper.
if ( if (
timeline timeline
.getState(EventTimeline.FORWARDS) .getState(EventTimeline.FORWARDS)
@@ -142,7 +141,15 @@ const roomHasCallMembershipEvents = (room: Room): boolean => {
return true; 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( return timeline.getEvents().some(
(e) => (e) =>
// Membership events only count if both of these are true // Membership events only count if both of these are true
@@ -162,24 +169,22 @@ export function useGroupCallRooms(client: MatrixClient): GroupCallRoom[] {
.filter(roomHasCallMembershipEvents) .filter(roomHasCallMembershipEvents)
.filter(roomIsJoinable); .filter(roomIsJoinable);
const sortedRooms = sortRooms(client, rooms); const sortedRooms = sortRooms(client, rooms);
Promise.all( const items = sortedRooms.map((room) => {
sortedRooms.map(async (room) => { const session = client.matrixRTC.getRoomSession(room);
const session = await client.matrixRTC.getRoomSession(room); return {
return { roomAlias: room.getCanonicalAlias() ?? undefined,
roomAlias: room.getCanonicalAlias() ?? undefined, roomName: room.name,
roomName: room.name, avatarUrl: room.getMxcAvatarUrl()!,
avatarUrl: room.getMxcAvatarUrl()!, room,
room, session,
session, participants: session.memberships
participants: session.memberships .filter((m) => m.sender)
.filter((m) => m.sender) .map((m) => room.getMember(m.sender!))
.map((m) => room.getMember(m.sender!)) .filter((m) => m) as RoomMember[],
.filter((m) => m) as RoomMember[], };
}; });
}),
) setRooms(items);
.then((items) => setRooms(items))
.catch(logger.error);
} }
updateRooms(); updateRooms();