"use client"; import { useEffect, useRef, useState } from "react"; import { KeyRound, LogOut, Settings, UserCircle2 } from "lucide-react"; import { api } from "@/lib/api-client"; export function ProfileMenu({ username, onOpenHouseholdSettings, }: { username: string; onOpenHouseholdSettings: () => void; }) { const [open, setOpen] = useState(false); const [showPasswordDialog, setShowPasswordDialog] = useState(false); const menuRef = useRef(null); useEffect(() => { function handleClickOutside(e: MouseEvent) { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return (
{open && (
{username}
} label="Grundprofil bearbeiten" onClick={() => { setOpen(false); onOpenHouseholdSettings(); }} /> } label="Passwort aendern" onClick={() => { setOpen(false); setShowPasswordDialog(true); }} /> } label="Abmelden" onClick={async () => { await api.post("/api/auth/logout"); window.location.href = "/login"; }} />
)} {showPasswordDialog && setShowPasswordDialog(false)} />}
); } function MenuItem({ icon, label, onClick, }: { icon: React.ReactNode; label: string; onClick: () => void; }) { return ( ); } function ChangePasswordDialog({ onClose }: { onClose: () => void }) { const [currentPassword, setCurrentPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [newPasswordConfirm, setNewPasswordConfirm] = useState(""); const [error, setError] = useState(null); const [saving, setSaving] = useState(false); const [done, setDone] = useState(false); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); if (newPassword !== newPasswordConfirm) { setError("Die neuen Passwoerter stimmen nicht ueberein."); return; } setSaving(true); try { await api.post("/api/auth/change-password", { currentPassword, newPassword }); setDone(true); setTimeout(onClose, 1200); } catch (err) { setError(err instanceof Error ? err.message : "Passwort aendern fehlgeschlagen."); } finally { setSaving(false); } } const inputClass = "w-full rounded-lg border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-900 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100"; return (
e.stopPropagation()} className="flex w-full max-w-sm flex-col gap-3 rounded-2xl border border-zinc-200 bg-white p-6 shadow-xl dark:border-zinc-700 dark:bg-zinc-900" >

Passwort aendern

setCurrentPassword(e.target.value)} className={inputClass} /> setNewPassword(e.target.value)} className={inputClass} /> setNewPasswordConfirm(e.target.value)} className={inputClass} /> {error &&

{error}

} {done &&

Passwort geaendert.

}
); }