import type { ActionFunctionArgs, LoaderFunctionArgs, MetaFunction } from "@remix-run/node"; import { json, redirect } from "@remix-run/node"; import { Form, Link, useActionData } from "@remix-run/react"; import { createUser, createUserSession, getUserId } from "~/utils/auth.server"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export const meta: MetaFunction = () => [{ title: "Sign Up - Phosphat Report" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const userId = await getUserId(request); if (userId) return redirect("/dashboard"); // For first time signup only // ////////////////////////// const users = await prisma.employee.findMany({ where: { authLevel: 2 }, select: { name: true, username: true, email: true, authLevel: true }, }); if (users.length > 0) { return redirect("/signin"); } // ////////////////////////// return json({}); }; export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const name = formData.get("name"); const username = formData.get("username"); const email = formData.get("email"); const password = formData.get("password"); const confirmPassword = formData.get("confirmPassword"); if ( typeof name !== "string" || typeof username !== "string" || typeof email !== "string" || typeof password !== "string" || typeof confirmPassword !== "string" ) { return json({ errors: { form: "Form not submitted correctly." } }, { status: 400 }); } if (name.length === 0) { return json({ errors: { name: "Name is required" } }, { status: 400 }); } if (username.length === 0) { return json({ errors: { username: "Username is required" } }, { status: 400 }); } if (email.length === 0) { return json({ errors: { email: "Email is required" } }, { status: 400 }); } // Basic email validation const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { return json({ errors: { email: "Please enter a valid email address" } }, { status: 400 }); } if (password.length < 6) { return json({ errors: { password: "Password must be at least 6 characters" } }, { status: 400 }); } if (password !== confirmPassword) { return json({ errors: { confirmPassword: "Passwords do not match" } }, { status: 400 }); } try { const user = await createUser(name, username, email, password, 2); // Default auth level 2 (for admin) return createUserSession(user.id, "/dashboard"); } catch (error) { return json({ errors: { form: "Username or email already exists" } }, { status: 400 }); } }; export default function SignUp() { const actionData = useActionData(); return (
Phosphat Report

Create your account

Or{" "} sign in to existing account

{actionData?.errors?.name && (
{actionData.errors.name}
)}
{actionData?.errors?.username && (
{actionData.errors.username}
)}
{actionData?.errors?.email && (
{actionData.errors.email}
)}
{actionData?.errors?.password && (
{actionData.errors.password}
)}
{actionData?.errors?.confirmPassword && (
{actionData.errors.confirmPassword}
)}
{actionData?.errors?.form && (
{actionData.errors.form}
)}
); }