Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Persist and maintain identity server in account data
Browse files Browse the repository at this point in the history
  • Loading branch information
turt2live committed Aug 16, 2019
1 parent 3228062 commit 51946d2
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 7 deletions.
23 changes: 23 additions & 0 deletions src/components/structures/MatrixChat.js
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,29 @@ export default React.createClass({
}

switch (payload.action) {
case 'MatrixActions.accountData':
// XXX: This is a collection of several hacks to solve a minor problem. We want to
// update our local state when the ID server changes, but don't want to put that in
// the js-sdk as we'd be then dictating how all consumers need to behave. However,
// this component is already bloated and we probably don't want this tiny logic in
// here, but there's no better place in the react-sdk for it. Additionally, we're
// abusing the MatrixActionCreator stuff to avoid errors on dispatches.
if (payload.event_type === 'm.identity_server') {
const fullUrl = payload.event_content ? payload.event_content['base_url'] : null;
if (!fullUrl) {
MatrixClientPeg.get().setIdentityServerUrl(null);
localStorage.removeItem("mx_is_access_token");
localStorage.removeItem("mx_is_url");
} else {
MatrixClientPeg.get().setIdentityServerUrl(fullUrl);
localStorage.removeItem("mx_is_access_token"); // clear token
localStorage.setItem("mx_is_url", fullUrl); // XXX: Do we still need this?
}

// redispatch the change with a more specific action
dis.dispatch({action: 'id_server_changed'});
}
break;
case 'logout':
Lifecycle.logout();
break;
Expand Down
40 changes: 33 additions & 7 deletions src/components/views/settings/SetIdServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,31 @@ export default class SetIdServer extends React.Component {
};
}

componentDidMount(): void {
this.dispatcherRef = dis.register(this.onAction);
}

componentWillUnmount(): void {
dis.unregister(this.dispatcherRef);
}

onAction = (payload) => {
// We react to changes in the ID server in the event the user is staring at this form
// when changing their identity server on another device. If the user is trying to change
// it in two places, we'll end up stomping all over their input, but at that point we
// should question our UX which led to them doing that.
if (payload.action !== "id_server_changed") return;

const fullUrl = MatrixClientPeg.get().getIdentityServerUrl();
let abbr = '';
if (fullUrl) abbr = abbreviateUrl(fullUrl);

this.setState({
currentClientIdServer: fullUrl,
idServer: abbr,
});
};

_onIdentityServerChanged = (ev) => {
const u = ev.target.value;

Expand All @@ -131,10 +156,10 @@ export default class SetIdServer extends React.Component {
};

_continueTerms = (fullUrl) => {
MatrixClientPeg.get().setIdentityServerUrl(fullUrl);
localStorage.removeItem("mx_is_access_token");
localStorage.setItem("mx_is_url", fullUrl);
dis.dispatch({action: 'id_server_changed'});
// Account data change will update localstorage, client, etc through dispatcher
MatrixClientPeg.get().setAccountData("m.identity_server", {
base_url: fullUrl,
});
this.setState({idServer: '', busy: false, error: null});
};

Expand Down Expand Up @@ -237,9 +262,10 @@ export default class SetIdServer extends React.Component {
};

_disconnectIdServer = () => {
MatrixClientPeg.get().setIdentityServerUrl(null);
localStorage.removeItem("mx_is_access_token");
localStorage.removeItem("mx_is_url");
// Account data change will update localstorage, client, etc through dispatcher
MatrixClientPeg.get().setAccountData("m.identity_server", {
base_url: null, // clear
});

let newFieldVal = '';
if (SdkConfig.get()['validated_server_config']['isUrl']) {
Expand Down

0 comments on commit 51946d2

Please sign in to comment.