fix(session): invalidate RoomSession snapshot on room-data and permission changes

getActiveRoomSessionSnapshot() caches the frozen snapshot keyed on the session
reference, but RoomDataHandler (tradeMode/groupId/isGuildRoom/doorMode/allowPets)
and RoomPermissionsHandler (controllerLevel/owner) mutate those fields on the
same session object without invalidating the cache. Any consumer reading a
mutable field via useActiveRoomSessionSnapshot would get stale data and never
re-render.

Expose invalidateRoomSessionSnapshot() on IRoomHandlerListener and call it from
both handlers after they mutate the session.
This commit is contained in:
simoleo89
2026-06-13 15:15:13 +02:00
parent a49c835870
commit 3ce15e5819
4 changed files with 10 additions and 1 deletions
@@ -5,4 +5,5 @@ export interface IRoomHandlerListener
getSession(id: number): IRoomSession; getSession(id: number): IRoomSession;
sessionUpdate(id: number, type: string): void; sessionUpdate(id: number, type: string): void;
sessionReinitialize(fromRoomId: number, toRoomId: number): void; sessionReinitialize(fromRoomId: number, toRoomId: number): void;
invalidateRoomSessionSnapshot(): void;
} }
+1 -1
View File
@@ -28,7 +28,7 @@ export class RoomSessionManager implements IRoomSessionManager, IRoomHandlerList
private _savedPosY: number = -1; private _savedPosY: number = -1;
private _activeRoomSessionSnapshot: Readonly<IRoomSessionSnapshot> | null = null; private _activeRoomSessionSnapshot: Readonly<IRoomSessionSnapshot> | null = null;
private invalidateRoomSessionSnapshot(): void public invalidateRoomSessionSnapshot(): void
{ {
this._activeRoomSessionSnapshot = null; this._activeRoomSessionSnapshot = null;
@@ -39,6 +39,8 @@ export class RoomDataHandler extends BaseHandler
roomSession.allowPets = roomData.allowPets; roomSession.allowPets = roomData.allowPets;
roomSession.moderationSettings = parser.moderation; roomSession.moderationSettings = parser.moderation;
this.listener.invalidateRoomSessionSnapshot();
GetEventDispatcher().dispatchEvent(new RoomSessionPropertyUpdateEvent(RoomSessionPropertyUpdateEvent.RSDUE_ALLOW_PETS, roomSession)); GetEventDispatcher().dispatchEvent(new RoomSessionPropertyUpdateEvent(RoomSessionPropertyUpdateEvent.RSDUE_ALLOW_PETS, roomSession));
GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.ROOM_DATA, roomSession)); GetEventDispatcher().dispatchEvent(new RoomSessionEvent(RoomSessionEvent.ROOM_DATA, roomSession));
} }
@@ -22,6 +22,8 @@ export class RoomPermissionsHandler extends BaseHandler
if(!session) return; if(!session) return;
session.setControllerLevel(event.getParser().controllerLevel); session.setControllerLevel(event.getParser().controllerLevel);
this.listener.invalidateRoomSessionSnapshot();
} }
private onRoomRightsClearEvent(event: RoomRightsClearEvent): void private onRoomRightsClearEvent(event: RoomRightsClearEvent): void
@@ -33,6 +35,8 @@ export class RoomPermissionsHandler extends BaseHandler
if(!session) return; if(!session) return;
session.setControllerLevel(RoomControllerLevel.NONE); session.setControllerLevel(RoomControllerLevel.NONE);
this.listener.invalidateRoomSessionSnapshot();
} }
private onRoomRightsOwnerEvent(event: RoomRightsOwnerEvent): void private onRoomRightsOwnerEvent(event: RoomRightsOwnerEvent): void
@@ -44,5 +48,7 @@ export class RoomPermissionsHandler extends BaseHandler
if(!session) return; if(!session) return;
session.setRoomOwner(); session.setRoomOwner();
this.listener.invalidateRoomSessionSnapshot();
} }
} }