+import { myAuth, setIsoData } from "@utils/app";
import { isBrowser } from "@utils/browser";
import { Component, linkEvent } from "inferno";
+import { NavLink } from "inferno-router";
import { GetSiteResponse, LoginResponse } from "lemmy-js-client";
-import { i18n } from "../../i18next";
-import { UserService } from "../../services";
+import { I18NextService, UserService } from "../../services";
import { HttpService, RequestState } from "../../services/HttpService";
-import { myAuth, setIsoData, toast, validEmail } from "../../utils";
+import { toast } from "../../toast";
import { HtmlTags } from "../common/html-tags";
import { Spinner } from "../common/icon";
}
get documentTitle(): string {
- return `${i18n.t("login")} - ${this.state.siteRes.site_view.site.name}`;
+ return `${I18NextService.i18n.t("login")} - ${
+ this.state.siteRes.site_view.site.name
+ }`;
}
get isLemmyMl(): boolean {
render() {
return (
- <div className="container-lg">
+ <div className="login container-lg">
<HtmlTags
title={this.documentTitle}
path={this.context.router.route.match.url}
return (
<div>
<form onSubmit={linkEvent(this, this.handleLoginSubmit)}>
- <h5>{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"
htmlFor="login-email-or-username"
>
- {i18n.t("email_or_username")}
+ {I18NextService.i18n.t("email_or_username")}
</label>
<div className="col-sm-10">
<input
</div>
<div className="mb-3 row">
<label className="col-sm-2 col-form-label" htmlFor="login-password">
- {i18n.t("password")}
+ {I18NextService.i18n.t("password")}
</label>
<div className="col-sm-10">
<input
required
maxLength={60}
/>
- <button
- type="button"
- onClick={linkEvent(this, this.handlePasswordReset)}
+ <NavLink
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={i18n.t("no_password_reset")}
+ to="/login_reset"
>
- {i18n.t("forgot_password")}
- </button>
+ {I18NextService.i18n.t("forgot_password")}
+ </NavLink>
</div>
</div>
{this.state.showTotp && (
className="col-sm-6 col-form-label"
htmlFor="login-totp-token"
>
- {i18n.t("two_factor_token")}
+ {I18NextService.i18n.t("two_factor_token")}
</label>
<div className="col-sm-6">
<input
{this.state.loginRes.state == "loading" ? (
<Spinner />
) : (
- i18n.t("login")
+ I18NextService.i18n.t("login")
)}
</button>
</div>
case "failed": {
if (loginRes.msg === "missing_totp_token") {
i.setState({ showTotp: true });
- toast(i18n.t("enter_two_factor_code"), "info");
+ toast(I18NextService.i18n.t("enter_two_factor_code"), "info");
}
i.setState({ loginRes: { state: "failed", msg: loginRes.msg } });
}
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(i18n.t("reset_password_mail_sent"));
- }
- }
- }
}