From 212233cb0b9127c95966492175a730d5b954690f Mon Sep 17 00:00:00 2001 From: Hanadi Date: Mon, 14 Nov 2022 10:11:37 +0100 Subject: [PATCH] Fix: inline links selecting radio button (#9543) * fix: inline link selecting radio button --- .../tabs/room/NotificationSettingsTab.tsx | 6 +- .../room/NotificationSettingsTab-test.tsx | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx diff --git a/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx b/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx index 2ac282654a..76e8bee812 100644 --- a/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx @@ -19,7 +19,7 @@ import { logger } from "matrix-js-sdk/src/logger"; import { _t } from "../../../../../languageHandler"; import { MatrixClientPeg } from "../../../../../MatrixClientPeg"; -import AccessibleButton from "../../../elements/AccessibleButton"; +import AccessibleButton, { ButtonEvent } from "../../../elements/AccessibleButton"; import Notifier from "../../../../../Notifier"; import SettingsStore from '../../../../../settings/SettingsStore'; import { SettingLevel } from "../../../../../settings/SettingLevel"; @@ -163,7 +163,9 @@ export default class NotificationsSettingsTab extends React.Component { + private onOpenSettingsClick = (event: ButtonEvent) => { + // avoid selecting the radio button + event.preventDefault(); this.props.closeSettingsFn(); defaultDispatcher.dispatch({ action: Action.ViewUserSettings, diff --git a/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx b/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx new file mode 100644 index 0000000000..a48a7fc135 --- /dev/null +++ b/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx @@ -0,0 +1,58 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; +import { render, RenderResult } from "@testing-library/react"; +import { MatrixClient } from "matrix-js-sdk/src/client"; +import userEvent from "@testing-library/user-event"; + +import NotificationSettingsTab from "../../../../../../src/components/views/settings/tabs/room/NotificationSettingsTab"; +import { mkStubRoom, stubClient } from "../../../../../test-utils"; +import { MatrixClientPeg } from "../../../../../../src/MatrixClientPeg"; +import { EchoChamber } from "../../../../../../src/stores/local-echo/EchoChamber"; +import { RoomEchoChamber } from "../../../../../../src/stores/local-echo/RoomEchoChamber"; + +describe("NotificatinSettingsTab", () => { + const roomId = "!room:example.com"; + let cli: MatrixClient; + let roomProps: RoomEchoChamber; + + const renderTab = (): RenderResult => { + return render( { }} />); + }; + + beforeEach(() => { + stubClient(); + cli = MatrixClientPeg.get(); + const room = mkStubRoom(roomId, "test room", cli); + roomProps = EchoChamber.forRoom(room); + + NotificationSettingsTab.contextType = React.createContext(cli); + }); + + it("should prevent »Settings« link click from bubbling up to radio buttons", async () => { + const tab = renderTab(); + + // settings link of mentions_only volume + const settingsLink = tab.container.querySelector( + "label.mx_NotificationSettingsTab_mentionsKeywordsEntry div.mx_AccessibleButton"); + if (!settingsLink) throw new Error("settings link does not exist."); + + await userEvent.click(settingsLink); + + expect(roomProps.notificationVolume).not.toBe("mentions_only"); + }); +});