Files
finanzen/src/pages/LoginPage.tsx
2026-06-15 11:33:23 +02:00

72 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { useAuthActions } from "@convex-dev/auth/react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { toast } from "sonner";
export function LoginPage() {
const { signIn } = useAuthActions();
const navigate = useNavigate();
const [mode, setMode] = useState<"signIn" | "signUp">("signIn");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [loading, setLoading] = useState(false);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setLoading(true);
try {
await signIn("password", { email, password, flow: mode });
toast.success(mode === "signIn" ? "Willkommen zurück!" : "Konto erstellt");
navigate("/");
} catch (error) {
toast.error(error instanceof Error ? error.message : "Anmeldung fehlgeschlagen");
} finally {
setLoading(false);
}
};
return (
<div className="flex min-h-screen items-center justify-center bg-muted/30 p-4">
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle>Finanz-Dashboard</CardTitle>
<CardDescription>Persönliche Finanzverwaltung Single-User Login</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit} className="space-y-4">
<div className="space-y-2">
<Label htmlFor="email">E-Mail</Label>
<Input id="email" type="email" value={email} onChange={(e) => setEmail(e.target.value)} required />
</div>
<div className="space-y-2">
<Label htmlFor="password">Passwort</Label>
<Input
id="password"
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
/>
</div>
<Button type="submit" className="w-full" disabled={loading}>
{loading ? "Bitte warten…" : mode === "signIn" ? "Anmelden" : "Registrieren"}
</Button>
<Button
type="button"
variant="ghost"
className="w-full"
onClick={() => setMode(mode === "signIn" ? "signUp" : "signIn")}
>
{mode === "signIn" ? "Noch kein Konto? Registrieren" : "Bereits registriert? Anmelden"}
</Button>
</form>
</CardContent>
</Card>
</div>
);
}