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

Commit caef3c1

Browse files
authored
Tooltip: improve accessibility in room (#12493)
* Migrate to `AccessibleButton` * Update snapshots * Update snapshots
1 parent 18ef971 commit caef3c1

File tree

10 files changed

+38
-69
lines changed

10 files changed

+38
-69
lines changed

res/css/views/rooms/_RoomBreadcrumbs.pcss

-5
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,3 @@ limitations under the License.
4949
height: 32px;
5050
}
5151
}
52-
53-
.mx_RoomBreadcrumbs_Tooltip {
54-
margin-left: -42px;
55-
margin-top: -42px;
56-
}

src/components/views/rooms/CollapsibleButton.tsx

+2-8
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import React, { ComponentProps, useContext } from "react";
1818
import classNames from "classnames";
1919

2020
import AccessibleButton from "../elements/AccessibleButton";
21-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
2221
import { OverflowMenuContext } from "./MessageComposerButtons";
2322
import { IconizedContextMenuOption } from "../context_menus/IconizedContextMenu";
2423
import { Ref } from "../../../accessibility/roving/types";
@@ -43,13 +42,8 @@ export const CollapsibleButton: React.FC<Props> = ({
4342
}
4443

4544
return (
46-
<AccessibleTooltipButton
47-
{...props}
48-
title={title}
49-
className={classNames(className, iconClassName)}
50-
ref={inputRef}
51-
>
45+
<AccessibleButton {...props} title={title} className={classNames(className, iconClassName)} ref={inputRef}>
5246
{children}
53-
</AccessibleTooltipButton>
47+
</AccessibleButton>
5448
);
5549
};

src/components/views/rooms/LegacyRoomHeader.tsx

+21-23
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import RoomHeaderButtons from "../right_panel/LegacyRoomHeaderButtons";
3333
import E2EIcon from "./E2EIcon";
3434
import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar";
3535
import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton";
36-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
3736
import RoomTopic from "../elements/RoomTopic";
3837
import RoomName from "../elements/RoomName";
3938
import { E2EStatus } from "../../../utils/ShieldUtils";
@@ -68,7 +67,6 @@ import IconizedContextMenu, {
6867
} from "../context_menus/IconizedContextMenu";
6968
import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
7069
import { SessionDuration } from "../voip/CallDuration";
71-
import { Alignment } from "../elements/Tooltip";
7270
import RoomCallBanner from "../beacon/RoomCallBanner";
7371
import { shouldShowComponent } from "../../../customisations/helpers/UIComponents";
7472
import { UIComponent } from "../../../settings/UIFeature";
@@ -111,12 +109,12 @@ const VoiceCallButton: FC<VoiceCallButtonProps> = ({ room, busy, setBusy, behavi
111109
}, [behavior, room, setBusy]);
112110

113111
return (
114-
<AccessibleTooltipButton
112+
<AccessibleButton
115113
className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_voiceCallButton"
116114
onClick={onClick}
117-
title={_t("voip|voice_call")}
118-
tooltip={tooltip ?? _t("voip|voice_call")}
119-
alignment={Alignment.Bottom}
115+
aria-label={_t("voip|voice_call")}
116+
title={tooltip ?? _t("voip|voice_call")}
117+
placement="bottom"
120118
disabled={disabled || busy}
121119
/>
122120
);
@@ -237,13 +235,13 @@ const VideoCallButton: FC<VideoCallButtonProps> = ({ room, busy, setBusy, behavi
237235

238236
return (
239237
<>
240-
<AccessibleTooltipButton
238+
<AccessibleButton
241239
ref={buttonRef}
242240
className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_videoCallButton"
243241
onClick={onClick}
244-
title={_t("voip|video_call")}
245-
tooltip={tooltip ?? _t("voip|video_call")}
246-
alignment={Alignment.Bottom}
242+
aria-label={_t("voip|video_call")}
243+
title={tooltip ?? _t("voip|video_call")}
244+
placement="bottom"
247245
disabled={disabled || busy}
248246
/>
249247
{menu}
@@ -442,15 +440,15 @@ const CallLayoutSelector: FC<CallLayoutSelectorProps> = ({ call }) => {
442440

443441
return (
444442
<>
445-
<AccessibleTooltipButton
443+
<AccessibleButton
446444
ref={buttonRef}
447445
className={classNames("mx_LegacyRoomHeader_button", {
448446
"mx_LegacyRoomHeader_layoutButton--freedom": layout === Layout.Tile,
449447
"mx_LegacyRoomHeader_layoutButton--spotlight": layout === Layout.Spotlight,
450448
})}
451449
onClick={onClick}
452450
title={_t("room|header|video_call_ec_change_layout")}
453-
alignment={Alignment.Bottom}
451+
placement="bottom"
454452
key="layout"
455453
/>
456454
{menu}
@@ -600,19 +598,19 @@ export default class RoomHeader extends React.Component<IProps, IState> {
600598

601599
if (!this.props.viewingCall && this.props.onForgetClick) {
602600
startButtons.push(
603-
<AccessibleTooltipButton
601+
<AccessibleButton
604602
className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_forgetButton"
605603
onClick={this.props.onForgetClick}
606604
title={_t("room|header|forget_room_button")}
607-
alignment={Alignment.Bottom}
605+
placement="bottom"
608606
key="forget"
609607
/>,
610608
);
611609
}
612610

613611
if (!this.props.viewingCall && this.props.onAppsClick) {
614612
startButtons.push(
615-
<AccessibleTooltipButton
613+
<AccessibleButton
616614
className={classNames("mx_LegacyRoomHeader_button mx_LegacyRoomHeader_appsButton", {
617615
mx_LegacyRoomHeader_appsButton_highlight: this.props.appsShown,
618616
})}
@@ -623,31 +621,31 @@ export default class RoomHeader extends React.Component<IProps, IState> {
623621
: _t("room|header|show_widgets_button")
624622
}
625623
aria-checked={this.props.appsShown}
626-
alignment={Alignment.Bottom}
624+
placement="bottom"
627625
key="apps"
628626
/>,
629627
);
630628
}
631629

632630
if (!this.props.viewingCall && this.props.onSearchClick && this.props.inRoom) {
633631
startButtons.push(
634-
<AccessibleTooltipButton
632+
<AccessibleButton
635633
className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_searchButton"
636634
onClick={this.props.onSearchClick}
637635
title={_t("action|search")}
638-
alignment={Alignment.Bottom}
636+
placement="bottom"
639637
key="search"
640638
/>,
641639
);
642640
}
643641

644642
if (this.props.onInviteClick && (!this.props.viewingCall || isVideoRoom) && this.props.inRoom) {
645643
startButtons.push(
646-
<AccessibleTooltipButton
644+
<AccessibleButton
647645
className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_inviteButton"
648646
onClick={this.props.onInviteClick}
649647
title={_t("action|invite")}
650-
alignment={Alignment.Bottom}
648+
placement="bottom"
651649
key="invite"
652650
/>,
653651
);
@@ -667,11 +665,11 @@ export default class RoomHeader extends React.Component<IProps, IState> {
667665
);
668666
} else {
669667
endButtons.push(
670-
<AccessibleTooltipButton
668+
<AccessibleButton
671669
className="mx_LegacyRoomHeader_button mx_LegacyRoomHeader_minimiseButton"
672670
onClick={this.onHideCallClick}
673671
title={_t("room|header|video_room_view_chat_button")}
674-
alignment={Alignment.Bottom}
672+
placement="bottom"
675673
key="minimise"
676674
/>,
677675
);
@@ -754,7 +752,7 @@ export default class RoomHeader extends React.Component<IProps, IState> {
754752
onClick={this.onContextMenuOpenClick}
755753
isExpanded={!!this.state.contextMenuPosition}
756754
title={_t("room|context_menu|title")}
757-
alignment={Alignment.Bottom}
755+
placement="bottom"
758756
>
759757
{roomName}
760758
{this.props.room && <div className="mx_LegacyRoomHeader_chevron" />}

src/components/views/rooms/PinnedEventTile.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import { _t } from "../../../languageHandler";
2727
import { formatDate } from "../../../DateUtils";
2828
import MatrixClientContext from "../../../contexts/MatrixClientContext";
2929
import { getUserNameColorClass } from "../../../utils/FormattingUtils";
30-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
3130
import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
3231
import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks";
3332

@@ -76,7 +75,7 @@ export default class PinnedEventTile extends React.Component<IProps> {
7675
let unpinButton: JSX.Element | undefined;
7776
if (this.props.onUnpinClicked) {
7877
unpinButton = (
79-
<AccessibleTooltipButton
78+
<AccessibleButton
8079
onClick={this.props.onUnpinClicked}
8180
className="mx_PinnedEventTile_unpinButton"
8281
title={_t("action|unpin")}

src/components/views/rooms/RoomBreadcrumbs.tsx

+4-5
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ import { UPDATE_EVENT } from "../../../stores/AsyncStore";
2626
import { useRovingTabIndex } from "../../../accessibility/RovingTabIndex";
2727
import Toolbar from "../../../accessibility/Toolbar";
2828
import { Action } from "../../../dispatcher/actions";
29-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
3029
import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload";
31-
import { ButtonEvent } from "../elements/AccessibleButton";
30+
import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton";
3231

3332
interface IProps {}
3433

@@ -47,15 +46,15 @@ const RoomBreadcrumbTile: React.FC<{ room: Room; onClick: (ev: ButtonEvent) => v
4746
const [onFocus, isActive, ref] = useRovingTabIndex();
4847

4948
return (
50-
<AccessibleTooltipButton
49+
<AccessibleButton
5150
className="mx_RoomBreadcrumbs_crumb"
5251
onClick={onClick}
5352
aria-label={_t("a11y|room_name", { name: room.name })}
5453
title={room.name}
55-
tooltipClassName="mx_RoomBreadcrumbs_Tooltip"
5654
onFocus={onFocus}
5755
ref={ref}
5856
tabIndex={isActive ? 0 : -1}
57+
placement="right"
5958
>
6059
<DecoratedRoomAvatar
6160
room={room}
@@ -64,7 +63,7 @@ const RoomBreadcrumbTile: React.FC<{ room: Room; onClick: (ev: ButtonEvent) => v
6463
hideIfDot={true}
6564
tooltipProps={{ tabIndex: isActive ? 0 : -1 }}
6665
/>
67-
</AccessibleTooltipButton>
66+
</AccessibleButton>
6867
);
6968
};
7069

src/components/views/rooms/RoomList.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ import IconizedContextMenu, {
5757
IconizedContextMenuOption,
5858
IconizedContextMenuOptionList,
5959
} from "../context_menus/IconizedContextMenu";
60-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
6160
import ExtraTile from "./ExtraTile";
6261
import RoomSublist, { IAuxButtonProps } from "./RoomSublist";
6362
import { SdkContextClass } from "../../../contexts/SDKContext";
63+
import AccessibleButton from "../elements/AccessibleButton";
6464

6565
interface IProps {
6666
onKeyDown: (ev: React.KeyboardEvent, state: IRovingTabIndexState) => void;
@@ -185,7 +185,7 @@ const DmAuxButton: React.FC<IAuxButtonProps> = ({ tabIndex, dispatcher = default
185185
);
186186
} else if (!activeSpace && showCreateRooms) {
187187
return (
188-
<AccessibleTooltipButton
188+
<AccessibleButton
189189
tabIndex={tabIndex}
190190
onClick={(e) => {
191191
dispatcher.dispatch({ action: "view_create_chat" });

src/components/views/rooms/RoomSublist.tsx

+2-8
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ import ContextMenu, {
4949
StyledMenuItemRadio,
5050
} from "../../structures/ContextMenu";
5151
import AccessibleButton, { ButtonEvent } from "../../views/elements/AccessibleButton";
52-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
5352
import ExtraTile from "./ExtraTile";
5453
import SettingsStore from "../../../settings/SettingsStore";
5554
import { SlidingSyncManager } from "../../../SlidingSyncManager";
@@ -684,11 +683,6 @@ export default class RoomSublist extends React.Component<IProps, IState> {
684683

685684
const badgeContainer = <div className="mx_RoomSublist_badgeContainer">{badge}</div>;
686685

687-
let Button: React.ComponentType<React.ComponentProps<typeof AccessibleButton>> = AccessibleButton;
688-
if (this.props.isMinimized) {
689-
Button = AccessibleTooltipButton;
690-
}
691-
692686
// Note: the addRoomButton conditionally gets moved around
693687
// the DOM depending on whether or not the list is minimized.
694688
// If we're minimized, we want it below the header so it
@@ -707,7 +701,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
707701
>
708702
<div className="mx_RoomSublist_stickableContainer">
709703
<div className="mx_RoomSublist_stickable">
710-
<Button
704+
<AccessibleButton
711705
onFocus={onFocus}
712706
ref={ref}
713707
tabIndex={tabIndex}
@@ -719,7 +713,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
719713
>
720714
<span className={collapseClasses} />
721715
<span id={getLabelId(this.props.tagId)}>{this.props.label}</span>
722-
</Button>
716+
</AccessibleButton>
723717
{this.renderMenu()}
724718
{this.props.isMinimized ? null : badgeContainer}
725719
{this.props.isMinimized ? null : addRoomButton}

src/components/views/rooms/RoomTile.tsx

+3-13
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import NotificationBadge from "./NotificationBadge";
3737
import { ActionPayload } from "../../../dispatcher/payloads";
3838
import { RoomNotificationStateStore } from "../../../stores/notifications/RoomNotificationStateStore";
3939
import { NotificationState, NotificationStateEvents } from "../../../stores/notifications/NotificationState";
40-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
4140
import { EchoChamber } from "../../../stores/local-echo/EchoChamber";
4241
import { CachedRoomKey, RoomEchoChamber } from "../../../stores/local-echo/RoomEchoChamber";
4342
import { PROPERTY_UPDATED } from "../../../stores/local-echo/GenericEchoChamber";
@@ -464,21 +463,11 @@ export class RoomTile extends React.PureComponent<ClassProps, State> {
464463
ariaDescribedBy = messagePreviewId(this.props.room.roomId);
465464
}
466465

467-
const props: Partial<React.ComponentProps<typeof AccessibleTooltipButton>> = {};
468-
let Button: React.ComponentType<React.ComponentProps<typeof AccessibleButton>> = AccessibleButton;
469-
if (this.props.isMinimized) {
470-
Button = AccessibleTooltipButton;
471-
props.title = name;
472-
// force the tooltip to hide whilst we are showing the context menu
473-
props.forceHide = !!this.state.generalMenuPosition;
474-
}
475-
476466
return (
477467
<React.Fragment>
478468
<RovingTabIndexWrapper inputRef={this.roomTileRef}>
479469
{({ onFocus, isActive, ref }) => (
480-
<Button
481-
{...props}
470+
<AccessibleButton
482471
onFocus={onFocus}
483472
tabIndex={isActive ? 0 : -1}
484473
ref={ref}
@@ -489,6 +478,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> {
489478
aria-label={ariaLabel}
490479
aria-selected={this.state.selected}
491480
aria-describedby={ariaDescribedBy}
481+
title={this.props.isMinimized && !this.state.generalMenuPosition ? name : undefined}
492482
>
493483
<DecoratedRoomAvatar
494484
room={this.props.room}
@@ -500,7 +490,7 @@ export class RoomTile extends React.PureComponent<ClassProps, State> {
500490
{badge}
501491
{this.renderGeneralMenu()}
502492
{this.renderNotificationsMenu(isActive)}
503-
</Button>
493+
</AccessibleButton>
504494
)}
505495
</RovingTabIndexWrapper>
506496
</React.Fragment>

src/components/views/rooms/VoiceRecordComposerTile.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { Room, IEventRelation, MatrixEvent } from "matrix-js-sdk/src/matrix";
1919
import { logger } from "matrix-js-sdk/src/logger";
2020
import { Optional } from "matrix-events-sdk";
2121

22-
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
2322
import { _t } from "../../../languageHandler";
2423
import { RecordingState } from "../../../audio/VoiceRecording";
2524
import { MatrixClientPeg } from "../../../MatrixClientPeg";
@@ -44,6 +43,7 @@ import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks";
4443
import RoomContext from "../../../contexts/RoomContext";
4544
import { IUpload, VoiceMessageRecording } from "../../../audio/VoiceMessageRecording";
4645
import { createVoiceMessageContent } from "../../../utils/createVoiceMessageContent";
46+
import AccessibleButton from "../elements/AccessibleButton";
4747

4848
interface IProps {
4949
room: Room;
@@ -271,7 +271,7 @@ export default class VoiceRecordComposerTile extends React.PureComponent<IProps,
271271
}
272272

273273
stopBtn = (
274-
<AccessibleTooltipButton
274+
<AccessibleButton
275275
className="mx_VoiceRecordComposerTile_stop"
276276
onClick={this.onRecordStartEndClick}
277277
title={tooltip}
@@ -284,7 +284,7 @@ export default class VoiceRecordComposerTile extends React.PureComponent<IProps,
284284

285285
if (this.state.recorder && this.state.recordingPhase !== RecordingState.Uploading) {
286286
deleteButton = (
287-
<AccessibleTooltipButton
287+
<AccessibleButton
288288
className="mx_VoiceRecordComposerTile_delete"
289289
title={_t("action|delete")}
290290
onClick={this.onCancel}

0 commit comments

Comments
 (0)