import type { ActionFunctionArgs, LoaderFunctionArgs, MetaFunction } from "@remix-run/node"; import { json, redirect } from "@remix-run/node"; import { Form, Link, useActionData, useLoaderData, useNavigation } from "@remix-run/react"; import { validateSignUp, createUser, isSignupAllowed } from "~/lib/auth-helpers.server"; import { createUserSession, getUserId } from "~/lib/auth.server"; import { AUTH_ERRORS } from "~/lib/auth-constants"; import type { SignUpFormData } from "~/types/auth"; export const meta: MetaFunction = () => { return [ { title: "إنشاء حساب - نظام إدارة صيانة السيارات" }, { name: "description", content: "إنشاء حساب جديد في نظام إدارة صيانة السيارات" }, ]; }; export async function loader({ request }: LoaderFunctionArgs) { // Import the redirect middleware const { redirectIfAuthenticated } = await import("~/lib/auth-middleware.server"); await redirectIfAuthenticated(request); const url = new URL(request.url); const adminOverride = url.searchParams.get("admin_override") === "true"; // Check if signup is allowed (only when no admin users exist or admin override) const signupAllowed = await isSignupAllowed(); if (!signupAllowed && !adminOverride) { return redirect("/signin?error=signup_disabled"); } return json({ signupAllowed: signupAllowed || adminOverride }); } export async function action({ request }: ActionFunctionArgs) { const formData = await request.formData(); const adminOverride = formData.get("admin_override") === "true"; // Check if signup is still allowed const signupAllowed = await isSignupAllowed(); if (!signupAllowed && !adminOverride) { return json( { errors: [{ message: AUTH_ERRORS.SIGNUP_DISABLED }], values: {} }, { status: 403 } ); } 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"); // Validate form data types if ( typeof name !== "string" || typeof username !== "string" || typeof email !== "string" || typeof password !== "string" || typeof confirmPassword !== "string" ) { return json( { errors: [{ message: "بيانات النموذج غير صحيحة" }], values: { name: name || "", username: username || "", email: email || "" } }, { status: 400 } ); } const signUpData: SignUpFormData = { name: name.trim(), username: username.trim(), email: email.trim(), password, confirmPassword, }; // Validate signup data const validationResult = await validateSignUp(signUpData); if (!validationResult.success) { return json( { errors: validationResult.errors || [{ message: "فشل في التحقق من البيانات" }], values: { name: signUpData.name, username: signUpData.username, email: signUpData.email } }, { status: 400 } ); } try { // Create the user const user = await createUser(signUpData); // Create session and redirect to dashboard return createUserSession(user.id, "/dashboard"); } catch (error) { console.error("Error creating user:", error); return json( { errors: [{ message: "حدث خطأ أثناء إنشاء الحساب" }], values: { name: signUpData.name, username: signUpData.username, email: signUpData.email } }, { status: 500 } ); } } export default function SignUp() { const { signupAllowed } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const isSubmitting = navigation.state === "submitting"; // Check if this is an admin override const url = typeof window !== "undefined" ? new URL(window.location.href) : null; const adminOverride = url?.searchParams.get("admin_override") === "true"; const getErrorMessage = (field?: string) => { if (!actionData?.errors) return null; const error = actionData.errors.find(e => e.field === field || (!e.field && !field)); return error?.message; }; if (!signupAllowed) { return (

التسجيل غير متاح

التسجيل غير متاح حالياً. يرجى الاتصال بالمسؤول.

العودة إلى تسجيل الدخول
); } return (

إنشاء حساب جديد

أو{" "} تسجيل الدخول إلى حساب موجود

{adminOverride && ( )} {/* Display general errors */} {getErrorMessage() && (

{getErrorMessage()}

)}
{/* Name field */}
{getErrorMessage("name") && (

{getErrorMessage("name")}

)}
{/* Username field */}
{getErrorMessage("username") && (

{getErrorMessage("username")}

)}
{/* Email field */}
{getErrorMessage("email") && (

{getErrorMessage("email")}

)}
{/* Password field */}
{getErrorMessage("password") && (

{getErrorMessage("password")}

)}
{/* Confirm Password field */}
{getErrorMessage("confirmPassword") && (

{getErrorMessage("confirmPassword")}

)}
); }