diff --git a/src/components/viewmodels/avatars/RoomAvatarViewModel.tsx b/src/components/viewmodels/avatars/RoomAvatarViewModel.tsx index 784184e159c..409bacf6acd 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 5a06bb01f51..591b9f928b3 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;