diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx
index 565e49a9..b666c48b 100644
--- a/src/app/features/room-nav/RoomNavItem.tsx
+++ b/src/app/features/room-nav/RoomNavItem.tsx
@@ -53,7 +53,7 @@ import {
} from '../../hooks/useRoomsNotificationPreferences';
import { RoomNotificationModeSwitcher } from '../../components/RoomNotificationSwitcher';
import { useCallState } from '../../pages/client/call/CallProvider';
-import { useCallMembers } from '../../hooks/useCallMembers';
+import { useCallMembers } from '../../hooks/useCallMemberships';
import { useRoomNavigate } from '../../hooks/useRoomNavigate';
import { ScreenSize, useScreenSizeContext } from '../../hooks/useScreenSize';
import { RoomNavUser } from './RoomNavUser';
@@ -239,7 +239,7 @@ export function RoomNavItem({
(receipt) => receipt.userId !== mx.getUserId()
);
const isActiveCall = isCallActive && activeCallRoomId === room.roomId;
- const callMembers = useCallMembers(mx, room.roomId);
+ const callMemberships = useCallMembers(mx, room.roomId);
const { navigateRoom } = useRoomNavigate();
const { roomIdOrAlias: viewedRoomId } = useParams();
const screenSize = useScreenSizeContext();
@@ -302,7 +302,7 @@ export function RoomNavItem({
? [
'Call Room',
isActiveCall && 'Currently in Call',
- callMembers.length && `${callMembers.length} in Call`,
+ callMemberships.length && `${callMemberships.length} in Call`,
]
: 'Text Room',
unread?.total && `${unread.total} Messages`,
@@ -461,8 +461,8 @@ export function RoomNavItem({
{room.isCallRoom() && (
- {callMembers.map((userId) => (
-
+ {callMemberships.map((callMembership) => (
+
))}
)}
diff --git a/src/app/features/room-nav/RoomNavUser.tsx b/src/app/features/room-nav/RoomNavUser.tsx
index bd65ef78..55a95c15 100644
--- a/src/app/features/room-nav/RoomNavUser.tsx
+++ b/src/app/features/room-nav/RoomNavUser.tsx
@@ -12,6 +12,7 @@ import {
import React, { useState } from 'react';
import { Room } from 'matrix-js-sdk';
import { useFocusWithin, useHover } from 'react-aria';
+import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership';
import { NavItem, NavItemContent, NavItemOptions } from '../../components/nav';
import { UserAvatar } from '../../components/user-avatar';
import { useMatrixClient } from '../../hooks/useMatrixClient';
@@ -23,9 +24,9 @@ import { openProfileViewer } from '../../../client/action/navigation';
type RoomNavUserProps = {
room: Room;
- userId: string;
+ callMembership: CallMembership;
};
-export function RoomNavUser({ room, userId }: RoomNavUserProps) {
+export function RoomNavUser({ room, callMembership }: RoomNavUserProps) {
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const [navUserExpanded, setNavUserExpanded] = useState(false);
@@ -39,11 +40,12 @@ export function RoomNavUser({ room, userId }: RoomNavUserProps) {
});
const { isCallActive, activeCallRoomId } = useCallState();
const isActiveCall = isCallActive && activeCallRoomId === room.roomId;
+ const userId = callMembership.sender ?? '';
const avatarMxcUrl = getMemberAvatarMxc(room, userId);
const avatarUrl = avatarMxcUrl
? mx.mxcUrlToHttp(avatarMxcUrl, 32, 32, 'crop', undefined, false, useAuthentication)
: undefined;
- const getName = getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId;
+ const getName = getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId);
const isCallParticipant = isActiveCall && userId !== mx.getUserId();
const handleNavUserClick = () => {
diff --git a/src/app/hooks/useCallMembers.ts b/src/app/hooks/useCallMembers.ts
deleted file mode 100644
index 6e2e184c..00000000
--- a/src/app/hooks/useCallMembers.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-/*import { MatrixClient } from 'matrix-js-sdk';
-import {
- MatrixRTCSession,
- MatrixRTCSessionEvent,
-} from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSession';
-import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership';
-import { useEffect, useState } from 'react';
-
-export const useCallMembers = (
- mx: MatrixClient,
- mxr: MatrixRTCSession,
- roomId: string
-): CallMembership[] => {
- const [memberships, setMemberships] = useState([]);
-
- useEffect(() => {
- const room = mx.getRoom(roomId);
-
- const updateMemberships = () => {
- if (!room?.isCallRoom()) return;
- setMemberships(MatrixRTCSession.callMembershipsForRoom(room));
- //setMemberships(mxr.memberships);
- //console.log('MEMBERSHIPS:');
- //console.log(memberships);
- };
-
- updateMemberships();
-
- mxr.on(MatrixRTCSessionEvent.MembershipsChanged, updateMemberships);
- return () => {
- mxr.removeListener(MatrixRTCSessionEvent.MembershipsChanged, updateMemberships);
- };
- }, [mx, mxr, roomId]);
-
- return memberships;
-};*/
-
-// TEMPORARY
-import { MatrixClient, MatrixEvent, RoomStateEvent } from 'matrix-js-sdk';
-import { useEffect, useMemo, useState } from 'react';
-import { getStateEvents } from '../utils/room';
-import { StateEvent } from '../../types/matrix/room';
-
-export const useCallMembers = (mx: MatrixClient, roomId: string): string[] => {
- const [events, setEvents] = useState([]);
-
- useEffect(() => {
- const room = mx.getRoom(roomId);
-
- const updateEvents = (event?: MatrixEvent) => {
- if (!room?.isCallRoom() || (event && event.getRoomId() !== roomId)) return;
- setEvents(getStateEvents(room, StateEvent.GroupCallMemberPrefix));
- };
-
- updateEvents();
-
- mx.on(RoomStateEvent.Events, updateEvents);
- return () => {
- mx.removeListener(RoomStateEvent.Events, updateEvents);
- };
- }, [mx, roomId]);
-
- const participants = useMemo(
- () =>
- events
- .filter((ev) => {
- const content = ev.getContent();
- return (
- content &&
- ev.getSender() &&
- content.expires &&
- ev.getTs() + content.expires > Date.now()
- );
- })
- /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
- .map((ev) => ev.getSender()!),
- [events]
- );
-
- return participants;
-};
diff --git a/src/app/hooks/useCallMemberships.ts b/src/app/hooks/useCallMemberships.ts
new file mode 100644
index 00000000..36418e0d
--- /dev/null
+++ b/src/app/hooks/useCallMemberships.ts
@@ -0,0 +1,28 @@
+import { MatrixClient } from 'matrix-js-sdk';
+import {
+ MatrixRTCSession,
+ MatrixRTCSessionEvent,
+} from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSession';
+import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership';
+import { useEffect, useState } from 'react';
+
+export const useCallMembers = (mx: MatrixClient, roomId: string): CallMembership[] => {
+ const [memberships, setMemberships] = useState([]);
+ const room = mx.getRoom(roomId);
+ const mxr = mx.matrixRTC.getRoomSession(room);
+ useEffect(() => {
+ const updateMemberships = () => {
+ if (!room?.isCallRoom()) return;
+ setMemberships(MatrixRTCSession.callMembershipsForRoom(room));
+ };
+
+ updateMemberships();
+
+ mxr.on(MatrixRTCSessionEvent.MembershipsChanged, updateMemberships);
+ return () => {
+ mxr.removeListener(MatrixRTCSessionEvent.MembershipsChanged, updateMemberships);
+ };
+ }, [mx, mxr, room, roomId]);
+
+ return memberships;
+};