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

Close any open modals on logout #12777

Merged
merged 4 commits into from
Jul 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion src/Modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ import { IDeferred, defer, sleep } from "matrix-js-sdk/src/utils";
import { TypedEventEmitter } from "matrix-js-sdk/src/matrix";
import { Glass } from "@vector-im/compound-web";

import dis from "./dispatcher/dispatcher";
import dis, { defaultDispatcher } from "./dispatcher/dispatcher";
import AsyncWrapper from "./AsyncWrapper";
import { Defaultize } from "./@types/common";
import { ActionPayload } from "./dispatcher/payloads";

const DIALOG_CONTAINER_ID = "mx_Dialog_Container";
const STATIC_DIALOG_CONTAINER_ID = "mx_Dialog_StaticContainer";
Expand Down Expand Up @@ -114,6 +115,21 @@ export class ModalManager extends TypedEventEmitter<ModalManagerEvent, HandlerMa
return container;
}

public constructor() {
super();

// We never unregister this, but the Modal class is a singleton so there would
// never be an opportunity to do so anyway, except in the entirely theoretical
// scenario of instantiating a non-singleton instance of the Modal class.
defaultDispatcher.register(this.onAction);
}

private onAction = (payload: ActionPayload): void => {
if (payload.action === "logout") {
this.forceCloseAllModals();
}
};

public toggleCurrentDialogVisibility(): void {
const modal = this.getCurrentModal();
if (!modal) return;
Expand Down
25 changes: 25 additions & 0 deletions test/Modal-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ limitations under the License.

import Modal from "../src/Modal";
import QuestionDialog from "../src/components/views/dialogs/QuestionDialog";
import defaultDispatcher from "../src/dispatcher/dispatcher";

describe("Modal", () => {
test("forceCloseAllModals should close all open modals", () => {
Expand All @@ -29,4 +30,28 @@ describe("Modal", () => {
Modal.forceCloseAllModals();
expect(Modal.hasDialogs()).toBe(false);
});

test("open modals should be closed on logout", () => {
const modal1OnFinished = jest.fn();
const modal2OnFinished = jest.fn();

Modal.createDialog(QuestionDialog, {
title: "Test dialog 1",
description: "This is a test dialog",
button: "Word",
onFinished: modal1OnFinished,
});

Modal.createDialog(QuestionDialog, {
title: "Test dialog 2",
description: "This is a test dialog",
button: "Word",
onFinished: modal2OnFinished,
});

defaultDispatcher.dispatch({ action: "logout" }, true);

expect(modal1OnFinished).toHaveBeenCalled();
expect(modal2OnFinished).toHaveBeenCalled();
});
});
Loading