Skip to content

Commit 79c712b

Browse files
ergot-rpergotsejuliajforesti
authored
fix(ux): WCAG (4.1.2) Dynamic aria-labelledby-message (RocketChat#36271)
Co-authored-by: erik <erik.gothe@fotbollsdata.se> Co-authored-by: juliajforesti <juliajforesti@gmail.com>
1 parent 46a1774 commit 79c712b

3 files changed

Lines changed: 37 additions & 5 deletions

File tree

apps/meteor/client/components/message/IgnoredContent.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import { memo } from 'react';
44
import { useTranslation } from 'react-i18next';
55

66
type IgnoredContentProps = {
7+
messageId: string;
78
onShowMessageIgnored: () => void;
89
};
910

10-
const IgnoredContent = ({ onShowMessageIgnored }: IgnoredContentProps): ReactElement => {
11+
const IgnoredContent = ({ messageId, onShowMessageIgnored }: IgnoredContentProps): ReactElement => {
1112
const { t } = useTranslation();
1213

1314
const showMessageIgnored = (event: SyntheticEvent): void => {
@@ -17,7 +18,7 @@ const IgnoredContent = ({ onShowMessageIgnored }: IgnoredContentProps): ReactEle
1718
};
1819

1920
return (
20-
<MessageBody role='document' aria-roledescription={t('message_body')} dir='auto'>
21+
<MessageBody id={`${messageId}-content`} role='document' aria-roledescription={t('message_body')} dir='auto'>
2122
<Box display='flex' alignItems='center' fontSize='c2' color='hint'>
2223
<span
2324
tabIndex={0}

apps/meteor/client/components/message/variants/RoomMessage.tsx

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import MessageHeader from '../MessageHeader';
2121
import MessageToolbarHolder from '../MessageToolbarHolder';
2222
import StatusIndicators from '../StatusIndicators';
2323
import RoomMessageContent from './room/RoomMessageContent';
24+
import { useMessageListReadReceipts } from '../list/MessageListContext';
2425

2526
type RoomMessageProps = {
2627
message: IMessage & { ignored?: boolean };
@@ -34,6 +35,30 @@ type RoomMessageProps = {
3435
searchText?: string;
3536
} & ComponentProps<typeof Message>;
3637

38+
const getAriaLabelledBy = ({
39+
readReceiptEnabled,
40+
messageId,
41+
sequential,
42+
}: {
43+
readReceiptEnabled: boolean;
44+
messageId: string;
45+
sequential: boolean;
46+
}) => {
47+
const labels: string[] = [];
48+
49+
if (!sequential) {
50+
labels.push(`${messageId}-displayName`, `${messageId}-time`);
51+
}
52+
53+
labels.push(`${messageId}-content`);
54+
55+
if (readReceiptEnabled) {
56+
labels.push(`${messageId}-read-status`);
57+
}
58+
59+
return labels.join(' ');
60+
};
61+
3762
const RoomMessage = ({
3863
message,
3964
showUserAvatar,
@@ -58,6 +83,8 @@ const RoomMessage = ({
5883
const toggleSelected = useToggleSelect(message._id);
5984
const selected = useIsSelectedMessage(message._id);
6085

86+
const { enabled: readReceiptEnabled } = useMessageListReadReceipts();
87+
6188
useCountSelected();
6289
const messageRef = useJumpToMessage(message._id);
6390

@@ -68,7 +95,7 @@ const RoomMessage = ({
6895
role='listitem'
6996
aria-roledescription={t('message')}
7097
tabIndex={0}
71-
aria-labelledby={`${message._id}-displayName ${message._id}-time ${message._id}-content ${message._id}-read-status`}
98+
aria-labelledby={getAriaLabelledBy({ readReceiptEnabled, messageId: message._id, sequential })}
7299
onClick={selecting ? toggleSelected : undefined}
73100
isSelected={selected}
74101
isEditing={editing}
@@ -101,7 +128,7 @@ const RoomMessage = ({
101128
<MessageContainer>
102129
{!sequential && <MessageHeader message={message} />}
103130
{ignored ? (
104-
<IgnoredContent onShowMessageIgnored={toggleDisplayIgnoredMessage} />
131+
<IgnoredContent messageId={message._id} onShowMessageIgnored={toggleDisplayIgnoredMessage} />
105132
) : (
106133
<RoomMessageContent message={message} unread={unread} mention={mention} all={all} searchText={searchText} />
107134
)}

apps/meteor/client/components/message/variants/ThreadMessage.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ const ThreadMessage = ({ message, sequential, unread, showUserAvatar }: ThreadMe
7070
<MessageContainer>
7171
{!sequential && <MessageHeader message={message} />}
7272

73-
{ignored ? <IgnoredContent onShowMessageIgnored={toggleIgnoring} /> : <ThreadMessageContent message={message} />}
73+
{ignored ? (
74+
<IgnoredContent messageId={message._id} onShowMessageIgnored={toggleIgnoring} />
75+
) : (
76+
<ThreadMessageContent message={message} />
77+
)}
7478
</MessageContainer>
7579
{!message.private && <MessageToolbarHolder message={message} context={messageContext} />}
7680
</Message>

0 commit comments

Comments
 (0)