Update hook to keep method signature (accepting an array of Rooms instead) to support multiple room event tracking of the same event

This commit is contained in:
Gigiaj 2025-05-04 12:14:46 -05:00
parent 2841386972
commit b40ddf0c61

View file

@ -1,28 +1,35 @@
import { useCallback, useMemo } from 'react';
import { Room } from 'matrix-js-sdk';
import { MatrixEvent, Room } from 'matrix-js-sdk';
import { StateEvent } from '../../types/matrix/room';
import { useMatrixClient } from './useMatrixClient';
import { useForceUpdate } from './useForceUpdate';
import { useStateEventCallback } from './useStateEventCallback';
import { getStateEvents } from '../utils/room';
export const useStateEvents = (room: Room, eventType: StateEvent) => {
export const useStateEvents = (rooms: Room[], eventType: StateEvent): number => {
const mx = useMatrixClient();
const [updateCount, forceUpdate] = useForceUpdate();
useStateEventCallback(
room.client,
useCallback(
(event) => {
if (event.getRoomId() === room.roomId && event.getType() === eventType) {
const relevantRoomIds = useMemo(() => {
const ids = new Set<string>();
if (rooms && Array.isArray(rooms)) {
rooms.forEach((room) => {
if (room?.roomId) {
ids.add(room.roomId);
}
});
}
return ids;
}, [rooms]);
const handleEventCallback = useCallback(
(event: MatrixEvent) => {
const eventRoomId = event.getRoomId();
if (eventRoomId && event.getType() === eventType && relevantRoomIds.has(eventRoomId)) {
forceUpdate();
}
},
[room, eventType, forceUpdate]
)
);
return useMemo(
() => getStateEvents(room, eventType),
// eslint-disable-next-line react-hooks/exhaustive-deps
[room, eventType, updateCount]
[eventType, relevantRoomIds, forceUpdate]
);
useStateEventCallback(mx, handleEventCallback);
return updateCount;
};