import { Room, RoomEvent } from 'matrix-js-sdk'; import { useEffect, useState } from 'react'; import { useMatrixClient } from './useMatrixClient'; function computePositions(room: Room, myUserId: string): Map { const map = new Map(); for (const member of room.getJoinedMembers()) { if (member.userId === myUserId) continue; const evtId = room.getEventReadUpTo(member.userId); if (!evtId) continue; const arr = map.get(evtId); if (arr) arr.push(member.userId); else map.set(evtId, [member.userId]); } return map; } export function useRoomReadPositions(room: Room): Map { const mx = useMatrixClient(); const myUserId = mx.getUserId() ?? ''; const [positions, setPositions] = useState(() => computePositions(room, myUserId)); useEffect(() => { setPositions(computePositions(room, myUserId)); const onReceipt = () => setPositions(computePositions(room, myUserId)); room.on(RoomEvent.Receipt, onReceipt); return () => { room.removeListener(RoomEvent.Receipt, onReceipt); }; }, [room, myUserId]); return positions; }