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;
|
|
|
|
|
};
|