From 950dfad659fa18af93e83d5d00c3faaeea9c108b Mon Sep 17 00:00:00 2001 From: Alec Armbruster <35377827+alectrocute@users.noreply.github.com> Date: Mon, 26 Jun 2023 14:54:38 -0400 Subject: [PATCH] Move password reset form to separate route, view (#1390) * rework password reset form * make self-suggested changes * cleaning * validate in handlePasswordReset as well * update submodule * partially make suggested changes * make suggested changes * resolve merge conflicts * resolve merge conflicts * resolve merge conflicts --------- Co-authored-by: Dessalines --- src/server/handlers/robots-handler.ts | 1 + src/shared/components/home/login-reset.tsx | 138 +++++++++++++++++++++ src/shared/components/home/login.tsx | 27 +--- src/shared/routes.ts | 5 + 4 files changed, 149 insertions(+), 22 deletions(-) create mode 100644 src/shared/components/home/login-reset.tsx diff --git a/src/server/handlers/robots-handler.ts b/src/server/handlers/robots-handler.ts index 7271095c..80678aa0 100644 --- a/src/server/handlers/robots-handler.ts +++ b/src/server/handlers/robots-handler.ts @@ -5,6 +5,7 @@ export default async ({ res }: { res: Response }) => { res.send(`User-Agent: * Disallow: /login + Disallow: /login_reset Disallow: /settings Disallow: /create_community Disallow: /create_post diff --git a/src/shared/components/home/login-reset.tsx b/src/shared/components/home/login-reset.tsx new file mode 100644 index 00000000..c96255d5 --- /dev/null +++ b/src/shared/components/home/login-reset.tsx @@ -0,0 +1,138 @@ +import { setIsoData } from "@utils/app"; +import { capitalizeFirstLetter, validEmail } from "@utils/helpers"; +import { Component, linkEvent } from "inferno"; +import { GetSiteResponse } from "lemmy-js-client"; +import { HttpService, I18NextService, UserService } from "../../services"; +import { toast } from "../../toast"; +import { HtmlTags } from "../common/html-tags"; +import { Spinner } from "../common/icon"; + +interface State { + form: { + email: string; + loading: boolean; + }; + siteRes: GetSiteResponse; +} + +export class LoginReset extends Component { + private isoData = setIsoData(this.context); + + state: State = { + form: { + email: "", + loading: false, + }, + siteRes: this.isoData.site_res, + }; + + constructor(props: any, context: any) { + super(props, context); + } + + componentDidMount() { + if (UserService.Instance.myUserInfo) { + this.context.router.history.push("/"); + } + } + + get documentTitle(): string { + return `${capitalizeFirstLetter( + I18NextService.i18n.t("forgot_password") + )} - ${this.state.siteRes.site_view.site.name}`; + } + + render() { + return ( +
+ +
+ {this.loginResetForm()} +
+
+ ); + } + + loginResetForm() { + return ( +
+
+ {capitalizeFirstLetter(I18NextService.i18n.t("forgot_password"))} +
+ +
+ +
+ +
+ + +
+ +
+
+ +
+
+ +
+
+
+ ); + } + + handleEmailInputChange(i: LoginReset, event: any) { + i.setState(s => ((s.form.email = event.target.value.trim()), s)); + } + + async handlePasswordReset(i: LoginReset, event: any) { + event.preventDefault(); + + const email = i.state.form.email; + + if (email && validEmail(email)) { + i.setState(s => ((s.form.loading = true), s)); + + const res = await HttpService.client.passwordReset({ email }); + + if (res.state == "success") { + toast(I18NextService.i18n.t("reset_password_mail_sent")); + i.context.router.history.push("/login"); + } + + i.setState(s => ((s.form.loading = false), s)); + } + } +} diff --git a/src/shared/components/home/login.tsx b/src/shared/components/home/login.tsx index 4dd64665..397288e8 100644 --- a/src/shared/components/home/login.tsx +++ b/src/shared/components/home/login.tsx @@ -1,7 +1,7 @@ import { myAuth, setIsoData } from "@utils/app"; import { isBrowser } from "@utils/browser"; -import { validEmail } from "@utils/helpers"; import { Component, linkEvent } from "inferno"; +import { NavLink } from "inferno-router"; import { GetSiteResponse, LoginResponse } from "lemmy-js-client"; import { I18NextService, UserService } from "../../services"; import { HttpService, RequestState } from "../../services/HttpService"; @@ -105,18 +105,12 @@ export class Login extends Component { required maxLength={60} /> - + {this.state.showTotp && ( @@ -214,15 +208,4 @@ export class Login extends Component { 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")); - } - } - } } diff --git a/src/shared/routes.ts b/src/shared/routes.ts index 6e3ed498..01325afa 100644 --- a/src/shared/routes.ts +++ b/src/shared/routes.ts @@ -7,6 +7,7 @@ import { Home } from "./components/home/home"; import { Instances } from "./components/home/instances"; import { Legal } from "./components/home/legal"; import { Login } from "./components/home/login"; +import { LoginReset } from "./components/home/login-reset"; import { Setup } from "./components/home/setup"; import { Signup } from "./components/home/signup"; import { Modlog } from "./components/modlog"; @@ -38,6 +39,10 @@ export const routes: IRoutePropsWithFetch>[] = [ path: `/login`, component: Login, }, + { + path: `/login_reset`, + component: LoginReset, + }, { path: `/signup`, component: Signup,