add action/method to flush storage and reload the session

pull/21833/head
Bruno Windels 2018-08-09 18:41:18 +02:00
parent 028f09e5d1
commit a02e1aa2b2
2 changed files with 37 additions and 0 deletions

View File

@ -499,3 +499,32 @@ export function stopMatrixClient() {
MatrixClientPeg.unset();
}
}
/**
* Clears indexeddb storage and reloads the session
* localStorage is preserved.
*/
export async function flushStorageAndReload() {
// gather the credentials from localStorage as
// MatrixClient.credentials only contains the userId
// (gets cleared somewhere probably)
// this just does the reverse of _persistCredentialsToLocalStorage
const credentials = {
homeserverUrl: localStorage.getItem("mx_hs_url"),
identityServerUrl: localStorage.getItem("mx_is_url"),
userId: localStorage.getItem("mx_user_id"),
accessToken: localStorage.getItem("mx_access_token"),
guest: JSON.parse(localStorage.getItem("mx_is_guest")),
deviceId: localStorage.getItem("mx_device_id"),
};
// stop the client so it's not running anymore
stopMatrixClient();
// create a temporary client to clear out the persistent stores.
const cli = createMatrixClient({
// we'll never make any requests, so can pass a bogus HS URL
baseUrl: "",
});
// clear indexeddb
await cli.clearStores();
// start the session again without clearing storage
_doSetLoggedIn(credentials, false);
}

View File

@ -479,6 +479,14 @@ export default React.createClass({
case 'logout':
Lifecycle.logout();
break;
case 'flush_storage_reload':
// flushStorageAndReload will dispatch actions
// which we can't do in a dispatch handler
// so yield first
setTimeout(() => {
Lifecycle.flushStorageAndReload();
}, 0);
break;
case 'start_registration':
this._startRegistration(payload.params || {});
break;