typescript-ifying PasswordLoginViewModel

This commit is contained in:
Isaiah Becker-Mayer 2022-08-14 11:05:13 -07:00
parent c898bcb46a
commit 749e038a47
2 changed files with 24 additions and 14 deletions

View File

@ -16,7 +16,7 @@ limitations under the License.
import {Client} from "../../matrix/Client.js";
import {Options as BaseOptions, ViewModel} from "../ViewModel";
import {PasswordLoginViewModel} from "./PasswordLoginViewModel.js";
import {PasswordLoginViewModel} from "./PasswordLoginViewModel";
import {StartSSOLoginViewModel} from "./StartSSOLoginViewModel.js";
import {CompleteSSOLoginViewModel} from "./CompleteSSOLoginViewModel.js";
import {LoadStatus} from "../../matrix/Client.js";
@ -60,7 +60,7 @@ export class LoginViewModel extends ViewModel<SegmentType, Options> {
this._initViewModels();
}
get passwordLoginViewModel(): PasswordLoginViewModel {
get passwordLoginViewModel(): PasswordLoginViewModel | undefined {
return this._passwordLoginViewModel;
}
@ -285,7 +285,7 @@ export class LoginViewModel extends ViewModel<SegmentType, Options> {
type ReadyFn = (client: Client) => void;
// TODO: move to Client.js when its converted to typescript.
type LoginOptions = {
export type LoginOptions = {
homeserver: string;
password?: (username: string, password: string) => PasswordLoginMethod;
sso?: SSOLoginHelper;

View File

@ -14,43 +14,53 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import {ViewModel} from "../ViewModel";
import {LoginFailure} from "../../matrix/Client.js";
import type {PasswordLoginMethod} from "../../matrix/login";
import {Options as BaseOptions, ViewModel} from "../ViewModel";
import type {LoginOptions} from "./LoginViewModel";
type Options = {
loginOptions: LoginOptions | undefined;
attemptLogin: (loginMethod: PasswordLoginMethod) => Promise<null>;
} & BaseOptions
export class PasswordLoginViewModel extends ViewModel {
constructor(options) {
private _loginOptions?: LoginOptions;
private _attemptLogin: (loginMethod: PasswordLoginMethod) => Promise<null>;
private _isBusy = false;
private _errorMessage = "";
constructor(options: Options) {
super(options);
const {loginOptions, attemptLogin} = options;
this._loginOptions = loginOptions;
this._attemptLogin = attemptLogin;
this._isBusy = false;
this._errorMessage = "";
}
get isBusy() { return this._isBusy; }
get errorMessage() { return this._errorMessage; }
get isBusy(): boolean { return this._isBusy; }
get errorMessage(): string { return this._errorMessage; }
setBusy(status) {
setBusy(status: boolean): void {
this._isBusy = status;
this.emitChange("isBusy");
}
_showError(message) {
_showError(message: string): void {
this._errorMessage = message;
this.emitChange("errorMessage");
}
async login(username, password) {
async login(username: string, password: string): Promise<void>{
this._errorMessage = "";
this.emitChange("errorMessage");
const status = await this._attemptLogin(this._loginOptions.password(username, password));
const status = await this._attemptLogin(this._loginOptions!.password!(username, password));
let error = "";
switch (status) {
case LoginFailure.Credentials:
error = this.i18n`Your username and/or password don't seem to be correct.`;
break;
case LoginFailure.Connection:
error = this.i18n`Can't connect to ${this._loginOptions.homeserver}.`;
error = this.i18n`Can't connect to ${this._loginOptions!.homeserver}.`;
break;
case LoginFailure.Unknown:
error = this.i18n`Something went wrong while checking your login and password.`;