mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-16 13:14:58 +08:00
Merge remote-tracking branch 'origin/develop' into travis/terms/inline-is-only
This commit is contained in:
commit
2456912ec7
52
src/boundThreepids.js
Normal file
52
src/boundThreepids.js
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
Copyright 2019 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 IdentityAuthClient from './IdentityAuthClient';
|
||||
|
||||
export async function getThreepidBindStatus(client, filterMedium) {
|
||||
const userId = client.getUserId();
|
||||
|
||||
let { threepids } = await client.getThreePids();
|
||||
if (filterMedium) {
|
||||
threepids = threepids.filter((a) => a.medium === filterMedium);
|
||||
}
|
||||
|
||||
if (threepids.length > 0) {
|
||||
// TODO: Handle terms agreement
|
||||
// See https://github.com/vector-im/riot-web/issues/10522
|
||||
const authClient = new IdentityAuthClient();
|
||||
const identityAccessToken = await authClient.getAccessToken();
|
||||
|
||||
// Restructure for lookup query
|
||||
const query = threepids.map(({ medium, address }) => [medium, address]);
|
||||
const lookupResults = await client.bulkLookupThreePids(query, identityAccessToken);
|
||||
|
||||
// Record which are already bound
|
||||
for (const [medium, address, mxid] of lookupResults.threepids) {
|
||||
if (mxid !== userId) {
|
||||
continue;
|
||||
}
|
||||
if (filterMedium && medium !== filterMedium) {
|
||||
continue;
|
||||
}
|
||||
const threepid = threepids.find(e => e.medium === medium && e.address === address);
|
||||
if (!threepid) continue;
|
||||
threepid.bound = true;
|
||||
}
|
||||
}
|
||||
|
||||
return threepids;
|
||||
}
|
@ -22,6 +22,7 @@ import MatrixClientPeg from "../../../MatrixClientPeg";
|
||||
import SdkConfig from "../../../SdkConfig";
|
||||
import Modal from '../../../Modal';
|
||||
import dis from "../../../dispatcher";
|
||||
import { getThreepidBindStatus } from '../../../boundThreepids';
|
||||
import IdentityAuthClient from "../../../IdentityAuthClient";
|
||||
import {SERVICE_TYPES} from "matrix-js-sdk";
|
||||
|
||||
@ -100,6 +101,7 @@ export default class SetIdServer extends React.Component {
|
||||
idServer: defaultIdServer,
|
||||
error: null,
|
||||
busy: false,
|
||||
disconnectBusy: false,
|
||||
checking: false,
|
||||
};
|
||||
}
|
||||
@ -193,24 +195,45 @@ export default class SetIdServer extends React.Component {
|
||||
});
|
||||
};
|
||||
|
||||
_onDisconnectClicked = () => {
|
||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||
Modal.createTrackedDialog('Identity Server Disconnect Warning', '', QuestionDialog, {
|
||||
title: _t("Disconnect Identity Server"),
|
||||
description:
|
||||
<div>
|
||||
{_t(
|
||||
"Disconnect from the identity server <idserver />?", {},
|
||||
{idserver: sub => <b>{abbreviateUrl(this.state.currentClientIdServer)}</b>},
|
||||
)},
|
||||
</div>,
|
||||
button: _t("Disconnect"),
|
||||
onFinished: (confirmed) => {
|
||||
if (confirmed) {
|
||||
this._disconnectIdServer();
|
||||
}
|
||||
},
|
||||
});
|
||||
_onDisconnectClicked = async () => {
|
||||
this.setState({disconnectBusy: true});
|
||||
try {
|
||||
const threepids = await getThreepidBindStatus(MatrixClientPeg.get());
|
||||
|
||||
const boundThreepids = threepids.filter(tp => tp.bound);
|
||||
let message;
|
||||
if (boundThreepids.length) {
|
||||
message = _t(
|
||||
"You are currently sharing email addresses or phone numbers on the identity " +
|
||||
"server <idserver />. You will need to reconnect to <idserver2 /> to stop " +
|
||||
"sharing them.", {},
|
||||
{
|
||||
idserver: sub => <b>{abbreviateUrl(this.state.currentClientIdServer)}</b>,
|
||||
// XXX: https://github.com/vector-im/riot-web/issues/9086
|
||||
idserver2: sub => <b>{abbreviateUrl(this.state.currentClientIdServer)}</b>,
|
||||
},
|
||||
);
|
||||
} else {
|
||||
message = _t(
|
||||
"Disconnect from the identity server <idserver />?", {},
|
||||
{idserver: sub => <b>{abbreviateUrl(this.state.currentClientIdServer)}</b>},
|
||||
);
|
||||
}
|
||||
|
||||
const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||
Modal.createTrackedDialog('Identity Server Disconnect Warning', '', QuestionDialog, {
|
||||
title: _t("Disconnect Identity Server"),
|
||||
description: message,
|
||||
button: _t("Disconnect"),
|
||||
onFinished: (confirmed) => {
|
||||
if (confirmed) {
|
||||
this._disconnectIdServer();
|
||||
}
|
||||
},
|
||||
});
|
||||
} finally {
|
||||
this.setState({disconnectBusy: false});
|
||||
}
|
||||
};
|
||||
|
||||
_disconnectIdServer = () => {
|
||||
@ -258,6 +281,11 @@ export default class SetIdServer extends React.Component {
|
||||
|
||||
let discoSection;
|
||||
if (idServerUrl) {
|
||||
let discoButtonContent = _t("Disconnect");
|
||||
if (this.state.disconnectBusy) {
|
||||
const InlineSpinner = sdk.getComponent('views.elements.InlineSpinner');
|
||||
discoButtonContent = <InlineSpinner />;
|
||||
}
|
||||
discoSection = <div>
|
||||
<span className="mx_SettingsTab_subsectionText">{_t(
|
||||
"Disconnecting from your identity server will mean you " +
|
||||
@ -265,7 +293,7 @@ export default class SetIdServer extends React.Component {
|
||||
"able to invite others by email or phone.",
|
||||
)}</span>
|
||||
<AccessibleButton onClick={this._onDisconnectClicked} kind="danger">
|
||||
{_t("Disconnect")}
|
||||
{discoButtonContent}
|
||||
</AccessibleButton>
|
||||
</div>;
|
||||
}
|
||||
|
@ -22,8 +22,8 @@ import { _t } from "../../../../languageHandler";
|
||||
import MatrixClientPeg from "../../../../MatrixClientPeg";
|
||||
import sdk from '../../../../index';
|
||||
import Modal from '../../../../Modal';
|
||||
import IdentityAuthClient from '../../../../IdentityAuthClient';
|
||||
import AddThreepid from '../../../../AddThreepid';
|
||||
import { getThreepidBindStatus } from '../../../../boundThreepids';
|
||||
|
||||
/*
|
||||
TODO: Improve the UX for everything in here.
|
||||
@ -198,31 +198,8 @@ export default class EmailAddresses extends React.Component {
|
||||
|
||||
async componentWillMount() {
|
||||
const client = MatrixClientPeg.get();
|
||||
const userId = client.getUserId();
|
||||
|
||||
const { threepids } = await client.getThreePids();
|
||||
const emails = threepids.filter((a) => a.medium === 'email');
|
||||
|
||||
if (emails.length > 0) {
|
||||
// TODO: Handle terms agreement
|
||||
// See https://github.com/vector-im/riot-web/issues/10522
|
||||
const authClient = new IdentityAuthClient();
|
||||
const identityAccessToken = await authClient.getAccessToken();
|
||||
|
||||
// Restructure for lookup query
|
||||
const query = emails.map(({ medium, address }) => [medium, address]);
|
||||
const lookupResults = await client.bulkLookupThreePids(query, identityAccessToken);
|
||||
|
||||
// Record which are already bound
|
||||
for (const [medium, address, mxid] of lookupResults.threepids) {
|
||||
if (medium !== "email" || mxid !== userId) {
|
||||
continue;
|
||||
}
|
||||
const email = emails.find(e => e.address === address);
|
||||
if (!email) continue;
|
||||
email.bound = true;
|
||||
}
|
||||
}
|
||||
const emails = await getThreepidBindStatus(client, 'email');
|
||||
|
||||
this.setState({ emails });
|
||||
}
|
||||
|
@ -22,8 +22,8 @@ import { _t } from "../../../../languageHandler";
|
||||
import MatrixClientPeg from "../../../../MatrixClientPeg";
|
||||
import sdk from '../../../../index';
|
||||
import Modal from '../../../../Modal';
|
||||
import IdentityAuthClient from '../../../../IdentityAuthClient';
|
||||
import AddThreepid from '../../../../AddThreepid';
|
||||
import { getThreepidBindStatus } from '../../../../boundThreepids';
|
||||
|
||||
/*
|
||||
TODO: Improve the UX for everything in here.
|
||||
@ -217,31 +217,8 @@ export default class PhoneNumbers extends React.Component {
|
||||
|
||||
async componentWillMount() {
|
||||
const client = MatrixClientPeg.get();
|
||||
const userId = client.getUserId();
|
||||
|
||||
const { threepids } = await client.getThreePids();
|
||||
const msisdns = threepids.filter((a) => a.medium === 'msisdn');
|
||||
|
||||
if (msisdns.length > 0) {
|
||||
// TODO: Handle terms agreement
|
||||
// See https://github.com/vector-im/riot-web/issues/10522
|
||||
const authClient = new IdentityAuthClient();
|
||||
const identityAccessToken = await authClient.getAccessToken();
|
||||
|
||||
// Restructure for lookup query
|
||||
const query = msisdns.map(({ medium, address }) => [medium, address]);
|
||||
const lookupResults = await client.bulkLookupThreePids(query, identityAccessToken);
|
||||
|
||||
// Record which are already bound
|
||||
for (const [medium, address, mxid] of lookupResults.threepids) {
|
||||
if (medium !== "msisdn" || mxid !== userId) {
|
||||
continue;
|
||||
}
|
||||
const msisdn = msisdns.find(e => e.address === address);
|
||||
if (!msisdn) continue;
|
||||
msisdn.bound = true;
|
||||
}
|
||||
}
|
||||
const msisdns = await getThreepidBindStatus(client, 'msisdn');
|
||||
|
||||
this.setState({ msisdns });
|
||||
}
|
||||
|
@ -548,12 +548,13 @@
|
||||
"Not a valid Identity Server (status code %(code)s)": "Not a valid Identity Server (status code %(code)s)",
|
||||
"Could not connect to Identity Server": "Could not connect to Identity Server",
|
||||
"Checking server": "Checking server",
|
||||
"You are currently sharing email addresses or phone numbers on the identity server <idserver />. You will need to reconnect to <idserver2 /> to stop sharing them.": "You are currently sharing email addresses or phone numbers on the identity server <idserver />. You will need to reconnect to <idserver2 /> to stop sharing them.",
|
||||
"Disconnect from the identity server <idserver />?": "Disconnect from the identity server <idserver />?",
|
||||
"Identity server has no terms of service": "Identity server has no terms of service",
|
||||
"The identity server you have chosen does not have any terms of service.": "The identity server you have chosen does not have any terms of service.",
|
||||
"Only continue if you trust the owner of the server.": "Only continue if you trust the owner of the server.",
|
||||
"Terms of service not accepted or the identity server is invalid.": "Terms of service not accepted or the identity server is invalid.",
|
||||
"Disconnect Identity Server": "Disconnect Identity Server",
|
||||
"Disconnect from the identity server <idserver />?": "Disconnect from the identity server <idserver />?",
|
||||
"Disconnect": "Disconnect",
|
||||
"Identity Server (%(server)s)": "Identity Server (%(server)s)",
|
||||
"You are currently using <server></server> to discover and be discoverable by existing contacts you know. You can change your identity server below.": "You are currently using <server></server> to discover and be discoverable by existing contacts you know. You can change your identity server below.",
|
||||
|
Loading…
Reference in New Issue
Block a user