From 5a5a7925931377f0d912843330a05d05a7b6dc81 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski Date: Wed, 27 Apr 2022 14:27:29 +0200 Subject: [PATCH] =?UTF-8?q?Read=20Receipts:=20never=20show=20+1,=20if=20it?= =?UTF-8?q?=E2=80=99s=20just=204,=20show=20all=20of=20them=20(#8428)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * read receipts: never show +1, if it’s just 4, show all of them * read receipts: improve type signature for determineAvatarPosition --- .../views/rooms/ReadReceiptGroup.tsx | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/components/views/rooms/ReadReceiptGroup.tsx b/src/components/views/rooms/ReadReceiptGroup.tsx index a427c74e07..31a2a59dd3 100644 --- a/src/components/views/rooms/ReadReceiptGroup.tsx +++ b/src/components/views/rooms/ReadReceiptGroup.tsx @@ -31,7 +31,11 @@ import { useTooltip } from "../../../utils/useTooltip"; import { _t } from "../../../languageHandler"; import { useRovingTabIndex } from "../../../accessibility/RovingTabIndex"; -const MAX_READ_AVATARS = 3; +// #20547 Design specified that we should show the three latest read receipts +const MAX_READ_AVATARS_PLUS_N = 3; +// #21935 If we’ve got just 4, don’t show +1, just show all of them +const MAX_READ_AVATARS = MAX_READ_AVATARS_PLUS_N + 1; + const READ_AVATAR_OFFSET = 10; export const READ_AVATAR_SIZE = 16; @@ -43,14 +47,24 @@ interface Props { isTwelveHour: boolean; } -// Design specified that we should show the three latest read receipts -function determineAvatarPosition(index, count): [boolean, number] { - const firstVisible = Math.max(0, count - MAX_READ_AVATARS); +interface IAvatarPosition { + hidden: boolean; + position: number; +} + +function determineAvatarPosition(index: number, count: number, max: number): IAvatarPosition { + const firstVisible = Math.max(0, count - max); if (index >= firstVisible) { - return [false, index - firstVisible]; + return { + hidden: false, + position: index - firstVisible, + }; } else { - return [true, 0]; + return { + hidden: true, + position: 0, + }; } } @@ -83,8 +97,13 @@ 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); + const { hidden, position } = determineAvatarPosition(index, readReceipts.length, maxAvatars); const userId = receipt.userId; let readReceiptInfo: IReadReceiptInfo; @@ -114,7 +133,7 @@ export function ReadReceiptGroup( }); let remText: JSX.Element; - const remainder = readReceipts.length - MAX_READ_AVATARS; + const remainder = readReceipts.length - maxAvatars; if (remainder > 0) { remText = ( @@ -163,7 +182,7 @@ export function ReadReceiptGroup(