From 8f92029b47fdc54c6d99b865270661ad3767180a Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Sat, 12 Sep 2026 20:28:41 -0400 Subject: [PATCH] fix(timeline): read-position membership listener actually fires RoomMemberEvent.Membership is emitted on RoomMember/MatrixClient, never on Room, so the (room as any).on() handler was dead. Subscribe on the client filtered by roomId; drop the cast. Fixes #61 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA --- src/app/hooks/useRoomReadPositions.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/app/hooks/useRoomReadPositions.ts b/src/app/hooks/useRoomReadPositions.ts index e84d15239..0a800ab30 100644 --- a/src/app/hooks/useRoomReadPositions.ts +++ b/src/app/hooks/useRoomReadPositions.ts @@ -1,4 +1,4 @@ -import { Room, RoomEvent, RoomMemberEvent, MatrixEvent } from 'matrix-js-sdk'; +import { Room, RoomEvent, RoomMember, RoomMemberEvent, MatrixEvent } from 'matrix-js-sdk'; import { useEffect, useState } from 'react'; import { useMatrixClient } from './useMatrixClient'; import { reactionOrEditEvent } from '../utils/room'; @@ -52,15 +52,21 @@ export function useRoomReadPositions(room: Room): Map { debounceTimer = null; }, 150); }; - const onMembership = (): void => setPositions(computePositions(room, myUserId)); + // RoomMemberEvent.Membership is emitted on the RoomMember (and re-emitted on the + // MatrixClient), never on Room — listening on `room` never fired. Subscribe on + // the client and filter to this room (Gitea #61). + const onMembership = (_ev: MatrixEvent, member: RoomMember): void => { + if (member.roomId !== room.roomId) return; + setPositions(computePositions(room, myUserId)); + }; room.on(RoomEvent.Receipt, onReceipt); - (room as any).on(RoomMemberEvent.Membership, onMembership); + mx.on(RoomMemberEvent.Membership, onMembership); return () => { if (debounceTimer !== null) clearTimeout(debounceTimer); room.removeListener(RoomEvent.Receipt, onReceipt); - (room as any).removeListener(RoomMemberEvent.Membership, onMembership); + mx.removeListener(RoomMemberEvent.Membership, onMembership); }; - }, [room, myUserId]); + }, [room, myUserId, mx]); return positions; }