diff --git a/src/domain/login/LoginViewModel.ts b/src/domain/login/LoginViewModel.ts index 8eb11a9e..40f4b5f7 100644 --- a/src/domain/login/LoginViewModel.ts +++ b/src/domain/login/LoginViewModel.ts @@ -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 { this._initViewModels(); } - get passwordLoginViewModel(): PasswordLoginViewModel { + get passwordLoginViewModel(): PasswordLoginViewModel | undefined { return this._passwordLoginViewModel; } @@ -285,7 +285,7 @@ export class LoginViewModel extends ViewModel { 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; diff --git a/src/domain/login/PasswordLoginViewModel.js b/src/domain/login/PasswordLoginViewModel.ts similarity index 66% rename from src/domain/login/PasswordLoginViewModel.js rename to src/domain/login/PasswordLoginViewModel.ts index 7c4ff78a..6b4d9978 100644 --- a/src/domain/login/PasswordLoginViewModel.js +++ b/src/domain/login/PasswordLoginViewModel.ts @@ -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; +} & BaseOptions export class PasswordLoginViewModel extends ViewModel { - constructor(options) { + private _loginOptions?: LoginOptions; + private _attemptLogin: (loginMethod: PasswordLoginMethod) => Promise; + 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{ 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.`;