Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 65bfc92

Browse files
HarHarLinksrichvdhMidhunSureshR
authored
fix automatic DM avatar with functional members (#12157)
* fix automatic DM avatar with functional members * add tests for functional members * add snapshot for functional members avatar test * update snapshot for functional members avatar test * restore mocks after each functional members avatar test * refactor DecoratedRoomAvatar-test --------- Co-authored-by: Richard van der Hoff <[email protected]> Co-authored-by: R Midhun Suresh <[email protected]>
1 parent 5a0537b commit 65bfc92

File tree

3 files changed

+74
-7
lines changed

3 files changed

+74
-7
lines changed

src/components/views/avatars/DecoratedRoomAvatar.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { MatrixClientPeg } from "../../../MatrixClientPeg";
2929
import { _t } from "../../../languageHandler";
3030
import DMRoomMap from "../../../utils/DMRoomMap";
3131
import { IOOBData } from "../../../stores/ThreepidInviteStore";
32+
import { getJoinedNonFunctionalMembers } from "../../../utils/room/getJoinedNonFunctionalMembers";
3233

3334
interface IProps {
3435
room: Room;
@@ -158,7 +159,7 @@ export default class DecoratedRoomAvatar extends React.PureComponent<IProps, ISt
158159

159160
// We look at the DMRoomMap and not the tag here so that we don't exclude DMs in Favourites
160161
const otherUserId = DMRoomMap.shared().getUserIdForRoomId(this.props.room.roomId);
161-
if (otherUserId && this.props.room.getJoinedMemberCount() === 2) {
162+
if (otherUserId && getJoinedNonFunctionalMembers(this.props.room).length === 2) {
162163
// Track presence, if available
163164
if (isPresenceEnabled(this.props.room.client)) {
164165
this.dmUser = MatrixClientPeg.safeGet().getUser(otherUserId);

test/components/views/avatars/DecoratedRoomAvatar-test.tsx

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,45 @@ import { stubClient } from "../../../test-utils";
2626
import DecoratedRoomAvatar from "../../../../src/components/views/avatars/DecoratedRoomAvatar";
2727
import DMRoomMap from "../../../../src/utils/DMRoomMap";
2828

29+
jest.mock("../../../../src/utils/presence", () => ({ isPresenceEnabled: jest.fn().mockReturnValue(true) }));
30+
31+
jest.mock("../../../../src/utils/room/getJoinedNonFunctionalMembers", () => ({
32+
getJoinedNonFunctionalMembers: jest.fn().mockReturnValue([0, 1]),
33+
}));
34+
2935
describe("DecoratedRoomAvatar", () => {
3036
const ROOM_ID = "roomId";
3137

3238
let mockClient: MatrixClient;
3339
let room: Room;
3440

41+
function renderComponent() {
42+
return render(<DecoratedRoomAvatar room={room} size="32px" />, {
43+
wrapper: TooltipProvider,
44+
});
45+
}
46+
3547
beforeEach(() => {
3648
stubClient();
3749
mockClient = mocked(MatrixClientPeg.safeGet());
3850

3951
room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", {
4052
pendingEventOrdering: PendingEventOrdering.Detached,
4153
});
54+
});
55+
56+
afterEach(() => {
57+
jest.restoreAllMocks();
58+
});
4259

60+
it("shows an avatar with globe icon and tooltip for public room", async () => {
4361
const dmRoomMap = {
4462
getUserIdForRoomId: jest.fn(),
4563
} as unknown as DMRoomMap;
4664
jest.spyOn(DMRoomMap, "shared").mockReturnValue(dmRoomMap);
47-
});
48-
49-
it("shows an avatar with globe icon and tooltip for public room", async () => {
5065
room.getJoinRule = jest.fn().mockReturnValue(JoinRule.Public);
51-
const { container, asFragment } = render(<DecoratedRoomAvatar room={room} size="32px" />, {
52-
wrapper: TooltipProvider,
53-
});
66+
67+
const { container, asFragment } = renderComponent();
5468

5569
const globe = container.querySelector(".mx_DecoratedRoomAvatar_icon_globe")!;
5670
expect(globe).toBeVisible();
@@ -66,4 +80,31 @@ describe("DecoratedRoomAvatar", () => {
6680

6781
expect(asFragment()).toMatchSnapshot();
6882
});
83+
84+
it("shows the presence indicator in a DM room that also has functional members", async () => {
85+
const DM_USER_ID = "@bob:foo.bar";
86+
const dmRoomMap = {
87+
getUserIdForRoomId: () => {
88+
return DM_USER_ID;
89+
},
90+
} as unknown as DMRoomMap;
91+
jest.spyOn(DMRoomMap, "shared").mockReturnValue(dmRoomMap);
92+
jest.spyOn(DecoratedRoomAvatar.prototype as any, "getPresenceIcon").mockImplementation(() => "ONLINE");
93+
94+
const { container, asFragment } = renderComponent();
95+
96+
const presence = container.querySelector(".mx_DecoratedRoomAvatar_icon")!;
97+
expect(presence).toBeVisible();
98+
await userEvent.hover(presence!);
99+
100+
// wait for the tooltip to open
101+
const tooltip = await waitFor(() => {
102+
const tooltip = document.getElementById(presence.getAttribute("aria-describedby")!);
103+
expect(tooltip).toBeVisible();
104+
return tooltip;
105+
});
106+
expect(tooltip).toHaveTextContent("Online");
107+
108+
expect(asFragment()).toMatchSnapshot();
109+
});
69110
});

test/components/views/avatars/__snapshots__/DecoratedRoomAvatar-test.tsx.snap

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,28 @@ exports[`DecoratedRoomAvatar shows an avatar with globe icon and tooltip for pub
2424
</div>
2525
</DocumentFragment>
2626
`;
27+
28+
exports[`DecoratedRoomAvatar shows the presence indicator in a DM room that also has functional members 1`] = `
29+
<DocumentFragment>
30+
<div
31+
class="mx_DecoratedRoomAvatar mx_DecoratedRoomAvatar_cutout"
32+
>
33+
<span
34+
class="_avatar_k41ul_17 mx_BaseAvatar _avatar-imageless_k41ul_60"
35+
data-color="5"
36+
data-testid="avatar-img"
37+
data-type="round"
38+
role="presentation"
39+
style="--cpd-avatar-size: 32px;"
40+
>
41+
r
42+
</span>
43+
<div
44+
aria-describedby="radix-1"
45+
class="mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_online"
46+
data-state="delayed-open"
47+
tabindex="0"
48+
/>
49+
</div>
50+
</DocumentFragment>
51+
`;

0 commit comments

Comments
 (0)