From 2d2b40ddac5fa1adb12b34eea436e0b70e8a9857 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Thu, 2 Mar 2023 17:36:16 +0000 Subject: [PATCH] Remove hosting link provider from Element (#10270) * Remove hosting link provider from Element * fix whitespace --- res/css/_components.pcss | 1 - res/css/structures/_UserMenu.pcss | 10 +- res/css/views/dialogs/_HostSignupDialog.pcss | 132 --------- src/IConfigOptions.ts | 13 - .../structures/HostSignupAction.tsx | 54 ---- src/components/structures/LoggedInView.tsx | 2 - src/components/structures/UserMenu.tsx | 11 - .../views/dialogs/HostSignupDialog.tsx | 280 ------------------ .../views/dialogs/HostSignupDialogTypes.ts | 47 --- .../views/host_signup/HostSignupContainer.tsx | 33 --- .../views/settings/ProfileSettings.tsx | 23 -- src/i18n/strings/en_EN.json | 16 +- src/stores/HostSignupStore.ts | 49 --- src/utils/HostingLink.ts | 34 --- 14 files changed, 2 insertions(+), 703 deletions(-) delete mode 100644 res/css/views/dialogs/_HostSignupDialog.pcss delete mode 100644 src/components/structures/HostSignupAction.tsx delete mode 100644 src/components/views/dialogs/HostSignupDialog.tsx delete mode 100644 src/components/views/dialogs/HostSignupDialogTypes.ts delete mode 100644 src/components/views/host_signup/HostSignupContainer.tsx delete mode 100644 src/stores/HostSignupStore.ts delete mode 100644 src/utils/HostingLink.ts diff --git a/res/css/_components.pcss b/res/css/_components.pcss index 533b7c0c21..6a7bbd197f 100644 --- a/res/css/_components.pcss +++ b/res/css/_components.pcss @@ -136,7 +136,6 @@ @import "./views/dialogs/_FeedbackDialog.pcss"; @import "./views/dialogs/_ForwardDialog.pcss"; @import "./views/dialogs/_GenericFeatureFeedbackDialog.pcss"; -@import "./views/dialogs/_HostSignupDialog.pcss"; @import "./views/dialogs/_IncomingSasDialog.pcss"; @import "./views/dialogs/_InviteDialog.pcss"; @import "./views/dialogs/_JoinRuleDropdown.pcss"; diff --git a/res/css/structures/_UserMenu.pcss b/res/css/structures/_UserMenu.pcss index 08ef8947ee..9c9e1ce529 100644 --- a/res/css/structures/_UserMenu.pcss +++ b/res/css/structures/_UserMenu.pcss @@ -142,12 +142,8 @@ limitations under the License. justify-content: center; } - &.mx_UserMenu_contextMenu_guestPrompts, - &.mx_UserMenu_contextMenu_hostingLink { - padding-top: 0; - } - &.mx_UserMenu_contextMenu_guestPrompts { + padding-top: 0; display: inline-block; > span { @@ -190,10 +186,6 @@ limitations under the License. mask-image: url("$(res)/img/element-icons/roomlist/dnd-cross.svg"); } - .mx_UserMenu_iconHosting::before { - mask-image: url("$(res)/img/element-icons/brands/element.svg"); - } - .mx_UserMenu_iconBell::before { mask-image: url("$(res)/img/element-icons/notifications.svg"); } diff --git a/res/css/views/dialogs/_HostSignupDialog.pcss b/res/css/views/dialogs/_HostSignupDialog.pcss deleted file mode 100644 index 15c383f1e8..0000000000 --- a/res/css/views/dialogs/_HostSignupDialog.pcss +++ /dev/null @@ -1,132 +0,0 @@ -/* -Copyright 2021 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. -*/ - -.mx_HostSignupDialog { - width: 90vw; - max-width: 580px; - height: 80vh; - max-height: 600px; - /* Ensure dialog borders are always white as the HostSignupDialog */ - /* does not yet support dark mode or theming in general. */ - /* In the future we might want to pass the theme to the called */ - /* iframe, should some hosting provider have that need. */ - background-color: #ffffff; - - .mx_HostSignupDialog_info { - text-align: center; - - .mx_HostSignupDialog_content_top { - margin-bottom: 24px; - } - - .mx_HostSignupDialog_paragraphs { - text-align: left; - padding-left: 25%; - padding-right: 25%; - } - - .mx_HostSignupDialog_buttons { - margin-bottom: 24px; - display: flex; - justify-content: center; - - button { - padding: 12px; - margin: 0 16px; - } - } - - .mx_HostSignupDialog_footer { - display: flex; - justify-content: center; - align-items: baseline; - - img { - padding-right: 5px; - } - } - } - - iframe { - width: 100%; - height: 100%; - border: none; - background-color: #fff; - min-height: 540px; - } -} - -.mx_HostSignupDialog_text_dark { - color: $primary-content; -} - -.mx_HostSignupDialog_text_light { - color: $secondary-content; -} - -.mx_HostSignup_maximize_button { - mask: url("$(res)/img/element-icons/maximise-expand.svg"); - mask-repeat: no-repeat; - mask-position: center; - mask-size: cover; - width: 14px; - height: 14px; - background-color: $dialog-close-fg-color; - cursor: pointer; - position: absolute; - top: 10px; - right: 10px; -} - -.mx_HostSignup_minimize_button { - mask: url("$(res)/img/element-icons/minimise-collapse.svg"); - mask-repeat: no-repeat; - mask-position: center; - mask-size: cover; - width: 14px; - height: 14px; - background-color: $dialog-close-fg-color; - cursor: pointer; - position: absolute; - top: 10px; - right: 25px; -} - -.mx_HostSignupDialog_minimized { - position: fixed; - bottom: 80px; - right: 26px; - width: 314px; - height: 217px; - overflow: hidden; - - &.mx_Dialog { - padding: 12px; - } - - .mx_Dialog_title { - text-align: left !important; - padding-left: 20px; - font-size: $font-15px; - } - - iframe { - width: 100%; - height: 100%; - border: none; - background-color: #fff; - } -} diff --git a/src/IConfigOptions.ts b/src/IConfigOptions.ts index 1db73cc074..b2e44f23ce 100644 --- a/src/IConfigOptions.ts +++ b/src/IConfigOptions.ts @@ -148,19 +148,6 @@ export interface IConfigOptions { analytics_owner?: string; // defaults to `brand` privacy_policy_url?: string; // location for cookie policy - // Server hosting upsell options - hosting_signup_link?: string; // slightly different from `host_signup` - host_signup?: { - brand?: string; // acts as the enabled flag too (truthy == show) - - // Required-ness denotes when `brand` is truthy - cookie_policy_url: string; - privacy_policy_url: string; - terms_of_service_url: string; - url: string; - domains?: string[]; - }; - enable_presence_by_hs_url?: Record; // terms_and_conditions_links?: { url: string; text: string }[]; diff --git a/src/components/structures/HostSignupAction.tsx b/src/components/structures/HostSignupAction.tsx deleted file mode 100644 index 757a7360fb..0000000000 --- a/src/components/structures/HostSignupAction.tsx +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright 2021 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 { IconizedContextMenuOption, IconizedContextMenuOptionList } from "../views/context_menus/IconizedContextMenu"; -import { _t } from "../../languageHandler"; -import { HostSignupStore } from "../../stores/HostSignupStore"; -import SdkConfig from "../../SdkConfig"; - -interface IProps { - onClick?(): void; -} - -interface IState {} - -export default class HostSignupAction extends React.PureComponent { - private openDialog = async (): Promise => { - this.props.onClick?.(); - await HostSignupStore.instance.setHostSignupActive(true); - }; - - public render(): React.ReactNode { - const hostSignupConfig = SdkConfig.getObject("host_signup"); - if (!hostSignupConfig?.get("brand")) { - return null; - } - - return ( - - - - ); - } -} diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index 7b01f1e405..f7c23332fd 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -47,7 +47,6 @@ import NonUrgentToastContainer from "./NonUrgentToastContainer"; import { IOOBData, IThreepidInvite } from "../../stores/ThreepidInviteStore"; import Modal from "../../Modal"; import { ICollapseConfig } from "../../resizer/distributors/collapse"; -import HostSignupContainer from "../views/host_signup/HostSignupContainer"; import { getKeyBindingsManager } from "../../KeyBindingsManager"; import { IOpts } from "../../createRoom"; import SpacePanel from "../views/spaces/SpacePanel"; @@ -695,7 +694,6 @@ class LoggedInView extends React.Component { - {audioFeedArraysForCalls} ); diff --git a/src/components/structures/UserMenu.tsx b/src/components/structures/UserMenu.tsx index 4f52b2c970..ec6477aa7a 100644 --- a/src/components/structures/UserMenu.tsx +++ b/src/components/structures/UserMenu.tsx @@ -43,7 +43,6 @@ import IconizedContextMenu, { IconizedContextMenuOptionList, } from "../views/context_menus/IconizedContextMenu"; import { UIFeature } from "../../settings/UIFeature"; -import HostSignupAction from "./HostSignupAction"; import SpaceStore from "../../stores/spaces/SpaceStore"; import { UPDATE_SELECTED_SPACE } from "../../stores/spaces"; import UserIdentifierCustomisations from "../../customisations/UserIdentifier"; @@ -290,7 +289,6 @@ export default class UserMenu extends React.Component { if (!this.state.contextMenuPosition) return null; let topSection; - const hostSignupConfig = SdkConfig.getObject("host_signup"); if (MatrixClientPeg.get().isGuest()) { topSection = (
@@ -318,15 +316,6 @@ export default class UserMenu extends React.Component { )}
); - } else if (hostSignupConfig?.get("url")) { - // If hostSignup.domains is set to a non-empty array, only show - // dialog if the user is on the domain or a subdomain. - const hostSignupDomains = hostSignupConfig.get("domains") || []; - const mxDomain = MatrixClientPeg.get().getDomain(); - const validDomains = hostSignupDomains.filter((d) => d === mxDomain || mxDomain.endsWith(`.${d}`)); - if (!hostSignupConfig.get("domains") || validDomains.length > 0) { - topSection = ; - } } let homeButton = null; diff --git a/src/components/views/dialogs/HostSignupDialog.tsx b/src/components/views/dialogs/HostSignupDialog.tsx deleted file mode 100644 index 631eb1abcf..0000000000 --- a/src/components/views/dialogs/HostSignupDialog.tsx +++ /dev/null @@ -1,280 +0,0 @@ -/* -Copyright 2021 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 classNames from "classnames"; -import { logger } from "matrix-js-sdk/src/logger"; - -import AccessibleButton from "../elements/AccessibleButton"; -import Modal from "../../../Modal"; -import QuestionDialog from "./QuestionDialog"; -import SdkConfig from "../../../SdkConfig"; -import { _t } from "../../../languageHandler"; -import { MatrixClientPeg } from "../../../MatrixClientPeg"; -import { HostSignupStore } from "../../../stores/HostSignupStore"; -import { OwnProfileStore } from "../../../stores/OwnProfileStore"; -import { IPostmessage, IPostmessageResponseData, PostmessageAction } from "./HostSignupDialogTypes"; -import { IConfigOptions } from "../../../IConfigOptions"; -import { SnakedObject } from "../../../utils/SnakedObject"; - -interface IProps {} - -interface IState { - completed: boolean; - error: string; - minimized: boolean; -} - -export default class HostSignupDialog extends React.PureComponent { - private iframeRef: React.RefObject = React.createRef(); - private readonly config: SnakedObject; - - public constructor(props: IProps) { - super(props); - - this.state = { - completed: false, - error: null, - minimized: false, - }; - - this.config = SdkConfig.getObject("host_signup"); - } - - private messageHandler = async (message: IPostmessage): Promise => { - if (!this.config.get("url").startsWith(message.origin)) { - return; - } - switch (message.data.action) { - case PostmessageAction.HostSignupAccountDetailsRequest: - this.onAccountDetailsRequest(); - break; - case PostmessageAction.Maximize: - this.setState({ - minimized: false, - }); - break; - case PostmessageAction.Minimize: - this.setState({ - minimized: true, - }); - break; - case PostmessageAction.SetupComplete: - this.setState({ - completed: true, - }); - break; - case PostmessageAction.CloseDialog: - return this.closeDialog(); - } - }; - - private maximizeDialog = (): void => { - this.setState({ - minimized: false, - }); - // Send this action to the iframe so it can act accordingly - this.sendMessage({ - action: PostmessageAction.Maximize, - }); - }; - - private minimizeDialog = (): void => { - this.setState({ - minimized: true, - }); - // Send this action to the iframe so it can act accordingly - this.sendMessage({ - action: PostmessageAction.Minimize, - }); - }; - - private closeDialog = async (): Promise => { - window.removeEventListener("message", this.messageHandler); - // Finally clear the flag in - return HostSignupStore.instance.setHostSignupActive(false); - }; - - private onCloseClick = async (): Promise => { - if (this.state.completed) { - // We're done, close - return this.closeDialog(); - } else { - Modal.createDialog(QuestionDialog, { - title: _t("Confirm abort of host creation"), - description: _t( - "Are you sure you wish to abort creation of the host? The process cannot be continued.", - ), - button: _t("Abort"), - onFinished: (result) => { - if (result) { - return this.closeDialog(); - } - }, - }); - } - }; - - private sendMessage = (message: IPostmessageResponseData): void => { - this.iframeRef.current.contentWindow.postMessage(message, this.config.get("url")); - }; - - private async sendAccountDetails(): Promise { - const openIdToken = await MatrixClientPeg.get().getOpenIdToken(); - if (!openIdToken || !openIdToken.access_token) { - logger.warn("Failed to connect to homeserver for OpenID token."); - this.setState({ - completed: true, - error: _t("Failed to connect to your homeserver. Please close this dialog and try again."), - }); - return; - } - this.sendMessage({ - action: PostmessageAction.HostSignupAccountDetails, - account: { - accessToken: await MatrixClientPeg.get().getAccessToken(), - name: OwnProfileStore.instance.displayName, - openIdToken: openIdToken.access_token, - serverName: await MatrixClientPeg.get().getDomain(), - userLocalpart: await MatrixClientPeg.get().getUserIdLocalpart(), - termsAccepted: true, - }, - }); - } - - private onAccountDetailsDialogFinished = async (result: boolean): Promise => { - if (result) { - return this.sendAccountDetails(); - } - return this.closeDialog(); - }; - - private onAccountDetailsRequest = (): void => { - const cookiePolicyUrl = this.config.get("cookie_policy_url"); - const privacyPolicyUrl = this.config.get("privacy_policy_url"); - const tosUrl = this.config.get("terms_of_service_url"); - - const textComponent = ( - <> -

- {_t( - "Continuing temporarily allows the %(hostSignupBrand)s setup process to access your " + - "account to fetch verified email addresses. This data is not stored.", - { - hostSignupBrand: this.config.get("brand"), - }, - )} -

-

- {_t( - "Learn more in our , and .", - {}, - { - cookiePolicyLink: () => ( - - {_t("Cookie Policy")} - - ), - privacyPolicyLink: () => ( - - {_t("Privacy Policy")} - - ), - termsOfServiceLink: () => ( - - {_t("Terms of Service")} - - ), - }, - )} -

- - ); - Modal.createDialog(QuestionDialog, { - title: _t("You should know"), - description: textComponent, - button: _t("Continue"), - onFinished: this.onAccountDetailsDialogFinished, - }); - }; - - public componentDidMount(): void { - window.addEventListener("message", this.messageHandler); - } - - public componentWillUnmount(): void { - if (HostSignupStore.instance.isHostSignupActive) { - // Run the close dialog actions if we're still active, otherwise good to go - this.closeDialog(); - } - } - - public render(): React.ReactNode { - return ( -
-
- {this.state.minimized && ( -
-
- {_t("%(hostSignupBrand)s Setup", { - hostSignupBrand: this.config.get("brand"), - })} -
- -
- )} - {!this.state.minimized && ( -
- - -
- )} - {this.state.error &&
{this.state.error}
} - {!this.state.error && ( -