You've already forked matrix-react-sdk
mirror of
https://github.com/matrix-org/matrix-react-sdk.git
synced 2025-07-28 15:22:05 +03:00
Fix closing all modals (#12728)
* Fix closing all modals We used `Modal.closeCurrentModal()` in a bunch of places, in all cases (as far as I can see: it wasn't commented) we meant to close all open modals. This swaps that function for one that closes all open modals. Also types the close reason which claimed to be something in a comment, of course, was wrong because a load of places passed their own random string which was never used. * Force close modals * Try with minimal changes * Already had a method for this * Add test * More tests * Unused importsd
This commit is contained in:
32
test/Modal-test.ts
Normal file
32
test/Modal-test.ts
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
Copyright 2024 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 Modal from "../src/Modal";
|
||||
import QuestionDialog from "../src/components/views/dialogs/QuestionDialog";
|
||||
|
||||
describe("Modal", () => {
|
||||
test("forceCloseAllModals should close all open modals", () => {
|
||||
Modal.createDialog(QuestionDialog, {
|
||||
title: "Test dialog",
|
||||
description: "This is a test dialog",
|
||||
button: "Word",
|
||||
});
|
||||
|
||||
expect(Modal.hasDialogs()).toBe(true);
|
||||
Modal.forceCloseAllModals();
|
||||
expect(Modal.hasDialogs()).toBe(false);
|
||||
});
|
||||
});
|
@ -31,6 +31,7 @@ import defaultDispatcher from "../../../src/dispatcher/dispatcher";
|
||||
import SettingsStore from "../../../src/settings/SettingsStore";
|
||||
import { SettingLevel } from "../../../src/settings/SettingLevel";
|
||||
import { Action } from "../../../src/dispatcher/actions";
|
||||
import Modal from "../../../src/Modal";
|
||||
|
||||
describe("<LoggedInView />", () => {
|
||||
const userId = "@alice:domain.org";
|
||||
@ -398,4 +399,22 @@ describe("<LoggedInView />", () => {
|
||||
await userEvent.keyboard("{Control>}f{/Control}");
|
||||
expect(defaultDispatcher.fire).toHaveBeenCalledWith(Action.FocusMessageSearch);
|
||||
});
|
||||
|
||||
it("should go home on home shortcut", async () => {
|
||||
jest.spyOn(defaultDispatcher, "dispatch");
|
||||
|
||||
getComponent();
|
||||
await userEvent.keyboard("{Control>}{Alt>}h</Alt>{/Control}");
|
||||
expect(defaultDispatcher.dispatch).toHaveBeenCalledWith({ action: Action.ViewHomePage });
|
||||
});
|
||||
|
||||
it("should ignore home shortcut if dialogs are open", async () => {
|
||||
jest.spyOn(defaultDispatcher, "dispatch");
|
||||
jest.spyOn(Modal, "hasDialogs").mockReturnValue(true);
|
||||
|
||||
getComponent();
|
||||
|
||||
await userEvent.keyboard("{Control>}{Alt>}h</Alt>{/Control}");
|
||||
expect(defaultDispatcher.dispatch).not.toHaveBeenCalledWith({ action: Action.ViewHomePage });
|
||||
});
|
||||
});
|
||||
|
@ -36,7 +36,7 @@ import { mkMessage, stubClient } from "../../../test-utils/test-utils";
|
||||
import { shouldShowComponent } from "../../../../src/customisations/helpers/UIComponents";
|
||||
import { UIComponent } from "../../../../src/settings/UIFeature";
|
||||
import SettingsStore from "../../../../src/settings/SettingsStore";
|
||||
import Modal from "../../../../src/Modal";
|
||||
import { clearAllModals } from "../../../test-utils";
|
||||
|
||||
jest.mock("../../../../src/customisations/helpers/UIComponents", () => ({
|
||||
shouldShowComponent: jest.fn(),
|
||||
@ -90,8 +90,8 @@ describe("RoomGeneralContextMenu", () => {
|
||||
onFinished = jest.fn();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
Modal.closeCurrentModal("force");
|
||||
afterEach(async () => {
|
||||
await clearAllModals();
|
||||
});
|
||||
|
||||
it("renders an empty context menu for archived rooms", async () => {
|
||||
|
@ -25,6 +25,7 @@ import { mocked, Mocked } from "jest-mock";
|
||||
import InviteDialog from "../../../../src/components/views/dialogs/InviteDialog";
|
||||
import { InviteKind } from "../../../../src/components/views/dialogs/InviteDialogTypes";
|
||||
import {
|
||||
clearAllModals,
|
||||
filterConsole,
|
||||
flushPromises,
|
||||
getMockClientWithEventEmitter,
|
||||
@ -40,7 +41,6 @@ import { SdkContextClass } from "../../../../src/contexts/SDKContext";
|
||||
import { IProfileInfo } from "../../../../src/hooks/useProfileInfo";
|
||||
import { DirectoryMember, startDmOnFirstMessage } from "../../../../src/utils/direct-messages";
|
||||
import SettingsStore from "../../../../src/settings/SettingsStore";
|
||||
import Modal from "../../../../src/Modal";
|
||||
|
||||
const mockGetAccessToken = jest.fn().mockResolvedValue("getAccessToken");
|
||||
jest.mock("../../../../src/IdentityAuthClient", () =>
|
||||
@ -178,8 +178,8 @@ describe("InviteDialog", () => {
|
||||
SdkContextClass.instance.client = mockClient;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
Modal.closeCurrentModal();
|
||||
afterEach(async () => {
|
||||
await clearAllModals();
|
||||
SdkContextClass.instance.onLoggedOut();
|
||||
SdkContextClass.instance.client = undefined;
|
||||
});
|
||||
|
@ -204,7 +204,7 @@ export const clearAllModals = async (): Promise<void> => {
|
||||
// Prevent modals from leaking and polluting other tests
|
||||
let keepClosingModals = true;
|
||||
while (keepClosingModals) {
|
||||
keepClosingModals = Modal.closeCurrentModal("End of test (clean-up)");
|
||||
keepClosingModals = Modal.closeCurrentModal();
|
||||
|
||||
// Then wait for the screen to update (probably React rerender and async/await).
|
||||
// Important for tests using Jest fake timers to not get into an infinite loop
|
||||
|
Reference in New Issue
Block a user