From 7089515e47fb6f7e9aa3db4bbbac2d3300ff0048 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 11 Aug 2024 15:32:47 +0900 Subject: feat(frontend): improve error handling of login form --- frontend/app/routes/login.tsx | 150 ++++++++++++++++++++++++++++-------------- 1 file changed, 100 insertions(+), 50 deletions(-) (limited to 'frontend/app/routes/login.tsx') diff --git a/frontend/app/routes/login.tsx b/frontend/app/routes/login.tsx index d6414f7..b1249e0 100644 --- a/frontend/app/routes/login.tsx +++ b/frontend/app/routes/login.tsx @@ -3,8 +3,11 @@ import type { LoaderFunctionArgs, MetaFunction, } from "@remix-run/node"; -import { Form, useLocation } from "@remix-run/react"; +import { Form, json, useActionData, useLocation } from "@remix-run/react"; import { ensureUserNotLoggedIn, login } from "../.server/auth"; +import BorderedContainer from "../components/BorderedContainer"; +import InputText from "../components/InputText"; +import SubmitButton from "../components/SubmitButton"; export const meta: MetaFunction = () => [ { title: "Login | iOSDC Japan 2024 Albatross.swift" }, @@ -15,7 +18,42 @@ export async function loader({ request }: LoaderFunctionArgs) { } export async function action({ request }: ActionFunctionArgs) { - await login(request); + const formData = await request.clone().formData(); + const username = String(formData.get("username")); + const password = String(formData.get("password")); + if (username === "" || password === "") { + return json( + { + message: "ユーザー名またはパスワードが誤っています", + errors: { + username: + username === "" ? "ユーザー名を入力してください" : undefined, + password: + password === "" ? "パスワードを入力してください" : undefined, + }, + }, + { status: 400 }, + ); + } + + try { + await login(request); + } catch (error) { + if (error instanceof Error) { + return json( + { + message: error.message, + errors: { + username: undefined, + password: undefined, + }, + }, + { status: 400 }, + ); + } else { + throw error; + } + } return null; } @@ -24,56 +62,68 @@ export default function Login() { const searchParams = new URLSearchParams(location.search); const registrationToken = searchParams.get("registration_token"); + const loginErrors = useActionData(); + return (
-
-

Login

-
- - -
-
- - -
- - -
+
+ +
+

+ fortee アカウントでログイン +

+

+ fortee + のアカウントをお持ちでない場合は、イベントスタッフにお声がけください。 +

+ {loginErrors?.message && ( +

{loginErrors.message}

+ )} +
+ + + {loginErrors?.errors?.username && ( +

+ {loginErrors.errors.username} +

+ )} +
+
+ + + {loginErrors?.errors?.password && ( +

+ {loginErrors.errors.password} +

+ )} +
+ +
+ ログイン +
+
+
+
); } -- cgit v1.2.3-70-g09d2