Remove hosting link provider from Element (#10270)
* Remove hosting link provider from Element * fix whitespace
This commit is contained in:
parent
0e52729083
commit
2d2b40ddac
14 changed files with 2 additions and 703 deletions
|
@ -136,7 +136,6 @@
|
||||||
@import "./views/dialogs/_FeedbackDialog.pcss";
|
@import "./views/dialogs/_FeedbackDialog.pcss";
|
||||||
@import "./views/dialogs/_ForwardDialog.pcss";
|
@import "./views/dialogs/_ForwardDialog.pcss";
|
||||||
@import "./views/dialogs/_GenericFeatureFeedbackDialog.pcss";
|
@import "./views/dialogs/_GenericFeatureFeedbackDialog.pcss";
|
||||||
@import "./views/dialogs/_HostSignupDialog.pcss";
|
|
||||||
@import "./views/dialogs/_IncomingSasDialog.pcss";
|
@import "./views/dialogs/_IncomingSasDialog.pcss";
|
||||||
@import "./views/dialogs/_InviteDialog.pcss";
|
@import "./views/dialogs/_InviteDialog.pcss";
|
||||||
@import "./views/dialogs/_JoinRuleDropdown.pcss";
|
@import "./views/dialogs/_JoinRuleDropdown.pcss";
|
||||||
|
|
|
@ -142,12 +142,8 @@ limitations under the License.
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.mx_UserMenu_contextMenu_guestPrompts,
|
|
||||||
&.mx_UserMenu_contextMenu_hostingLink {
|
|
||||||
padding-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.mx_UserMenu_contextMenu_guestPrompts {
|
&.mx_UserMenu_contextMenu_guestPrompts {
|
||||||
|
padding-top: 0;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
|
@ -190,10 +186,6 @@ limitations under the License.
|
||||||
mask-image: url("$(res)/img/element-icons/roomlist/dnd-cross.svg");
|
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 {
|
.mx_UserMenu_iconBell::before {
|
||||||
mask-image: url("$(res)/img/element-icons/notifications.svg");
|
mask-image: url("$(res)/img/element-icons/notifications.svg");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -148,19 +148,6 @@ export interface IConfigOptions {
|
||||||
analytics_owner?: string; // defaults to `brand`
|
analytics_owner?: string; // defaults to `brand`
|
||||||
privacy_policy_url?: string; // location for cookie policy
|
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<string, boolean>; // <HomeserverName, Enabled>
|
enable_presence_by_hs_url?: Record<string, boolean>; // <HomeserverName, Enabled>
|
||||||
|
|
||||||
terms_and_conditions_links?: { url: string; text: string }[];
|
terms_and_conditions_links?: { url: string; text: string }[];
|
||||||
|
|
|
@ -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<IProps, IState> {
|
|
||||||
private openDialog = async (): Promise<void> => {
|
|
||||||
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 (
|
|
||||||
<IconizedContextMenuOptionList>
|
|
||||||
<IconizedContextMenuOption
|
|
||||||
iconClassName="mx_UserMenu_iconHosting"
|
|
||||||
label={_t("Upgrade to %(hostSignupBrand)s", {
|
|
||||||
hostSignupBrand: hostSignupConfig.get("brand"),
|
|
||||||
})}
|
|
||||||
onClick={this.openDialog}
|
|
||||||
/>
|
|
||||||
</IconizedContextMenuOptionList>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -47,7 +47,6 @@ import NonUrgentToastContainer from "./NonUrgentToastContainer";
|
||||||
import { IOOBData, IThreepidInvite } from "../../stores/ThreepidInviteStore";
|
import { IOOBData, IThreepidInvite } from "../../stores/ThreepidInviteStore";
|
||||||
import Modal from "../../Modal";
|
import Modal from "../../Modal";
|
||||||
import { ICollapseConfig } from "../../resizer/distributors/collapse";
|
import { ICollapseConfig } from "../../resizer/distributors/collapse";
|
||||||
import HostSignupContainer from "../views/host_signup/HostSignupContainer";
|
|
||||||
import { getKeyBindingsManager } from "../../KeyBindingsManager";
|
import { getKeyBindingsManager } from "../../KeyBindingsManager";
|
||||||
import { IOpts } from "../../createRoom";
|
import { IOpts } from "../../createRoom";
|
||||||
import SpacePanel from "../views/spaces/SpacePanel";
|
import SpacePanel from "../views/spaces/SpacePanel";
|
||||||
|
@ -695,7 +694,6 @@ class LoggedInView extends React.Component<IProps, IState> {
|
||||||
</div>
|
</div>
|
||||||
<PipContainer />
|
<PipContainer />
|
||||||
<NonUrgentToastContainer />
|
<NonUrgentToastContainer />
|
||||||
<HostSignupContainer />
|
|
||||||
{audioFeedArraysForCalls}
|
{audioFeedArraysForCalls}
|
||||||
</MatrixClientContext.Provider>
|
</MatrixClientContext.Provider>
|
||||||
);
|
);
|
||||||
|
|
|
@ -43,7 +43,6 @@ import IconizedContextMenu, {
|
||||||
IconizedContextMenuOptionList,
|
IconizedContextMenuOptionList,
|
||||||
} from "../views/context_menus/IconizedContextMenu";
|
} from "../views/context_menus/IconizedContextMenu";
|
||||||
import { UIFeature } from "../../settings/UIFeature";
|
import { UIFeature } from "../../settings/UIFeature";
|
||||||
import HostSignupAction from "./HostSignupAction";
|
|
||||||
import SpaceStore from "../../stores/spaces/SpaceStore";
|
import SpaceStore from "../../stores/spaces/SpaceStore";
|
||||||
import { UPDATE_SELECTED_SPACE } from "../../stores/spaces";
|
import { UPDATE_SELECTED_SPACE } from "../../stores/spaces";
|
||||||
import UserIdentifierCustomisations from "../../customisations/UserIdentifier";
|
import UserIdentifierCustomisations from "../../customisations/UserIdentifier";
|
||||||
|
@ -290,7 +289,6 @@ export default class UserMenu extends React.Component<IProps, IState> {
|
||||||
if (!this.state.contextMenuPosition) return null;
|
if (!this.state.contextMenuPosition) return null;
|
||||||
|
|
||||||
let topSection;
|
let topSection;
|
||||||
const hostSignupConfig = SdkConfig.getObject("host_signup");
|
|
||||||
if (MatrixClientPeg.get().isGuest()) {
|
if (MatrixClientPeg.get().isGuest()) {
|
||||||
topSection = (
|
topSection = (
|
||||||
<div className="mx_UserMenu_contextMenu_header mx_UserMenu_contextMenu_guestPrompts">
|
<div className="mx_UserMenu_contextMenu_header mx_UserMenu_contextMenu_guestPrompts">
|
||||||
|
@ -318,15 +316,6 @@ export default class UserMenu extends React.Component<IProps, IState> {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
} 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 = <HostSignupAction onClick={this.onCloseMenu} />;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let homeButton = null;
|
let homeButton = 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<IProps, IState> {
|
|
||||||
private iframeRef: React.RefObject<HTMLIFrameElement> = React.createRef();
|
|
||||||
private readonly config: SnakedObject<IConfigOptions["host_signup"]>;
|
|
||||||
|
|
||||||
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<void> => {
|
|
||||||
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<void> => {
|
|
||||||
window.removeEventListener("message", this.messageHandler);
|
|
||||||
// Finally clear the flag in
|
|
||||||
return HostSignupStore.instance.setHostSignupActive(false);
|
|
||||||
};
|
|
||||||
|
|
||||||
private onCloseClick = async (): Promise<void> => {
|
|
||||||
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<void> {
|
|
||||||
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<void> => {
|
|
||||||
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 = (
|
|
||||||
<>
|
|
||||||
<p>
|
|
||||||
{_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"),
|
|
||||||
},
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{_t(
|
|
||||||
"Learn more in our <privacyPolicyLink />, <termsOfServiceLink /> and <cookiePolicyLink />.",
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
cookiePolicyLink: () => (
|
|
||||||
<a href={cookiePolicyUrl} target="_blank" rel="noreferrer noopener">
|
|
||||||
{_t("Cookie Policy")}
|
|
||||||
</a>
|
|
||||||
),
|
|
||||||
privacyPolicyLink: () => (
|
|
||||||
<a href={privacyPolicyUrl} target="_blank" rel="noreferrer noopener">
|
|
||||||
{_t("Privacy Policy")}
|
|
||||||
</a>
|
|
||||||
),
|
|
||||||
termsOfServiceLink: () => (
|
|
||||||
<a href={tosUrl} target="_blank" rel="noreferrer noopener">
|
|
||||||
{_t("Terms of Service")}
|
|
||||||
</a>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
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 (
|
|
||||||
<div className={classNames({ mx_Dialog_wrapper: !this.state.minimized })}>
|
|
||||||
<div
|
|
||||||
className={classNames("mx_Dialog", {
|
|
||||||
mx_HostSignupDialog_minimized: this.state.minimized,
|
|
||||||
mx_HostSignupDialog: !this.state.minimized,
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
{this.state.minimized && (
|
|
||||||
<div className="mx_Dialog_header mx_Dialog_headerWithButton">
|
|
||||||
<div className="mx_Dialog_title">
|
|
||||||
{_t("%(hostSignupBrand)s Setup", {
|
|
||||||
hostSignupBrand: this.config.get("brand"),
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
<AccessibleButton
|
|
||||||
className="mx_HostSignup_maximize_button"
|
|
||||||
onClick={this.maximizeDialog}
|
|
||||||
aria-label={_t("Maximise dialog")}
|
|
||||||
title={_t("Maximise dialog")}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{!this.state.minimized && (
|
|
||||||
<div className="mx_Dialog_header mx_Dialog_headerWithCancel">
|
|
||||||
<AccessibleButton
|
|
||||||
onClick={this.minimizeDialog}
|
|
||||||
className="mx_HostSignup_minimize_button"
|
|
||||||
aria-label={_t("Minimise dialog")}
|
|
||||||
title={_t("Minimise dialog")}
|
|
||||||
/>
|
|
||||||
<AccessibleButton
|
|
||||||
onClick={this.onCloseClick}
|
|
||||||
className="mx_Dialog_cancelButton"
|
|
||||||
aria-label={_t("Close dialog")}
|
|
||||||
title={_t("Close dialog")}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{this.state.error && <div>{this.state.error}</div>}
|
|
||||||
{!this.state.error && (
|
|
||||||
<iframe
|
|
||||||
title={_t("Upgrade to %(hostSignupBrand)s", {
|
|
||||||
hostSignupBrand: this.config.get("brand"),
|
|
||||||
})}
|
|
||||||
src={this.config.get("url")}
|
|
||||||
ref={this.iframeRef}
|
|
||||||
sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export enum PostmessageAction {
|
|
||||||
CloseDialog = "close_dialog",
|
|
||||||
HostSignupAccountDetails = "host_signup_account_details",
|
|
||||||
HostSignupAccountDetailsRequest = "host_signup_account_details_request",
|
|
||||||
Minimize = "host_signup_minimize",
|
|
||||||
Maximize = "host_signup_maximize",
|
|
||||||
SetupComplete = "setup_complete",
|
|
||||||
}
|
|
||||||
|
|
||||||
interface IAccountData {
|
|
||||||
accessToken: string;
|
|
||||||
name: string;
|
|
||||||
openIdToken: string;
|
|
||||||
serverName: string;
|
|
||||||
userLocalpart: string;
|
|
||||||
termsAccepted: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPostmessageRequestData {
|
|
||||||
action: PostmessageAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPostmessageResponseData {
|
|
||||||
action: PostmessageAction;
|
|
||||||
account?: IAccountData;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IPostmessage {
|
|
||||||
data: IPostmessageRequestData;
|
|
||||||
origin: string;
|
|
||||||
}
|
|
|
@ -1,33 +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, { useState } from "react";
|
|
||||||
|
|
||||||
import HostSignupDialog from "../dialogs/HostSignupDialog";
|
|
||||||
import { HostSignupStore } from "../../../stores/HostSignupStore";
|
|
||||||
import { useEventEmitter } from "../../../hooks/useEventEmitter";
|
|
||||||
import { UPDATE_EVENT } from "../../../stores/AsyncStore";
|
|
||||||
|
|
||||||
const HostSignupContainer: React.FC = () => {
|
|
||||||
const [isActive, setIsActive] = useState(HostSignupStore.instance.isHostSignupActive);
|
|
||||||
useEventEmitter(HostSignupStore.instance, UPDATE_EVENT, () => {
|
|
||||||
setIsActive(HostSignupStore.instance.isHostSignupActive);
|
|
||||||
});
|
|
||||||
|
|
||||||
return <div className="mx_HostSignupContainer">{isActive && <HostSignupDialog />}</div>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default HostSignupContainer;
|
|
|
@ -20,14 +20,12 @@ import { logger } from "matrix-js-sdk/src/logger";
|
||||||
import { _t } from "../../../languageHandler";
|
import { _t } from "../../../languageHandler";
|
||||||
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
import { MatrixClientPeg } from "../../../MatrixClientPeg";
|
||||||
import Field from "../elements/Field";
|
import Field from "../elements/Field";
|
||||||
import { getHostingLink } from "../../../utils/HostingLink";
|
|
||||||
import { OwnProfileStore } from "../../../stores/OwnProfileStore";
|
import { OwnProfileStore } from "../../../stores/OwnProfileStore";
|
||||||
import Modal from "../../../Modal";
|
import Modal from "../../../Modal";
|
||||||
import ErrorDialog from "../dialogs/ErrorDialog";
|
import ErrorDialog from "../dialogs/ErrorDialog";
|
||||||
import { mediaFromMxc } from "../../../customisations/Media";
|
import { mediaFromMxc } from "../../../customisations/Media";
|
||||||
import AccessibleButton from "../elements/AccessibleButton";
|
import AccessibleButton from "../elements/AccessibleButton";
|
||||||
import AvatarSetting from "./AvatarSetting";
|
import AvatarSetting from "./AvatarSetting";
|
||||||
import ExternalLink from "../elements/ExternalLink";
|
|
||||||
import UserIdentifierCustomisations from "../../../customisations/UserIdentifier";
|
import UserIdentifierCustomisations from "../../../customisations/UserIdentifier";
|
||||||
import { chromeFileInputFix } from "../../../utils/BrowserWorkarounds";
|
import { chromeFileInputFix } from "../../../utils/BrowserWorkarounds";
|
||||||
import PosthogTrackers from "../../../PosthogTrackers";
|
import PosthogTrackers from "../../../PosthogTrackers";
|
||||||
|
@ -161,26 +159,6 @@ export default class ProfileSettings extends React.Component<{}, IState> {
|
||||||
};
|
};
|
||||||
|
|
||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
const hostingSignupLink = getHostingLink("user-settings");
|
|
||||||
let hostingSignup: JSX.Element | undefined;
|
|
||||||
if (hostingSignupLink) {
|
|
||||||
hostingSignup = (
|
|
||||||
<span>
|
|
||||||
{_t(
|
|
||||||
"<a>Upgrade</a> to your own domain",
|
|
||||||
{},
|
|
||||||
{
|
|
||||||
a: (sub) => (
|
|
||||||
<ExternalLink href={hostingSignupLink} target="_blank" rel="noreferrer noopener">
|
|
||||||
{sub}
|
|
||||||
</ExternalLink>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(this.state.userId, {
|
const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(this.state.userId, {
|
||||||
withDisplayName: true,
|
withDisplayName: true,
|
||||||
});
|
});
|
||||||
|
@ -216,7 +194,6 @@ export default class ProfileSettings extends React.Component<{}, IState> {
|
||||||
{userIdentifier && (
|
{userIdentifier && (
|
||||||
<span className="mx_ProfileSettings_profile_controls_userId">{userIdentifier}</span>
|
<span className="mx_ProfileSettings_profile_controls_userId">{userIdentifier}</span>
|
||||||
)}
|
)}
|
||||||
{hostingSignup}
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<AvatarSetting
|
<AvatarSetting
|
||||||
|
|
|
@ -1447,7 +1447,6 @@
|
||||||
"There was an error loading your notification settings.": "There was an error loading your notification settings.",
|
"There was an error loading your notification settings.": "There was an error loading your notification settings.",
|
||||||
"Failed to save your profile": "Failed to save your profile",
|
"Failed to save your profile": "Failed to save your profile",
|
||||||
"The operation could not be completed": "The operation could not be completed",
|
"The operation could not be completed": "The operation could not be completed",
|
||||||
"<a>Upgrade</a> to your own domain": "<a>Upgrade</a> to your own domain",
|
|
||||||
"Profile picture": "Profile picture",
|
"Profile picture": "Profile picture",
|
||||||
"Save": "Save",
|
"Save": "Save",
|
||||||
"Delete Backup": "Delete Backup",
|
"Delete Backup": "Delete Backup",
|
||||||
|
@ -2824,20 +2823,6 @@
|
||||||
"Search for rooms or people": "Search for rooms or people",
|
"Search for rooms or people": "Search for rooms or people",
|
||||||
"Feedback sent! Thanks, we appreciate it!": "Feedback sent! Thanks, we appreciate it!",
|
"Feedback sent! Thanks, we appreciate it!": "Feedback sent! Thanks, we appreciate it!",
|
||||||
"You may contact me if you have any follow up questions": "You may contact me if you have any follow up questions",
|
"You may contact me if you have any follow up questions": "You may contact me if you have any follow up questions",
|
||||||
"Confirm abort of host creation": "Confirm abort of host creation",
|
|
||||||
"Are you sure you wish to abort creation of the host? The process cannot be continued.": "Are you sure you wish to abort creation of the host? The process cannot be continued.",
|
|
||||||
"Abort": "Abort",
|
|
||||||
"Failed to connect to your homeserver. Please close this dialog and try again.": "Failed to connect to your homeserver. Please close this dialog and try again.",
|
|
||||||
"Continuing temporarily allows the %(hostSignupBrand)s setup process to access your account to fetch verified email addresses. This data is not stored.": "Continuing temporarily allows the %(hostSignupBrand)s setup process to access your account to fetch verified email addresses. This data is not stored.",
|
|
||||||
"Learn more in our <privacyPolicyLink />, <termsOfServiceLink /> and <cookiePolicyLink />.": "Learn more in our <privacyPolicyLink />, <termsOfServiceLink /> and <cookiePolicyLink />.",
|
|
||||||
"Cookie Policy": "Cookie Policy",
|
|
||||||
"Privacy Policy": "Privacy Policy",
|
|
||||||
"Terms of Service": "Terms of Service",
|
|
||||||
"You should know": "You should know",
|
|
||||||
"%(hostSignupBrand)s Setup": "%(hostSignupBrand)s Setup",
|
|
||||||
"Maximise dialog": "Maximise dialog",
|
|
||||||
"Minimise dialog": "Minimise dialog",
|
|
||||||
"Upgrade to %(hostSignupBrand)s": "Upgrade to %(hostSignupBrand)s",
|
|
||||||
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.",
|
"Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.",
|
||||||
"Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.",
|
"Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.",
|
||||||
"Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.",
|
"Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.",
|
||||||
|
@ -3036,6 +3021,7 @@
|
||||||
"Find others by phone or email": "Find others by phone or email",
|
"Find others by phone or email": "Find others by phone or email",
|
||||||
"Be found by phone or email": "Be found by phone or email",
|
"Be found by phone or email": "Be found by phone or email",
|
||||||
"Use bots, bridges, widgets and sticker packs": "Use bots, bridges, widgets and sticker packs",
|
"Use bots, bridges, widgets and sticker packs": "Use bots, bridges, widgets and sticker packs",
|
||||||
|
"Terms of Service": "Terms of Service",
|
||||||
"To continue you need to accept the terms of this service.": "To continue you need to accept the terms of this service.",
|
"To continue you need to accept the terms of this service.": "To continue you need to accept the terms of this service.",
|
||||||
"Service": "Service",
|
"Service": "Service",
|
||||||
"Summary": "Summary",
|
"Summary": "Summary",
|
||||||
|
|
|
@ -1,49 +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 defaultDispatcher from "../dispatcher/dispatcher";
|
|
||||||
import { AsyncStore } from "./AsyncStore";
|
|
||||||
import { ActionPayload } from "../dispatcher/payloads";
|
|
||||||
|
|
||||||
interface IState {
|
|
||||||
hostSignupActive: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class HostSignupStore extends AsyncStore<IState> {
|
|
||||||
private static internalInstance = new HostSignupStore();
|
|
||||||
|
|
||||||
private constructor() {
|
|
||||||
super(defaultDispatcher, { hostSignupActive: false });
|
|
||||||
}
|
|
||||||
|
|
||||||
public static get instance(): HostSignupStore {
|
|
||||||
return HostSignupStore.internalInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public get isHostSignupActive(): boolean {
|
|
||||||
return this.state.hostSignupActive;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async setHostSignupActive(status: boolean): Promise<void> {
|
|
||||||
return this.updateState({
|
|
||||||
hostSignupActive: status,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected onDispatch(payload: ActionPayload): void {
|
|
||||||
// Nothing to do
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2019 New Vector Ltd.
|
|
||||||
|
|
||||||
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 SdkConfig from "../SdkConfig";
|
|
||||||
import { MatrixClientPeg } from "../MatrixClientPeg";
|
|
||||||
|
|
||||||
export function getHostingLink(campaign: string): string | null {
|
|
||||||
const hostingLink = SdkConfig.get().hosting_signup_link;
|
|
||||||
if (!hostingLink) return null;
|
|
||||||
if (!campaign) return hostingLink;
|
|
||||||
|
|
||||||
if (MatrixClientPeg.get().getDomain() !== "matrix.org") return null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const hostingUrl = new URL(hostingLink);
|
|
||||||
hostingUrl.searchParams.set("utm_campaign", campaign);
|
|
||||||
return hostingUrl.toString();
|
|
||||||
} catch (e) {
|
|
||||||
return hostingLink;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue