// components/ProfileAvatarModal.tsx 'use client'; import { useEffect, useState } from 'react'; import Modal from '@/components/ui/Modal'; import PersonAvatar from '@/components/ui/UserAvatar'; import Button from './ui/Button'; type ProfileAvatarModalProps = { open: boolean; onClose: () => void; avatarName: string; avatarUrl?: string | null; /** * Wird aufgerufen, wenn eine neue Datei gespeichert werden soll. */ onAvatarSelected?: (file: File) => Promise | void; /** * Optional: wird aufgerufen, wenn der Nutzer das Profilbild löschen möchte. * Erwartet, dass Backend + Session angepasst werden (Avatar auf null). */ onAvatarDelete?: () => Promise | void; }; export default function ProfileAvatarModal({ open, onClose, avatarName, avatarUrl, onAvatarSelected, onAvatarDelete, }: ProfileAvatarModalProps) { const [selectedFile, setSelectedFile] = useState(null); const [previewUrl, setPreviewUrl] = useState(null); const [isSaving, setIsSaving] = useState(false); // Wenn Modal geschlossen wird → State zurücksetzen useEffect(() => { if (!open) { setSelectedFile(null); setPreviewUrl(null); setIsSaving(false); } }, [open]); // Preview-URL für ausgewählte Datei erzeugen useEffect(() => { if (!selectedFile) { setPreviewUrl(null); return; } const url = URL.createObjectURL(selectedFile); setPreviewUrl(url); return () => URL.revokeObjectURL(url); }, [selectedFile]); const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setSelectedFile(file); } }; const handleSave = async () => { if (!selectedFile) return; try { setIsSaving(true); if (onAvatarSelected) { await onAvatarSelected(selectedFile); } onClose(); } finally { setIsSaving(false); } }; const handleDeleteClick = async () => { if (!onAvatarDelete) return; const sure = window.confirm('Profilbild wirklich entfernen?'); if (!sure) return; try { setIsSaving(true); await onAvatarDelete(); // lokale Preview zurücksetzen setSelectedFile(null); setPreviewUrl(null); onClose(); } finally { setIsSaving(false); } }; const effectiveAvatarUrl = previewUrl ?? avatarUrl ?? undefined; const hasDeletableAvatar = !!avatarUrl; // Button nur anzeigen, wenn ein Avatar existiert return (

Wähle ein neues Profilbild aus oder entferne das aktuelle Bild.
Unterstützte Formate: JPG, PNG, GIF.

{/* Aktuell vs. Vorschau */}
Aktuell
Vorschau
{/* File-Input + ggf. Lösch-Button */}
{/* Profilbild löschen nur, wenn wirklich eins vorhanden ist */} {onAvatarDelete && hasDeletableAvatar && ( )}
); }