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 { validateSignIn } from "~/lib/auth-helpers.server"; import { createUserSession, getUserId } from "~/lib/auth.server"; import { AUTH_ERRORS } from "~/lib/auth-constants"; import type { SignInFormData } 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 redirectTo = url.searchParams.get("redirectTo") || "/dashboard"; const error = url.searchParams.get("error"); return json({ redirectTo, error }); } export async function action({ request }: ActionFunctionArgs) { const formData = await request.formData(); const usernameOrEmail = formData.get("usernameOrEmail"); const password = formData.get("password"); const redirectTo = formData.get("redirectTo") || "/dashboard"; // Validate form data if ( typeof usernameOrEmail !== "string" || typeof password !== "string" || typeof redirectTo !== "string" ) { return json( { errors: [{ message: "بيانات النموذج غير صحيحة" }], values: { usernameOrEmail: usernameOrEmail || "" } }, { status: 400 } ); } const signInData: SignInFormData = { usernameOrEmail: usernameOrEmail.trim(), password, redirectTo, }; // Validate credentials const result = await validateSignIn(signInData); if (!result.success) { return json( { errors: result.errors || [{ message: AUTH_ERRORS.INVALID_CREDENTIALS }], values: { usernameOrEmail: signInData.usernameOrEmail } }, { status: 400 } ); } if (!result.user) { return json( { errors: [{ message: AUTH_ERRORS.INVALID_CREDENTIALS }], values: { usernameOrEmail: signInData.usernameOrEmail } }, { status: 400 } ); } // Create session and redirect return createUserSession(result.user.id, redirectTo); } export default function SignIn() { const { redirectTo, error } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const isSubmitting = navigation.state === "submitting"; const getErrorMessage = (field?: string) => { if (!actionData?.errors) return null; const error = actionData.errors.find(e => e.field === field || !e.field); return error?.message; }; const getErrorForUrl = (errorParam: string | null) => { switch (errorParam) { case "account_inactive": return AUTH_ERRORS.ACCOUNT_INACTIVE; case "session_expired": return AUTH_ERRORS.SESSION_EXPIRED; default: return null; } }; const urlError = getErrorForUrl(error); return (

تسجيل الدخول

أو{" "} إنشاء حساب جديد

{/* Display URL error */} {urlError && (

{urlError}

)} {/* Display form errors */} {getErrorMessage() && (

{getErrorMessage()}

)}
); }