diff --git a/src/Lifecycle.js b/src/Lifecycle.js index f32f105889..4d62e6bb46 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -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); +} \ No newline at end of file diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e0bbf50d5a..dc2c1cb90b 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -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;