import type { ActionFunctionArgs, LoaderFunctionArgs, MetaFunction } from "@remix-run/node"; import { json, redirect } from "@remix-run/node"; import { Form, Link, useActionData, useSearchParams } from "@remix-run/react"; import { createUserSession, getUserId, verifyLogin } from "~/utils/auth.server"; export const meta: MetaFunction = () => [{ title: "Sign In - Alhaffer Report System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const userId = await getUserId(request); if (userId) return redirect("/dashboard"); return json({}); }; export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const usernameOrEmail = formData.get("usernameOrEmail"); const password = formData.get("password"); const redirectTo = formData.get("redirectTo") || "/dashboard"; if (typeof usernameOrEmail !== "string" || typeof password !== "string" || typeof redirectTo !== "string") { return json({ errors: { form: "Form not submitted correctly." } }, { status: 400 }); } if (usernameOrEmail.length === 0) { return json({ errors: { usernameOrEmail: "Username or email is required" } }, { status: 400 }); } if (password.length === 0) { return json({ errors: { password: "Password is required" } }, { status: 400 }); } const user = await verifyLogin(usernameOrEmail, password); if (!user) { return json({ errors: { form: "Invalid username/email or password" } }, { status: 400 }); } return createUserSession(user.id, redirectTo); }; export default function SignIn() { const [searchParams] = useSearchParams(); const redirectTo = searchParams.get("redirectTo") || "/dashboard"; const message = searchParams.get("message"); const actionData = useActionData(); return (
Phosphat Report

Sign in to your account

Or{" "} create a new account

{message && (

{message}

)}
{actionData?.errors?.usernameOrEmail && (
{actionData.errors.usernameOrEmail}
)}
{actionData?.errors?.password && (
{actionData.errors.password}
)}
Forgot your password?
{actionData?.errors?.form && (
{actionData.errors.form}
)}
); }