From 7ce0a76414fe095e3ccbad8413b53c365ab0128d Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Mon, 14 Apr 2025 13:59:31 +0200 Subject: [PATCH] New room list: fix public room icon visibility when filter change (#29737) * fix: recompute public variable when room changes in room list item view model * test: add test to check that isPublic is computed correctly when the room changes --- .../viewmodels/avatars/RoomAvatarViewModel.tsx | 7 ++++++- .../viewmodels/avatars/RoomAvatarViewModel-test.tsx | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/components/viewmodels/avatars/RoomAvatarViewModel.tsx b/src/components/viewmodels/avatars/RoomAvatarViewModel.tsx index 784184e159..409bacf6ac 100644 --- a/src/components/viewmodels/avatars/RoomAvatarViewModel.tsx +++ b/src/components/viewmodels/avatars/RoomAvatarViewModel.tsx @@ -14,7 +14,7 @@ import { type User, UserEvent, } from "matrix-js-sdk/src/matrix"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useTypedEventEmitter } from "../../../hooks/useEventEmitter"; import DMRoomMap from "../../../utils/DMRoomMap"; @@ -82,6 +82,11 @@ function useIsPublic(room: Room): boolean { setIsPublic(isRoomPublic(_room)); }); + // Reset the value when the room changes + useEffect(() => { + setIsPublic(isRoomPublic(room)); + }, [room]); + return isPublic; } diff --git a/test/unit-tests/components/viewmodels/avatars/RoomAvatarViewModel-test.tsx b/test/unit-tests/components/viewmodels/avatars/RoomAvatarViewModel-test.tsx index 5a06bb01f5..591b9f928b 100644 --- a/test/unit-tests/components/viewmodels/avatars/RoomAvatarViewModel-test.tsx +++ b/test/unit-tests/components/viewmodels/avatars/RoomAvatarViewModel-test.tsx @@ -63,6 +63,17 @@ describe("RoomAvatarViewModel", () => { expect(vm.current.hasDecoration).toBe(true); }); + it("should recompute isPublic when room changed", async () => { + const { result: vm, rerender } = renderHook((props) => useRoomAvatarViewModel(props), { initialProps: room }); + expect(vm.current.isPublic).toBe(false); + + const publicRoom = mkStubRoom("roomId2", "roomName2", matrixClient); + jest.spyOn(publicRoom, "getJoinRule").mockReturnValue(JoinRule.Public); + rerender(publicRoom); + + await waitFor(() => expect(vm.current.isPublic).toBe(true)); + }); + describe("presence", () => { let user: User;