2022-08-22 18:29:33 +02:00
|
|
|
/*
|
|
|
|
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 {Options as BaseOptions, ViewModel} from "./ViewModel";
|
|
|
|
import {Client} from "../matrix/Client.js";
|
|
|
|
import {SegmentType} from "./navigation/index";
|
|
|
|
|
|
|
|
type Options = { sessionId: string; } & BaseOptions;
|
|
|
|
|
|
|
|
export class ForcedLogoutViewModel extends ViewModel<SegmentType, Options> {
|
|
|
|
private _sessionId: string;
|
|
|
|
private _error?: Error;
|
|
|
|
private _logoutPromise: Promise<void>;
|
2022-08-24 16:01:38 +02:00
|
|
|
private _showStatus: boolean = false;
|
|
|
|
private _showSpinner: boolean = false;
|
2022-08-22 18:29:33 +02:00
|
|
|
|
|
|
|
constructor(options: Options) {
|
|
|
|
super(options);
|
|
|
|
this._sessionId = options.sessionId;
|
2022-08-26 11:13:41 +02:00
|
|
|
// Start the logout process immediately without any user interaction
|
2022-08-22 18:29:33 +02:00
|
|
|
this._logoutPromise = this.forceLogout();
|
|
|
|
}
|
|
|
|
|
|
|
|
async forceLogout(): Promise<void> {
|
|
|
|
try {
|
|
|
|
const client = new Client(this.platform);
|
|
|
|
await client.startForcedLogout(this._sessionId);
|
|
|
|
}
|
|
|
|
catch (err) {
|
|
|
|
this._error = err;
|
2022-08-26 11:13:41 +02:00
|
|
|
// Show the error in the UI
|
2022-08-24 16:01:38 +02:00
|
|
|
this._showSpinner = false;
|
|
|
|
this._showStatus = true;
|
2022-08-22 18:29:33 +02:00
|
|
|
this.emitChange("error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async proceed(): Promise<void> {
|
2022-08-26 11:13:41 +02:00
|
|
|
/**
|
|
|
|
* The logout should already be completed because we started it from the ctor.
|
|
|
|
* In case the logout is still proceeding, we will show a message with a spinner.
|
|
|
|
*/
|
2022-08-24 16:01:38 +02:00
|
|
|
this._showSpinner = true;
|
|
|
|
this._showStatus = true;
|
|
|
|
this.emitChange("showStatus");
|
2022-08-22 18:29:33 +02:00
|
|
|
await this._logoutPromise;
|
2022-08-26 11:13:41 +02:00
|
|
|
// At this point, the logout is completed for sure.
|
2022-08-24 16:01:38 +02:00
|
|
|
if (!this._error) {
|
2022-08-26 11:16:15 +02:00
|
|
|
this.navigation.push("login", true);
|
2022-08-24 16:01:38 +02:00
|
|
|
}
|
2022-08-22 18:29:33 +02:00
|
|
|
}
|
|
|
|
|
2022-08-24 16:01:38 +02:00
|
|
|
get status(): string {
|
2022-08-22 18:29:33 +02:00
|
|
|
if (this._error) {
|
|
|
|
return this.i18n`Could not log out of device: ${this._error.message}`;
|
2022-08-24 16:01:38 +02:00
|
|
|
} else {
|
|
|
|
return this.i18n`Logging out… Please don't close the app.`;
|
2022-08-22 18:29:33 +02:00
|
|
|
}
|
|
|
|
}
|
2022-08-24 16:01:38 +02:00
|
|
|
|
|
|
|
get showStatus(): boolean {
|
|
|
|
return this._showStatus;
|
|
|
|
}
|
|
|
|
|
|
|
|
get showSpinner(): boolean {
|
|
|
|
return this._showSpinner;
|
|
|
|
}
|
2022-08-22 18:29:33 +02:00
|
|
|
}
|