import { FormEvent, useEffect, useState } from "react"; import { KeyRound, Save, UserCircle } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { HelpLink } from "@/components/HelpLink"; import { updateCurrentUser } from "../api"; import type { AuthUser } from "../types"; type ProfilePageProps = { currentUser: AuthUser; onUserUpdated: (user: AuthUser) => void; }; export function ProfilePage({ currentUser, onUserUpdated }: ProfilePageProps) { const [username, setUsername] = useState(currentUser.username); const [displayName, setDisplayName] = useState(currentUser.display_name); const [currentPassword, setCurrentPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [saving, setSaving] = useState(false); useEffect(() => { setUsername(currentUser.username); setDisplayName(currentUser.display_name); }, [currentUser]); async function submit(event: FormEvent) { event.preventDefault(); const wantsPasswordChange = newPassword.length > 0 || confirmPassword.length > 0 || currentPassword.length > 0; if (wantsPasswordChange && newPassword !== confirmPassword) { toast.error("Passwörter stimmen nicht überein"); return; } if (wantsPasswordChange && newPassword.length < 6) { toast.error("Passwort ist zu kurz", { description: "Das neue Passwort muss mindestens 6 Zeichen lang sein." }); return; } setSaving(true); try { const result = await updateCurrentUser({ username, displayName, currentPassword: wantsPasswordChange ? currentPassword : undefined, newPassword: wantsPasswordChange ? newPassword : undefined }); onUserUpdated(result.user); setCurrentPassword(""); setNewPassword(""); setConfirmPassword(""); toast.success("Profil gespeichert"); } catch (error) { toast.error("Profil konnte nicht gespeichert werden", { description: error instanceof Error ? error.message : "Unbekannter Fehler" }); } finally { setSaving(false); } } return (

Profil

Benutzername, voller Name und Passwort deines Accounts.

Accountdaten
Der Benutzername wird beim Login verwendet. Dein voller Name wird in der App angezeigt.
setUsername(event.currentTarget.value)} required />
setDisplayName(event.currentTarget.value)} required />

Passwort ändern

setCurrentPassword(event.currentTarget.value)} autoComplete="current-password" />
setNewPassword(event.currentTarget.value)} autoComplete="new-password" />
setConfirmPassword(event.currentTarget.value)} autoComplete="new-password" />
); }