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

read receipts: improve tooltips to show names of users #8438

Merged
merged 4 commits into from
May 2, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 37 additions & 11 deletions src/components/views/rooms/ReadReceiptGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,10 @@ interface IAvatarPosition {
}

function determineAvatarPosition(index: number, count: number, max: number): IAvatarPosition {
const firstVisible = Math.max(0, count - max);

if (index >= firstVisible) {
if (index < max) {
return {
hidden: false,
position: index - firstVisible,
position: Math.min(count, max) - index - 1,
};
} else {
return {
Expand All @@ -72,8 +70,41 @@ export function ReadReceiptGroup(
{ readReceipts, readReceiptMap, checkUnmounting, suppressAnimation, isTwelveHour }: Props,
) {
const [menuDisplayed, button, openMenu, closeMenu] = useContextMenu();

// If we are above MAX_READ_AVATARS, we’ll have to remove a few to have space for the +n count.
const maxAvatars = readReceipts.length > MAX_READ_AVATARS
? MAX_READ_AVATARS_PLUS_N
: MAX_READ_AVATARS;

const tooltipMembers: string[] = readReceipts.slice(0, maxAvatars)
.map(it => it.roomMember?.name ?? it.userId);
let tooltipText: string | null;
if (readReceipts.length > MAX_READ_AVATARS) {
tooltipText = _t("%(members)s and more", {
members: tooltipMembers.join(", "),
});
} else if (readReceipts.length) {
if (tooltipMembers.length > 1) {
tooltipText = _t("%(members)s and %(last)s", {
last: tooltipMembers.pop(),
members: tooltipMembers.join(", "),
});
} else {
tooltipText = tooltipMembers.join(", ");
}
}

const [{ showTooltip, hideTooltip }, tooltip] = useTooltip({
label: _t("Seen by %(count)s people", { count: readReceipts.length }),
label: (
<>
<div className="mx_Tooltip_title">
{ _t("Seen by %(count)s people", { count: readReceipts.length }) }
</div>
<div className="mx_Tooltip_sub">
{ tooltipText }
</div>
</>
),
alignment: Alignment.TopRight,
});

Expand All @@ -97,11 +128,6 @@ export function ReadReceiptGroup(
);
}

// If we are above MAX_READ_AVATARS, we’ll have to remove a few to have space for the +n count.
const maxAvatars = readReceipts.length > MAX_READ_AVATARS
? MAX_READ_AVATARS_PLUS_N
: MAX_READ_AVATARS;

const avatars = readReceipts.map((receipt, index) => {
const { hidden, position } = determineAvatarPosition(index, readReceipts.length, maxAvatars);

Expand Down Expand Up @@ -130,7 +156,7 @@ export function ReadReceiptGroup(
showTwelveHour={isTwelveHour}
/>
);
});
}).reverse();

let remText: JSX.Element;
const remainder = readReceipts.length - maxAvatars;
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
Expand Up @@ -1766,6 +1766,8 @@
"Preview": "Preview",
"View": "View",
"Join": "Join",
"%(members)s and more": "%(members)s and more",
"%(members)s and %(last)s": "%(members)s and %(last)s",
"Seen by %(count)s people|other": "Seen by %(count)s people",
"Seen by %(count)s people|one": "Seen by %(count)s person",
"Recently viewed": "Recently viewed",
Expand Down