From 8911792b4ae87b334c091d2cfcc402e8aa45e356 Mon Sep 17 00:00:00 2001 From: John Tore Simonsen Date: Mon, 14 Oct 2024 15:55:48 +0200 Subject: [PATCH] Remove Customisations in "InviteDialog" Add customComponent lifecycle hook to Invite dialog --- src/components/structures/MatrixChat.tsx | 29 - src/components/views/dialogs/InviteDialog.tsx | 632 ++++-------------- src/dispatcher/actions.ts | 4 - 3 files changed, 115 insertions(+), 550 deletions(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 77454d2477c..30087493466 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -945,35 +945,6 @@ export default class MatrixChat extends React.PureComponent { true, ); break; - // VERJI - case Action.OpenInviteExternalUsersDialog: { - const customOnboardingOpts = { CustomComponent: React.Fragment }; - ModuleRunner.instance.invoke( - CustomComponentLifecycle.OnboardingDialog, - customOnboardingOpts as CustomComponentOpts, - ); - const Props = (props: any): React.JSX.Element =>
{props}
; - const customOnboardingDialog = (props: any): React.JSX.Element => ( - - - - ); - console.log("[Verji.Onboarding - Action.OpenInviteExternalUsers]", payload.data); - Modal.createDialog( - customOnboardingDialog, - { - initialText: payload.initialText, - data: payload?.data, - onFinished: () => { - Modal.toggleCurrentDialogVisibility(); - }, - }, - "mx_RoomDirectory_dialogWrapper", - false, - true, - ); - } - // END VERJI } }; diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 75304131d6c..6d1f1a8998d 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -16,8 +16,7 @@ limitations under the License. import React, { createRef, ReactNode, SyntheticEvent } from "react"; import classNames from "classnames"; -import { RoomMember, Room, EventType } from "matrix-js-sdk/src/matrix"; //VERJI remove: MatrixError, EventType -import { KnownMembership } from "matrix-js-sdk/src/types"; +import { RoomMember, Room, MatrixError, EventType } from "matrix-js-sdk/src/matrix"; import { MatrixCall } from "matrix-js-sdk/src/webrtc/call"; import { logger } from "matrix-js-sdk/src/logger"; import { uniqBy } from "lodash"; @@ -28,6 +27,7 @@ import { _t, _td } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { makeRoomPermalink, makeUserPermalink } from "../../../utils/permalinks/Permalinks"; import DMRoomMap from "../../../utils/DMRoomMap"; +import SdkConfig from "../../../SdkConfig"; import * as Email from "../../../email"; import { getDefaultIdentityServerUrl, setToDefaultIdentityServer } from "../../../utils/IdentityServerUtils"; import { buildActivityScores, buildMemberScores, compareMembers } from "../../../utils/SortMembers"; @@ -70,41 +70,39 @@ import Modal from "../../../Modal"; import dis from "../../../dispatcher/dispatcher"; import { privateShouldBeEncrypted } from "../../../utils/rooms"; import { NonEmptyArray } from "../../../@types/common"; -// VERJI Remove: import { UNKNOWN_PROFILE_ERRORS } from "../../../utils/MultiInviter"; -// VERJI Remove: import AskInviteAnywayDialog, { UnknownProfiles } from "./AskInviteAnywayDialog"; +import { UNKNOWN_PROFILE_ERRORS } from "../../../utils/MultiInviter"; +import AskInviteAnywayDialog, { UnknownProfiles } from "./AskInviteAnywayDialog"; import { SdkContextClass } from "../../../contexts/SDKContext"; import { UserProfilesStore } from "../../../stores/UserProfilesStore"; -import { Key } from "../../../Keyboard"; -import SpaceStore from "../../../stores/spaces/SpaceStore"; +import { CustomComponentLifecycle, CustomComponentOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/CustomComponentLifecycle"; import { ModuleRunner } from "../../../modules/ModuleRunner"; // we have a number of types defined from the Matrix spec which can't reasonably be altered here. /* eslint-disable camelcase */ -// const extractTargetUnknownProfiles = async ( -// targets: Member[], -// targetEmails: string[], // Verji -// profilesStores: UserProfilesStore, -// ): Promise => { -// const directoryMembers = targets.filter((t): t is DirectoryMember => t instanceof DirectoryMember); -// await Promise.all(directoryMembers.map((t) => profilesStores.getOrFetchProfile(t.userId))); -// return directoryMembers.reduce((unknownProfiles: UnknownProfiles, target: DirectoryMember) => { -// const lookupError = profilesStores.getProfileLookupError(target.userId); - -// if ( -// lookupError instanceof MatrixError && -// lookupError.errcode && -// UNKNOWN_PROFILE_ERRORS.includes(lookupError.errcode) -// ) { -// unknownProfiles.push({ -// userId: target.userId, -// errorText: lookupError.data.error || "", -// }); -// } - -// return unknownProfiles; -// }, []); -// }; +const extractTargetUnknownProfiles = async ( + targets: Member[], + profilesStores: UserProfilesStore, +): Promise => { + const directoryMembers = targets.filter((t): t is DirectoryMember => t instanceof DirectoryMember); + await Promise.all(directoryMembers.map((t) => profilesStores.getOrFetchProfile(t.userId))); + return directoryMembers.reduce((unknownProfiles: UnknownProfiles, target: DirectoryMember) => { + const lookupError = profilesStores.getProfileLookupError(target.userId); + + if ( + lookupError instanceof MatrixError && + lookupError.errcode && + UNKNOWN_PROFILE_ERRORS.includes(lookupError.errcode) + ) { + unknownProfiles.push({ + userId: target.userId, + errorText: lookupError.data.error || "", + }); + } + + return unknownProfiles; + }, []); +}; interface Result { userId: string; @@ -158,72 +156,7 @@ class DMUserTile extends React.PureComponent { ); } } -/* VERJI START */ -class DMEmailTile extends React.PureComponent { - private onRemove = (e: any): void => { - // Stop the browser from highlighting text - e.preventDefault(); - e.stopPropagation(); - console.log(e); - const asMember: Member = { - name: this.props.email ?? "", - userId: this.props.email ?? "", - getMxcAvatarUrl: () => { - return ""; - }, - }; - if (this.props.onRemove) { - this.props.onRemove(asMember); - } - }; - public render(): any { - let closeButton; - if (this.props.onRemove) { - closeButton = ( - - - - - - - - - - - - - - - - - - - ); - } - - return ( - - - {this.props?.email ?? ""} - - {closeButton} - - ); - } -} -/* VERJI END */ /** * Converts a RoomMember to a Member. * Returns the Member if it is already a Member. @@ -395,7 +328,6 @@ type Props = InviteDMProps | InviteRoomProps | InviteCallProps; interface IInviteDialogState { targets: Member[]; // array of Member objects (see interface above) - targetEmails: string[]; // Verji filterText: string; recents: Result[]; numRecentsShown: number; @@ -426,20 +358,10 @@ export default class InviteDialog extends React.PureComponent { - this.spaceMemberIds.push(m.userId); - }); - // Verji end + if (props.kind === InviteKind.Invite && !props.roomId) { throw new Error("When using InviteKind.Invite a roomId is required for an InviteDialog"); } else if (props.kind === InviteKind.CallTransfer && !props.call) { @@ -449,6 +371,9 @@ export default class InviteDialog extends React.PureComponent excludedTargetIds.add(id)); } - // VERJI added param activeSpaceMembers - used to filter the recents based on membership in space - public static buildRecents(excludedTargetIds: Set, activeSpaceMembers: string[]): Result[] { - // Verji - If we don't want to see the Recents-suggestions(featureflag), we just return an empty array - if (!SettingsStore.getValue(UIFeature.ShowRecentsInSuggestions)) { - return [] as Result[]; - } + public static buildRecents(excludedTargetIds: Set): Result[] { const rooms = DMRoomMap.shared().getUniqueRoomsWithIndividuals(); // map of userId => js-sdk Room // Also pull in all the rooms tagged as DefaultTagID.DM so we don't miss anything. Sometimes the @@ -569,15 +468,6 @@ export default class InviteDialog extends React.PureComponent): { userId: string; user: Member }[] { const cli = MatrixClientPeg.safeGet(); const activityScores = buildActivityScores(cli); - - let memberScores = {} as { [userId: string]: { member: RoomMember; score: number; numRooms: number } }; - if (SettingsStore.getValue(UIFeature.ShowRoomMembersInSuggestions)) { - memberScores = buildMemberScores(cli); - } + const memberScores = buildMemberScores(cli); const memberComparator = compareMembers(activityScores, memberScores); + return Object.values(memberScores) .map(({ member }) => member) .filter((member) => !excludedTargetIds.has(member.userId)) - .filter((member) => this.spaceMemberIds.includes(member.userId)) // Verji - add another layer of filtering, to only include members which are a member of space .sort(memberComparator) .map((member) => ({ userId: member.userId, user: toMember(member) })); } @@ -642,72 +528,7 @@ export default class InviteDialog extends React.PureComponent { - // rosberg start - this.setState({ busy: true }); - - let foundUser = false; - try { - const client = MatrixClientPeg.get(); - - const searchContext = await ModuleRunner.instance.extensions.userSearch.getSearchContext( - client, - SdkContextClass.instance, - ); - - await client - ?.searchUserDirectory( - { term: this.state.filterText.trim().split(":")[0] ?? this.state.filterText }, - searchContext.extraBodyArgs, - searchContext.extraRequestOptions, - ) - .then(async (r) => { - this.setState({ busy: false }); - if (r.results.find((e) => e.user_id == this.state.filterText.trim())) { - foundUser = true; - } - }); - } catch (error) { - console.error("Failed to searchUserDirectory: ", error); - } - - const currentUserId: string | undefined = MatrixClientPeg.getCredentials()?.userId.trim(); - if (currentUserId && currentUserId == this.state.filterText.trim()) { - this.setState({ busy: false }); - return [{ userId: currentUserId }] as Member[]; - } - - if (foundUser == false) { - // Look in other stores for user if search might have failed unexpectedly - // VERJI - Add feature flag ShowRoomMembersInSuggestions, if false, only show Recents - let possibleMembers = [] as Result[]; - if (SettingsStore.getValue(UIFeature.ShowRoomMembersInSuggestions)) { - possibleMembers = [ - ...this.state.recents, - ...this.state.suggestions, - ...this.state.serverResultsMixin, - ...this.state.threepidResultsMixin, - ]; - } else if (SettingsStore.getValue(UIFeature.ShowRecentsInSuggestions)) { - possibleMembers = [...this.state.recents]; - } - const toAdd = []; - const potentialAddresses = this.state.filterText - .split(/[\s,]+/) - .map((p) => p.trim()) - .filter((p) => !!p); // filter empty strings - for (const address of potentialAddresses) { - const member = possibleMembers.find((m) => m.userId === address); - if (member) { - toAdd.push(member.user); - continue; - } - } - - if (!toAdd?.length || toAdd?.length == 0) { - //return [] as Member[]; - } - } + private convertFilter(): Member[] { // Check to see if there's anything to convert first if (!this.state.filterText || !this.state.filterText.includes("@")) return this.state.targets || []; @@ -720,80 +541,45 @@ export default class InviteDialog extends React.PureComponent { - if (_email == newEmail) { - this.setState({ filterText: text ? this.state.filterText : "" }); - return this.state.targetEmails; - } - }); - const newTargetsToInvite = [...(this.state.targetEmails || []), newEmail]; - - this.setState({ targets: [], targetEmails: newTargetsToInvite, filterText: text ? this.state.filterText : "" }); - - console.log("[Verji.InviteDialog] - Onboarding: " + newTargetsToInvite); - return newTargetsToInvite; - } - private startInviteByEmail = async (): Promise => { - this.props.onFinished(false); - - let _externals = this.state.targetEmails; - if (_externals == null) _externals = []; - if (Email.looksValid(this.state.filterText) && !_externals.includes(this.state.filterText)) { - _externals.push(this.state.filterText); - } - dis.dispatch({ - action: Action.OpenInviteExternalUsersDialog, - data: { - externals: _externals, - }, - }); - }; - /* VERJI END */ /** * Check if there are unknown profiles if promptBeforeInviteUnknownUsers setting is enabled. * If so show the "invite anyway?" dialog. Otherwise directly create the DM local room. */ - // VERJI COMMENT OUT CheckProfileAndStartDM - // private checkProfileAndStartDm = async (): Promise => { - // this.setBusy(true); - // const targets = this.convertFilter(); + private checkProfileAndStartDm = async (): Promise => { + this.setBusy(true); + const targets = this.convertFilter(); - // if (SettingsStore.getValue("promptBeforeInviteUnknownUsers")) { - // const unknownProfileUsers = await extractTargetUnknownProfiles(targets, this.profilesStore); + if (SettingsStore.getValue("promptBeforeInviteUnknownUsers")) { + const unknownProfileUsers = await extractTargetUnknownProfiles(targets, this.profilesStore); - // if (unknownProfileUsers.length) { - // this.showAskInviteAnywayDialog(unknownProfileUsers); - // return; - // } - // } + if (unknownProfileUsers.length) { + this.showAskInviteAnywayDialog(unknownProfileUsers); + return; + } + } - // await this.startDm(); - // }; + await this.startDm(); + }; private startDm = async (): Promise => { this.setBusy(true); try { const cli = MatrixClientPeg.safeGet(); - const targets = await this.convertFilter(); // Verji: convert now async, await response + const targets = this.convertFilter(); await startDmOnFirstMessage(cli, targets); this.props.onFinished(true); } catch (err) { @@ -810,25 +596,25 @@ export default class InviteDialog extends React.PureComponent this.startDm(), - // onGiveUp: () => { - // this.setBusy(false); - // }, - // description: _t("invite|ask_anyway_description"), - // inviteNeverWarnLabel: _t("invite|ask_anyway_never_warn_label"), - // inviteLabel: _t("invite|ask_anyway_label"), - // }); - // } + + private showAskInviteAnywayDialog(unknownProfileUsers: { userId: string; errorText: string }[]): void { + Modal.createDialog(AskInviteAnywayDialog, { + unknownProfileUsers, + onInviteAnyways: () => this.startDm(), + onGiveUp: () => { + this.setBusy(false); + }, + description: _t("invite|ask_anyway_description"), + inviteNeverWarnLabel: _t("invite|ask_anyway_never_warn_label"), + inviteLabel: _t("invite|ask_anyway_label"), + }); + } private inviteUsers = async (): Promise => { if (this.props.kind !== InviteKind.Invite) return; this.setState({ busy: true }); this.convertFilter(); - const targets = await this.convertFilter(); // Verji: convert now async, await response + const targets = this.convertFilter(); const targetIds = targets.map((t) => t.userId); const cli = MatrixClientPeg.safeGet(); @@ -861,7 +647,7 @@ export default class InviteDialog extends React.PureComponent t.userId); if (targetIds.length > 1) { this.setState({ @@ -881,81 +667,33 @@ export default class InviteDialog extends React.PureComponent | any): Promise => { + private onKeyDown = (e: React.KeyboardEvent): void => { if (this.state.busy) return; let handled = false; const value = e.currentTarget.value.trim(); const action = getKeyBindingsManager().getAccessibilityAction(e); - console.log("[Verji.inviteDialog.tsx] - onKeyDown, allowOndboardingFlag: ", this.allowOnboardingFlag); - // VERJI START - if (!this.allowOnboardingFlag) { - if (this.state.busy) return; - const value = e.target.value.trim(); - const hasModifiers = e.ctrlKey || e.shiftKey || e.metaKey; - if (!value && this.state.targets.length > 0 && e.key === Key.BACKSPACE && !hasModifiers) { - // when the field is empty and the user hits backspace remove the right-most target - e.preventDefault(); - this.removeMember(this.state.targets[this.state.targets.length - 1]); - } else if (value && e.key === Key.ENTER && !hasModifiers) { - // when the user hits enter with something in their field try to convert it - e.preventDefault(); - await this.convertFilter(); - } else if (value && e.key === Key.SPACE && !hasModifiers && value.includes("@") && !value.includes(" ")) { - // when the user hits space and their input looks like an e-mail/MXID then try to convert it - e.preventDefault(); - await this.convertFilter(); - } - return; - } - // VERJI END + switch (action) { case KeyBindingAction.Backspace: - /* ROSBERG VERJI */ - if (value || (this.state.targets.length <= 0 && this.state.targetEmails?.length <= 0)) break; - if (this.allowOnboardingFlag) { - if (this.state.targetEmails?.length > 0) { - this.removeEmailInvite(this.state.targetEmails[this.state.targetEmails.length - 1]); - return; - } - } - /* VERJI END*/ + if (value || this.state.targets.length <= 0) break; + // when the field is empty and the user hits backspace remove the right-most target this.removeMember(this.state.targets[this.state.targets.length - 1]); handled = true; break; case KeyBindingAction.Space: - /* VERJI START */ - if (this.allowOnboardingFlag) { - if (value && Email.looksValid(value)) { - this.convertFilterOnboarding(); - break; - } else { - this.setState({ targetEmails: [] }); // dont allow combination of members - } - } - /* VERJI END*/ if (!value || !value.includes("@") || value.includes(" ")) break; // when the user hits space and their input looks like an e-mail/MXID then try to convert it - await this.convertFilter(); // VERJI ADD await + this.convertFilter(); handled = true; break; case KeyBindingAction.Enter: if (!value) break; - /* VERJI START */ - if (this.allowOnboardingFlag) { - if (value && Email.looksValid(value)) { - this.convertFilterOnboarding(); - break; - } else { - this.setState({ targetEmails: [] }); // dont allow combination of members - } - } - /* VERJI END*/ // when the user hits enter with something in their field try to convert it - await this.convertFilter(); // VERJI add await + this.convertFilter(); handled = true; break; } @@ -970,14 +708,8 @@ export default class InviteDialog extends React.PureComponent => { - const client = MatrixClientPeg.safeGet(); - const searchContext = await ModuleRunner.instance.extensions.userSearch.getSearchContext( - client, - SdkContextClass.instance, - ); - - client - .searchUserDirectory({ term }, searchContext.extraBodyArgs, searchContext.extraRequestOptions) + MatrixClientPeg.safeGet() + .searchUserDirectory({ term }) .then(async (r): Promise => { if (term !== this.state.filterText) { // Discard the results - we were probably too slow on the server-side to make @@ -1105,11 +837,6 @@ export default class InviteDialog extends React.PureComponent { - // VERJI START - if (this.allowOnboardingFlag) { - this.setState({ targetEmails: [] }); - } - // VERJI END if (!this.state.busy) { let filterText = this.state.filterText; let targets = this.state.targets.map((t) => t); // cheap clone for mutation @@ -1131,25 +858,7 @@ export default class InviteDialog extends React.PureComponent { - if (this.state.busy) return; - const _email = (email as Member)?.name ?? (email as string); - - const targets = this.state.targetEmails.map((t) => t); // cheap clone for mutation - const idx = targets.indexOf(_email); - if (idx >= 0) { - targets.splice(idx, 1); - this.setState({ targetEmails: targets }); - } - - if (this.editorRef && this.editorRef.current) { - this.editorRef.current.focus(); - } - }; - /* VERJI END */ private removeMember = (member: Member): void => { - if (this.state.busy) return; const targets = this.state.targets.map((t) => t); // cheap clone for mutation const idx = targets.indexOf(member); if (idx >= 0) { @@ -1170,11 +879,6 @@ export default class InviteDialog extends React.PureComponent => { - // VERJI START - if (this.allowOnboardingFlag) { - return; - } - // VERJI END if (this.state.filterText) { // if the user has already typed something, just let them // paste normally. @@ -1182,32 +886,6 @@ export default class InviteDialog extends React.PureComponent { - this.setState({ busy: false }); - - if (r.results.find((e) => e.user_id == this.state.filterText.trim())) { - directoryUsers = r.results.map((u) => { - return { - userId: u.user_id, - user: null, - }; - }); - } - }); - - // ROSBERG END const potentialAddresses = this.parseFilter(text); // one search term which is not a mxid or email address if (potentialAddresses.length === 1 && !potentialAddresses[0].includes("@")) { @@ -1218,14 +896,12 @@ export default class InviteDialog extends React.PureComponent m.userId === address); if (member) { - // ROSBERG start - if (member.userId.trim() == MatrixClientPeg.getCredentials()?.userId.trim()) { - failed.push(text); // ROSBERG - continue; - } - //ROSBERG END if (this.canInviteMore([...this.state.targets, ...toAdd])) { toAdd.push(member.user); } else { @@ -1260,7 +924,7 @@ export default class InviteDialog extends React.PureComponent m.userId === u.userId) && !priorityAdditionalMembers.some((m) => m.userId === u.userId) && !otherAdditionalMembers.some((m) => m.userId === u.userId) - //HERE ); }; @@ -1397,7 +1060,6 @@ export default class InviteDialog extends React.PureComponent ( - // - // )); - /* ROSBERG START */ - let targets; - if (this.allowOnboardingFlag) { - if (this.state.targetEmails?.length > 0) { - targets = this.state.targetEmails.map((t) => ( - // ROSBERG - )); - } else { - targets = this.state.targets.map((t) => - t?.userId && t?.name ? ( - - ) : null, - ); - } - } else { - targets = this.state.targets.map((t) => - t?.userId && t?.name ? ( - - ) : null, - ); - } - /* ROSBERG END */ + const targets = this.state.targets.map((t) => ( + + )); const input = ( 0 || (this.state.filterText && this.state.filterText.includes("@")); + const hasSelection = + this.state.targets.length > 0 || (this.state.filterText && this.state.filterText.includes("@")); - // VERJI HACK (&& !Email.looksValid(this.state.filterText)) - let hasSelection = false; - //let emailInvite = false; - if (this.allowOnboardingFlag) { - hasSelection = this.state.targets.length > 0 || this.state.targetEmails?.length > 0; - // emailInvite = (this.state.filterText && this.state.filterText.includes('@') && Email.looksValid(this.state.filterText)); - } else { - hasSelection = this.state.targets.length > 0; - } - // VERJI END const cli = MatrixClientPeg.safeGet(); const userId = cli.getUserId()!; if (this.props.kind === InviteKind.Dm) { @@ -1694,15 +1325,9 @@ export default class InviteDialog extends React.PureComponent 0) { - buttonText = _t("action|go"); - } else { - buttonText = _t("action|go"); - } - /* VERJI END */ + buttonText = _t("action|go"); - goButtonFn = this.startDm; //this.checkProfileAndStartDm; + goButtonFn = this.checkProfileAndStartDm; extraSection = (
{_t("invite|suggestions_disclaimer")} @@ -1813,7 +1438,7 @@ export default class InviteDialog extends React.PureComponent {this.renderSection("recents")} {this.renderSection("suggestions")} - {SettingsStore.getValue(UIFeature.SendInviteLinkPrompt) && extraSection} + {extraSection}
); } - /* VERJI start */ - if (this.allowOnboardingFlag) { - goButton = - this.props.kind == InviteKind.CallTransfer ? null : ( - 0 || Email.looksValid(this.state.filterText)) - ? this.startInviteByEmail - : goButtonFn - } - className="mx_InviteDialog_goButton" - disabled={ - (this.state.busy || !hasSelection) && - this.state.targetEmails?.length <= 0 && - !Email.looksValid(this.state.filterText) - } - > - {buttonText} - - ); - } else { - goButton = - this.props.kind == InviteKind.CallTransfer ? null : ( - - {buttonText} - - ); - } - /* VERJI END */ const usersSection = ( @@ -1892,7 +1481,7 @@ export default class InviteDialog extends React.PureComponent{this.state.errorText} {onlyOneThreepidNote} {results} - {SettingsStore.getValue(UIFeature.SendInviteLinkPrompt) && footer} + {footer} ); @@ -1952,9 +1541,9 @@ export default class InviteDialog extends React.PureComponent - + @@ -1969,21 +1558,30 @@ export default class InviteDialog extends React.PureComponent ); } - + const customInviteDialog = { CustomComponent: React.Fragment }; + const Props = (props: any): React.JSX.Element => <>; + ModuleRunner.instance.invoke( + CustomComponentLifecycle.InviteDialog, + customInviteDialog as CustomComponentOpts, + ); return ( - -
{dialogContent}
-
+ + {/* VERJI: Workaround, pass needed props in a child element of the customComponent wrapper, so we can extract in module implementation */} + + +
{dialogContent}
+
+
); } -} +} \ No newline at end of file diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index 3fe4ae91ea3..9487bb344ac 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -400,9 +400,5 @@ export enum Action { */ ViewOperatingMessages = "view_operatingmessages", - /** - * Opens dialog to invite external Verji users - */ - OpenInviteExternalUsersDialog = "open_invite_external_users_dialog", // Verji end }