Files
cinny/src/app/hooks/useRoomMembers.ts
T

38 lines
1.1 KiB
TypeScript
Raw Normal View History

2023-06-12 21:15:23 +10:00
import { MatrixClient, MatrixEvent, RoomMember, RoomMemberEvent } from 'matrix-js-sdk';
import { useEffect, useState } from 'react';
export const useRoomMembers = (mx: MatrixClient, roomId: string): RoomMember[] => {
const [members, setMembers] = useState<RoomMember[]>([]);
useEffect(() => {
const room = mx.getRoom(roomId);
2023-06-22 09:14:50 +10:00
let loadingMembers = true;
let disposed = false;
2023-06-12 21:15:23 +10:00
const updateMemberList = (event?: MatrixEvent) => {
2023-06-22 09:14:50 +10:00
if (!room || disposed || (event && event.getRoomId() !== roomId)) return;
if (loadingMembers) return;
2023-06-12 21:15:23 +10:00
setMembers(room.getMembers());
};
if (room) {
2023-06-22 09:14:50 +10:00
setMembers(room.getMembers());
2023-06-12 21:15:23 +10:00
room.loadMembersIfNeeded().then(() => {
2023-06-22 09:14:50 +10:00
loadingMembers = false;
if (disposed) return;
2023-06-12 21:15:23 +10:00
updateMemberList();
});
}
mx.on(RoomMemberEvent.Membership, updateMemberList);
mx.on(RoomMemberEvent.PowerLevel, updateMemberList);
return () => {
2023-06-22 09:14:50 +10:00
disposed = true;
2023-06-12 21:15:23 +10:00
mx.removeListener(RoomMemberEvent.Membership, updateMemberList);
mx.removeListener(RoomMemberEvent.PowerLevel, updateMemberList);
};
2023-06-22 09:14:50 +10:00
}, [mx, roomId]);
2023-06-12 21:15:23 +10:00
return members;
};