import { Form, useActionData, useNavigation, redirect } from "react-router"; import { login, createUserSession, getUserSession } from "@/session.server"; import { checkLoginRateLimit } from "@/lib/rate-limiter.server"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Calculator, AlertCircle, Eye, EyeOff } from "lucide-react"; import { useState } from "react"; export async function loader({ request }: { request: Request }) { const { userId } = await getUserSession(request); if (userId) throw redirect("/"); return null; } export async function action({ request }: { request: Request }) { const rateLimitError = await checkLoginRateLimit(request); if (rateLimitError) return { error: rateLimitError }; const formData = await request.formData(); const identifier = formData.get("identifier") as string; const password = formData.get("password") as string; const user = await login(identifier, password, request); if (!user) return { error: "Benutzername/E-Mail oder Passwort falsch." }; return createUserSession(user.id, user.name, user.role, "/"); } export default function LoginPage() { const actionData = useActionData(); const navigation = useNavigation(); const loading = navigation.state === "submitting"; const [showPassword, setShowPassword] = useState(false); return (
{/* Left decorative panel */}
{/* Decorative gradient blobs */}
Rechnungsmanager

Buchhaltung
einfach gemacht.

Verwalten Sie Mandanten, erstellen Sie Rechnungen und behalten Sie den Überblick über alle Zahlungen.

{[ { label: "Mandantenverwaltung", desc: "Alle Firmen im Blick" }, { label: "Rechnungserstellung", desc: "Schnell und professionell" }, { label: "Zahlungsübersicht", desc: "Offene Posten auf einen Blick" }, ].map((feat) => (
{feat.label} — {feat.desc}
))}
{/* Right login form */}
{/* Mobile logo */}
Rechnungsmanager

Willkommen zurück

Benutzername oder E-Mail und Passwort eingeben

{actionData?.error && (
{actionData.error}
)}
); }