import { myAuth, setIsoData } from "@utils/app";
import { isBrowser } from "@utils/browser";
-import { validEmail } from "@utils/helpers";
import { Component, linkEvent } from "inferno";
import { GetSiteResponse, LoginResponse } from "lemmy-js-client";
-import { FirstLoadService, I18NextService, UserService } from "../../services";
+import { I18NextService, UserService } from "../../services";
import { HttpService, RequestState } from "../../services/HttpService";
import { toast } from "../../toast";
import { HtmlTags } from "../common/html-tags";
import { Spinner } from "../common/icon";
+import PasswordInput from "../common/password-input";
interface State {
loginRes: RequestState<LoginResponse>;
constructor(props: any, context: any) {
super(props, context);
-
- FirstLoadService.isFirstLoad;
}
componentDidMount() {
return (
<div>
<form onSubmit={linkEvent(this, this.handleLoginSubmit)}>
- <h5>{I18NextService.i18n.t("login")}</h5>
+ <h1 className="h4 mb-4">{I18NextService.i18n.t("login")}</h1>
<div className="mb-3 row">
<label
className="col-sm-2 col-form-label"
/>
</div>
</div>
- <div className="mb-3 row">
- <label className="col-sm-2 col-form-label" htmlFor="login-password">
- {I18NextService.i18n.t("password")}
- </label>
- <div className="col-sm-10">
- <input
- type="password"
- id="login-password"
- value={this.state.form.password}
- onInput={linkEvent(this, this.handleLoginPasswordChange)}
- className="form-control"
- autoComplete="current-password"
- required
- maxLength={60}
- />
- <button
- type="button"
- onClick={linkEvent(this, this.handlePasswordReset)}
- className="btn p-0 btn-link d-inline-block float-right text-muted small font-weight-bold pointer-events not-allowed"
- disabled={
- !!this.state.form.username_or_email &&
- !validEmail(this.state.form.username_or_email)
- }
- title={I18NextService.i18n.t("no_password_reset")}
- >
- {I18NextService.i18n.t("forgot_password")}
- </button>
- </div>
+ <div className="mb-3">
+ <PasswordInput
+ id="login-password"
+ value={this.state.form.password}
+ onInput={linkEvent(this, this.handleLoginPasswordChange)}
+ label={I18NextService.i18n.t("password")}
+ showForgotLink
+ />
</div>
{this.state.showTotp && (
<div className="mb-3 row">
i.setState({ showTotp: true });
toast(I18NextService.i18n.t("enter_two_factor_code"), "info");
}
+ if (loginRes.msg === "incorrect_login") {
+ toast(I18NextService.i18n.t("incorrect_login"), "danger");
+ }
i.setState({ loginRes: { state: "failed", msg: loginRes.msg } });
break;
}
case "success": {
- UserService.Instance.login(loginRes.data);
+ UserService.Instance.login({
+ res: loginRes.data,
+ });
const site = await HttpService.client.getSite({
auth: myAuth(),
});
i.state.form.password = event.target.value;
i.setState(i.state);
}
-
- async handlePasswordReset(i: Login, event: any) {
- event.preventDefault();
- const email = i.state.form.username_or_email;
- if (email) {
- const res = await HttpService.client.passwordReset({ email });
- if (res.state == "success") {
- toast(I18NextService.i18n.t("reset_password_mail_sent"));
- }
- }
- }
}