From e8c88918cbb2c2c713bce518cbcd4807d46f510c Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Fri, 22 Aug 2025 16:10:42 +0100 Subject: [PATCH] Show a "progress" dialog while invites are being sent (#30561) * InviteDialog: show some words and a spinner while invites are being sent * MultiInviter-test: avoid building unhandled rejected promises If we don't handle rejected promises, jest gets confused by them. Instead, let's create them on-demand. * Open a "progress" dialog while invites are being sent * Inhibit invite progress dialog when RoomUpgradeWarning dialog is kept open ... otherwise the `RoomUpgradeWarning` dialog disappears during the invites, and the tests that assert that it is showing the correct thing fail. enter the commit message for your changes. Lines starting * Switch to compound CSS variables instead of old pcss vars * update playwright screenshots * Revert "update playwright screenshots" This reverts commit b0a15d97f35a088fe5b67009085eab46be1316fd. * Another go at updating screenshots * Address review comments * remove redundant Props --- .../invite-dialog-dm-without-user-linux.png | Bin 47788 -> 47978 bytes res/css/_components.pcss | 1 + res/css/views/dialogs/_InviteDialog.pcss | 15 +-- .../views/dialogs/_InviteProgressBody.pcss | 16 ++++ src/components/views/dialogs/InviteDialog.tsx | 27 +++--- .../views/dialogs/InviteProgressBody.tsx | 24 +++++ .../views/dialogs/InviteProgressDialog.tsx | 38 ++++++++ .../views/settings/JoinRuleSettings.tsx | 19 +++- src/i18n/strings/en_EN.json | 4 + src/utils/MultiInviter.ts | 87 +++++++++++------- src/utils/RoomUpgrade.ts | 21 +++-- .../views/dialogs/InviteDialog-test.tsx | 13 +++ .../views/dialogs/InviteProgressBody-test.tsx | 18 ++++ .../InviteProgressBody-test.tsx.snap | 23 +++++ test/unit-tests/utils/MultiInviter-test.ts | 46 ++++++--- 15 files changed, 271 insertions(+), 81 deletions(-) create mode 100644 res/css/views/dialogs/_InviteProgressBody.pcss create mode 100644 src/components/views/dialogs/InviteProgressBody.tsx create mode 100644 src/components/views/dialogs/InviteProgressDialog.tsx create mode 100644 test/unit-tests/components/views/dialogs/InviteProgressBody-test.tsx create mode 100644 test/unit-tests/components/views/dialogs/__snapshots__/InviteProgressBody-test.tsx.snap diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-without-user-linux.png b/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-without-user-linux.png index 86cb11aad9a9527642c3dfe1ec18c6d77a897b29..f463282be77169a54e275344516f911e626dc9d6 100644 GIT binary patch literal 47978 zcmb5WWk4HGxV~M577Daz@d5>kyKA8ocXuf68eB_(;>8^b1PksE9Ew|kpdkd8;I0XO z`a9=*f8UQg`|Qj;vm^IjnMs6-k~9_u3C5ErPq1WVzNkHU^8D?SC(qJeJ$p>C$B8I= z^5pFk*)N|pyt4L@uf^4^^2GuuKTy3+tEK}E=KsNXDfj{%GhOv9iwR4gmWE@Wtq{AB zeyY;NOsNN0LBC<9(*vPKjK27-57kwnW{Wxd(j7yivWq-#jUY+t&1-#J+Sjj-Md_cu zpe3uvTnrGKg9bBi3s1N;I^}E+1zW6t$Sa{39*)evNJGg#EKN^e)y@1Kc#S>4yA~IR zJgI^EddHC8{hIHEIh410jlTE&SC5qd*Y*CfFuS=bLv4dr)~d4B%cG+Q`Ug0C?;_iO z;)*saXF0dxQ05DM_RsQidon+TIGqa->4$G}@>G{CP&VGD62rolD(d>8o9>e~TKW^*?lg37%QW1# zaN}f`!h)QBrmwI6pQ`TS8QZ2}pcC}M#Z6w`SiF`bKX)jpupA9%D1B-wh-d){eR$CN zSf!Wp;~n2)iPsmC){gdfJL?WY(~e8crar$t-&eA6UEmA}+@6cUpiK}cp2g-}^~SMP z>%AYn%0HEzM#)4EY=;Z9+Lg1JG%82zOF^t3_fV;qWBQ1L=!|zK;rUKD)GSY*Jn5>+ z>4f)64d9?SnE#yXJ5eJtfnVxswghp!28V@(ui$JSEr9`D>!z0fwA|CpFD%fG$CZ_J zqB;qP?l|$rAQR?N=taxk^5$Eqd$EQ;Zn3ATU@$0%@sidI#&tm(xDPo z{}UirYL69>1#_;5NAwE z*7f|_Q2j#S|2oK1Q+5x4N5aFK)X4Jk@@BF|mP{$+tL*G-Y>G}Zk#{^;Hm@IZrN9?C zhfs?Q$&FU+?@l5FFS5~C!+~_9h@4+(_yQL=vjKRt`2S>v1ik5s|J)Q0EDV6bM9B5p zPaKzBGpmQx?3}7<{)_ORFv+NdnBA^BdhTrv3KoWa=}EZYXH)*K*-^7Fn4(~031x6w zd)b|l<@dyDa~8su|GL>#Q>GXzOFB${gW7aRZ=VkMSl*LEvurdo&#U(6Kd><7AIy

f$Sc}u;D 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 QD!HVrp#B>9>fOix0c1(X8vp@bwGIQ9=9* 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 diff --git a/res/css/_components.pcss b/res/css/_components.pcss index b140fd1d7e..602885546e 100644 --- a/res/css/_components.pcss +++ b/res/css/_components.pcss @@ -142,6 +142,7 @@ @import "./views/dialogs/_GenericFeatureFeedbackDialog.pcss"; @import "./views/dialogs/_IncomingSasDialog.pcss"; @import "./views/dialogs/_InviteDialog.pcss"; +@import "./views/dialogs/_InviteProgressBody.pcss"; @import "./views/dialogs/_JoinRuleDropdown.pcss"; @import "./views/dialogs/_LeaveSpaceDialog.pcss"; @import "./views/dialogs/_LocationViewDialog.pcss"; diff --git a/res/css/views/dialogs/_InviteDialog.pcss b/res/css/views/dialogs/_InviteDialog.pcss index 70a8cdc608..0f952049cf 100644 --- a/res/css/views/dialogs/_InviteDialog.pcss +++ b/res/css/views/dialogs/_InviteDialog.pcss @@ -63,17 +63,6 @@ Please see LICENSE files in the repository root for full details. height: 25px; line-height: $font-25px; } - - .mx_InviteDialog_buttonAndSpinner { - .mx_Spinner { - /* Width and height are required to trick the layout engine. */ - width: 20px; - height: 20px; - margin-inline-start: 5px; - display: inline-block; - vertical-align: middle; - } - } } .mx_InviteDialog_section { @@ -218,6 +207,10 @@ Please see LICENSE files in the repository root for full details. flex-direction: column; flex-grow: 1; overflow: hidden; + + .mx_InviteProgressBody { + margin-top: var(--cpd-space-12x); + } } .mx_InviteDialog_transfer { diff --git a/res/css/views/dialogs/_InviteProgressBody.pcss b/res/css/views/dialogs/_InviteProgressBody.pcss new file mode 100644 index 0000000000..e3069a133c --- /dev/null +++ b/res/css/views/dialogs/_InviteProgressBody.pcss @@ -0,0 +1,16 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +.mx_InviteProgressBody { + text-align: center; + font: var(--cpd-font-body-lg-regular); + + h1 { + color: var(--cpd-color-text-primary); + font: var(--cpd-font-heading-sm-semibold); + } +} diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index c07cdf332b..73049122dc 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -40,7 +40,6 @@ import Field from "../elements/Field"; import TabbedView, { Tab, TabLocation } from "../../structures/TabbedView"; import Dialpad from "../voip/DialPad"; import QuestionDialog from "./QuestionDialog"; -import Spinner from "../elements/Spinner"; import BaseDialog from "./BaseDialog"; import DialPadBackspaceButton from "../elements/DialPadBackspaceButton"; import LegacyCallHandler from "../../../LegacyCallHandler"; @@ -65,6 +64,7 @@ import { UNKNOWN_PROFILE_ERRORS } from "../../../utils/MultiInviter"; import AskInviteAnywayDialog, { type UnknownProfiles } from "./AskInviteAnywayDialog"; import { SdkContextClass } from "../../../contexts/SDKContext"; import { type UserProfilesStore } from "../../../stores/UserProfilesStore"; +import InviteProgressBody from "./InviteProgressBody.tsx"; // we have a number of types defined from the Matrix spec which can't reasonably be altered here. /* eslint-disable camelcase */ @@ -329,8 +329,14 @@ interface IInviteDialogState { dialPadValue: string; currentTabId: TabId; - // These two flags are used for the 'Go' button to communicate what is going on. + /** + * True if we are sending the invites. + * + * We will grey out the action button, hide the suggestions, and display a spinner. + */ busy: boolean; + + /** Error from the last attempt to send invites. */ errorText?: string; } @@ -617,7 +623,10 @@ export default class InviteDialog extends React.PureComponent; - } - let helpText; let buttonText; let goButtonFn: (() => Promise) | null = null; @@ -1437,12 +1441,9 @@ export default class InviteDialog extends React.PureComponent{helpText}

{this.renderEditor()} -
- {goButton} - {spinner} -
+ {goButton}
- {this.renderSuggestions()} + {this.state.busy ? : this.renderSuggestions()} ); } diff --git a/src/components/views/dialogs/InviteProgressBody.tsx b/src/components/views/dialogs/InviteProgressBody.tsx new file mode 100644 index 0000000000..a61c0d5922 --- /dev/null +++ b/src/components/views/dialogs/InviteProgressBody.tsx @@ -0,0 +1,24 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import React from "react"; + +import InlineSpinner from "../elements/InlineSpinner"; +import { _t } from "../../../languageHandler"; + +/** The common body of components that show the progress of sending room invites. */ +const InviteProgressBody: React.FC = () => { + return ( +
+ +

{_t("invite|progress|preparing")}

+ {_t("invite|progress|dont_close")} +
+ ); +}; + +export default InviteProgressBody; diff --git a/src/components/views/dialogs/InviteProgressDialog.tsx b/src/components/views/dialogs/InviteProgressDialog.tsx new file mode 100644 index 0000000000..fe62afa8d8 --- /dev/null +++ b/src/components/views/dialogs/InviteProgressDialog.tsx @@ -0,0 +1,38 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import React from "react"; + +import Modal from "../../../Modal.tsx"; +import InviteProgressBody from "./InviteProgressBody.tsx"; + +/** A Modal dialog that pops up while room invites are being sent. */ +const InviteProgressDialog: React.FC = (_) => { + return ; +}; + +/** + * Open the invite progress dialog. + * + * Returns a callback which will close the dialog again. + */ +export function openInviteProgressDialog(): () => void { + const onBeforeClose = async (reason?: string): Promise => { + // Inhibit closing via background click + return reason != "backgroundClick"; + }; + + const { close } = Modal.createDialog( + InviteProgressDialog, + /* props */ {}, + /* className */ undefined, + /* isPriorityModal */ false, + /* isStaticModal */ false, + { onBeforeClose }, + ); + return close; +} diff --git a/src/components/views/settings/JoinRuleSettings.tsx b/src/components/views/settings/JoinRuleSettings.tsx index 43f8ab9ff6..400dc7a865 100644 --- a/src/components/views/settings/JoinRuleSettings.tsx +++ b/src/components/views/settings/JoinRuleSettings.tsx @@ -18,7 +18,7 @@ import SpaceStore from "../../../stores/spaces/SpaceStore"; import Modal from "../../../Modal"; import ManageRestrictedJoinRuleDialog from "../dialogs/ManageRestrictedJoinRuleDialog"; import RoomUpgradeWarningDialog, { type IFinishedOpts } from "../dialogs/RoomUpgradeWarningDialog"; -import { upgradeRoom } from "../../../utils/RoomUpgrade"; +import { type RoomUpgradeProgress, upgradeRoom } from "../../../utils/RoomUpgrade"; import { arrayHasDiff } from "../../../utils/arrays"; import { useLocalEcho } from "../../../hooks/useLocalEcho"; import dis from "../../../dispatcher/dispatcher"; @@ -120,7 +120,7 @@ const JoinRuleSettings: React.FC = ({ opts: IFinishedOpts, fn: (progressText: string, progress: number, total: number) => void, ): Promise => { - const roomId = await upgradeRoom(room, targetVersion, opts.invite, true, true, true, (progress) => { + const progressCallback = (progress: RoomUpgradeProgress): void => { const total = 2 + progress.updateSpacesTotal + progress.inviteUsersTotal; if (!progress.roomUpgraded) { fn(_t("room_settings|security|join_rule_upgrade_upgrading_room"), 0, total); @@ -151,7 +151,20 @@ const JoinRuleSettings: React.FC = ({ total, ); } - }); + }; + const roomId = await upgradeRoom( + room, + targetVersion, + opts.invite, + true, + true, + true, + progressCallback, + + // We want to keep the RoomUpgradeDialog open during the upgrade, so don't replace it with the + // invite progress dialog. + /* inhibitInviteProgressDialog: */ true, + ); closeSettingsFn?.(); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1c12f8e7ed..6aa127864c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1366,6 +1366,10 @@ "name_email_mxid_share_space": "Invite someone using their name, email address, username (like ) or share this space.", "name_mxid_share_room": "Invite someone using their name, username (like ) or share this room.", "name_mxid_share_space": "Invite someone using their name, username (like ) or share this space.", + "progress": { + "dont_close": "Do not close the app until finished.", + "preparing": "Preparing invitations..." + }, "recents_section": "Recent Conversations", "room_failed_partial": "We sent the others, but the below people couldn't be invited to ", "room_failed_partial_title": "Some invites couldn't be sent", diff --git a/src/utils/MultiInviter.ts b/src/utils/MultiInviter.ts index a41967b5d3..46fd84cc26 100644 --- a/src/utils/MultiInviter.ts +++ b/src/utils/MultiInviter.ts @@ -16,6 +16,7 @@ import Modal from "../Modal"; import SettingsStore from "../settings/SettingsStore"; import AskInviteAnywayDialog from "../components/views/dialogs/AskInviteAnywayDialog"; import ConfirmUserActionDialog from "../components/views/dialogs/ConfirmUserActionDialog"; +import { openInviteProgressDialog } from "../components/views/dialogs/InviteProgressDialog.tsx"; export enum InviteState { Invited = "invited", @@ -44,6 +45,12 @@ const USER_BANNED = "IO.ELEMENT.BANNED"; export interface MultiInviterOptions { /** Optional callback, fired after each invite */ progressCallback?: () => void; + + /** + * By default, we will pop up a "Preparing invitations..." dialog while the invites are being sent. Set this to + * `true` to inhibit it (in which case, you probably want to implement another bit of feedback UI). + */ + inhibitProgressDialog?: boolean; } /** @@ -88,49 +95,59 @@ export default class MultiInviter { this.addresses.push(...addresses); this.reason = reason; - for (const addr of this.addresses) { - if (getAddressType(addr) === null) { - this.completionStates[addr] = InviteState.Error; - this.errors[addr] = { - errcode: "M_INVALID", - errorText: _t("invite|invalid_address"), - }; - } + let closeDialog: (() => void) | undefined; + if (!this.options.inhibitProgressDialog) { + closeDialog = openInviteProgressDialog(); } - for (const addr of this.addresses) { - // don't try to invite it if it's an invalid address - // (it will already be marked as an error though, - // so no need to do so again) - if (getAddressType(addr) === null) { - continue; + try { + for (const addr of this.addresses) { + if (getAddressType(addr) === null) { + this.completionStates[addr] = InviteState.Error; + this.errors[addr] = { + errcode: "M_INVALID", + errorText: _t("invite|invalid_address"), + }; + } } - // don't re-invite (there's no way in the UI to do this, but - // for sanity's sake) - if (this.completionStates[addr] === InviteState.Invited) { - continue; + for (const addr of this.addresses) { + // don't try to invite it if it's an invalid address + // (it will already be marked as an error though, + // so no need to do so again) + if (getAddressType(addr) === null) { + continue; + } + + // don't re-invite (there's no way in the UI to do this, but + // for sanity's sake) + if (this.completionStates[addr] === InviteState.Invited) { + continue; + } + + await this.doInvite(addr, false); + + if (this._fatal) { + // `doInvite` suffered a fatal error. The error should have been recorded in `errors`; it's up + // to the caller to report back to the user. + return this.completionStates; + } } - await this.doInvite(addr, false); + if (Object.keys(this.errors).length > 0) { + // There were problems inviting some people - see if we can invite them + // without caring if they exist or not. + const unknownProfileUsers = Object.keys(this.errors).filter((a) => + UNKNOWN_PROFILE_ERRORS.includes(this.errors[a].errcode), + ); - if (this._fatal) { - // `doInvite` suffered a fatal error. The error should have been recorded in `errors`; it's up - // to the caller to report back to the user. - return this.completionStates; - } - } - - if (Object.keys(this.errors).length > 0) { - // There were problems inviting some people - see if we can invite them - // without caring if they exist or not. - const unknownProfileUsers = Object.keys(this.errors).filter((a) => - UNKNOWN_PROFILE_ERRORS.includes(this.errors[a].errcode), - ); - - if (unknownProfileUsers.length > 0) { - await this.handleUnknownProfileUsers(unknownProfileUsers); + if (unknownProfileUsers.length > 0) { + await this.handleUnknownProfileUsers(unknownProfileUsers); + } } + } finally { + // Remember to close the progress dialog, if we opened one. + closeDialog?.(); } return this.completionStates; diff --git a/src/utils/RoomUpgrade.ts b/src/utils/RoomUpgrade.ts index e4ccfdb7d0..0c476a2ddd 100644 --- a/src/utils/RoomUpgrade.ts +++ b/src/utils/RoomUpgrade.ts @@ -16,8 +16,9 @@ import { _t } from "../languageHandler"; import ErrorDialog from "../components/views/dialogs/ErrorDialog"; import SpaceStore from "../stores/spaces/SpaceStore"; import Spinner from "../components/views/elements/Spinner"; +import type { MultiInviterOptions } from "./MultiInviter"; -interface IProgress { +export interface RoomUpgradeProgress { roomUpgraded: boolean; roomSynced?: boolean; inviteUsersProgress?: number; @@ -50,7 +51,8 @@ export async function upgradeRoom( handleError = true, updateSpaces = true, awaitRoom = false, - progressCallback?: (progress: IProgress) => void, + progressCallback?: (progress: RoomUpgradeProgress) => void, + inhibitInviteProgressDialog = false, ): Promise { const cli = room.client; let spinnerModal: IHandle | undefined; @@ -77,7 +79,7 @@ export async function upgradeRoom( ) as Room[]; } - const progress: IProgress = { + const progress: RoomUpgradeProgress = { roomUpgraded: false, roomSynced: awaitRoom || inviteUsers ? false : undefined, inviteUsersProgress: inviteUsers ? 0 : undefined, @@ -112,9 +114,12 @@ export async function upgradeRoom( if (toInvite.length > 0) { // Errors are handled internally to this function - await inviteUsersToRoom(cli, newRoomId, toInvite, () => { - progress.inviteUsersProgress!++; - progressCallback?.(progress); + await inviteUsersToRoom(cli, newRoomId, toInvite, { + progressCallback: () => { + progress.inviteUsersProgress!++; + progressCallback?.(progress); + }, + inhibitProgressDialog: inhibitInviteProgressDialog, }); } @@ -150,9 +155,9 @@ async function inviteUsersToRoom( client: MatrixClient, roomId: string, userIds: string[], - progressCallback?: () => void, + inviteOptions: MultiInviterOptions, ): Promise { - const result = await inviteMultipleToRoom(client, roomId, userIds, { progressCallback }); + const result = await inviteMultipleToRoom(client, roomId, userIds, inviteOptions); const room = client.getRoom(roomId)!; showAnyInviteErrors(result.states, room, result.inviter); } diff --git a/test/unit-tests/components/views/dialogs/InviteDialog-test.tsx b/test/unit-tests/components/views/dialogs/InviteDialog-test.tsx index 8777d7cb80..2d7669a5dc 100644 --- a/test/unit-tests/components/views/dialogs/InviteDialog-test.tsx +++ b/test/unit-tests/components/views/dialogs/InviteDialog-test.tsx @@ -137,6 +137,7 @@ describe("InviteDialog", () => { supportsThreads: jest.fn().mockReturnValue(false), isInitialSyncComplete: jest.fn().mockReturnValue(true), getClientWellKnown: jest.fn().mockResolvedValue({}), + invite: jest.fn(), }); SdkConfig.put({ validated_server_config: {} as ValidatedServerConfig } as IConfigOptions); DMRoomMap.makeShared(mockClient); @@ -406,6 +407,18 @@ describe("InviteDialog", () => { expect(tile).toBeInTheDocument(); }); + describe("while the invite is in progress", () => { + it("should show a spinner", async () => { + mockClient.invite.mockReturnValue(new Promise(() => {})); + + render(); + await enterIntoSearchField(bobId); + await userEvent.click(screen.getByRole("button", { name: "Invite" })); + + await screen.findByText("Preparing invitations..."); + }); + }); + describe("when inviting a user with an unknown profile", () => { beforeEach(async () => { render(); diff --git a/test/unit-tests/components/views/dialogs/InviteProgressBody-test.tsx b/test/unit-tests/components/views/dialogs/InviteProgressBody-test.tsx new file mode 100644 index 0000000000..021a2fb6e7 --- /dev/null +++ b/test/unit-tests/components/views/dialogs/InviteProgressBody-test.tsx @@ -0,0 +1,18 @@ +/* +Copyright 2025 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import React from "react"; +import { render } from "jest-matrix-react"; + +import InviteProgressBody from "../../../../../src/components/views/dialogs/InviteProgressBody.tsx"; + +describe("InviteProgressBody", () => { + it("should match snapshot", () => { + const { asFragment } = render(); + expect(asFragment()).toMatchSnapshot(); + }); +}); diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/InviteProgressBody-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/InviteProgressBody-test.tsx.snap new file mode 100644 index 0000000000..cd849386e2 --- /dev/null +++ b/test/unit-tests/components/views/dialogs/__snapshots__/InviteProgressBody-test.tsx.snap @@ -0,0 +1,23 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`InviteProgressBody should match snapshot 1`] = ` + +
+
+
+
+

+ Preparing invitations... +

+ Do not close the app until finished. +
+ +`; diff --git a/test/unit-tests/utils/MultiInviter-test.ts b/test/unit-tests/utils/MultiInviter-test.ts index 8fcc673143..b898ea2a24 100644 --- a/test/unit-tests/utils/MultiInviter-test.ts +++ b/test/unit-tests/utils/MultiInviter-test.ts @@ -15,7 +15,7 @@ import Modal, { type ComponentType, type ComponentProps } from "../../../src/Mod import SettingsStore from "../../../src/settings/SettingsStore"; import MultiInviter, { type CompletionStates } from "../../../src/utils/MultiInviter"; import * as TestUtilsMatrix from "../../test-utils"; -import type AskInviteAnywayDialog from "../../../src/components/views/dialogs/AskInviteAnywayDialog"; +import AskInviteAnywayDialog from "../../../src/components/views/dialogs/AskInviteAnywayDialog"; import ConfirmUserActionDialog from "../../../src/components/views/dialogs/ConfirmUserActionDialog"; const ROOMID = "!room:server"; @@ -24,10 +24,14 @@ const MXID1 = "@user1:server"; const MXID2 = "@user2:server"; const MXID3 = "@user3:server"; -const MXID_PROFILE_STATES: Record> = { - [MXID1]: Promise.resolve({}), - [MXID2]: Promise.reject(new MatrixError({ errcode: "M_FORBIDDEN" })), - [MXID3]: Promise.reject(new MatrixError({ errcode: "M_NOT_FOUND" })), +const MXID_PROFILE_STATES: Record {}> = { + [MXID1]: () => ({}), + [MXID2]: () => { + throw new MatrixError({ errcode: "M_FORBIDDEN" }); + }, + [MXID3]: () => { + throw new MatrixError({ errcode: "M_NOT_FOUND" }); + }, }; jest.mock("../../../src/Modal", () => ({ @@ -51,11 +55,12 @@ const mockPromptBeforeInviteUnknownUsers = (value: boolean) => { }; const mockCreateTrackedDialog = (callbackName: "onInviteAnyways" | "onGiveUp") => { - mocked(Modal.createDialog).mockImplementation( - (Element: ComponentType, props?: ComponentProps): any => { + mocked(Modal.createDialog).mockImplementation((Element: ComponentType, props?: ComponentProps) => { + if (Element === AskInviteAnywayDialog) { (props as ComponentProps)[callbackName](); - }, - ); + } + return { close: jest.fn(), finished: new Promise(() => {}) }; + }); }; const expectAllInvitedResult = (result: CompletionStates) => { @@ -72,6 +77,7 @@ describe("MultiInviter", () => { beforeEach(() => { jest.resetAllMocks(); + mocked(Modal.createDialog).mockReturnValue({ close: jest.fn(), finished: new Promise(() => {}) }); TestUtilsMatrix.stubClient(); client = MatrixClientPeg.safeGet() as jest.Mocked; @@ -80,8 +86,10 @@ describe("MultiInviter", () => { client.invite.mockResolvedValue({}); client.getProfileInfo = jest.fn(); - client.getProfileInfo.mockImplementation((userId: string) => { - return MXID_PROFILE_STATES[userId] || Promise.reject(); + client.getProfileInfo.mockImplementation(async (userId: string) => { + const m = MXID_PROFILE_STATES[userId]; + if (m) return m(); + throw new Error(); }); client.unban = jest.fn(); @@ -89,6 +97,22 @@ describe("MultiInviter", () => { }); describe("invite", () => { + it("should show a progress dialog while the invite happens", async () => { + const mockModalHandle = { close: jest.fn(), finished: new Promise<[]>(() => {}) }; + mocked(Modal.createDialog).mockReturnValue(mockModalHandle); + + const invitePromise = Promise.withResolvers<{}>(); + client.invite.mockReturnValue(invitePromise.promise); + + const resultPromise = inviter.invite([MXID1]); + expect(Modal.createDialog).toHaveBeenCalledTimes(1); + expect(mockModalHandle.close).not.toHaveBeenCalled(); + + invitePromise.resolve({}); + await resultPromise; + expect(mockModalHandle.close).toHaveBeenCalled(); + }); + describe("with promptBeforeInviteUnknownUsers = false", () => { beforeEach(() => mockPromptBeforeInviteUnknownUsers(false));