import React, { useState } from 'react'; import { Avatar } from '../leads/leadUi'; import { useToast } from '../Toast'; import { compressImage, formatBytes } from '../../lib/imageCompress'; interface AvatarPickerProps { /** Data-URL oder externe URL; '' = kein Bild. */ value: string; onChange: (value: string) => void; /** Fallback, solange kein Bild gesetzt ist. */ initials: string; size?: 'sm' | 'md' | 'lg'; removeLabel?: string; } /** * Foto-Upload mit Vorschau - genutzt fuer Kontakte und Benutzer. Das Bild wird * im Browser auf ein Quadrat verkleinert, bevor es hochgeladen wird; damit * bleiben die Data-URLs in der Datenbank klein. */ export const AvatarPicker: React.FC = ({ value, onChange, initials, size = 'lg', removeLabel = 'Foto entfernen', }) => { const { addToast } = useToast(); const [isBusy, setIsBusy] = useState(false); const handleUpload = async (event: React.ChangeEvent) => { const file = event.target.files?.[0]; // Zuruecksetzen, damit dieselbe Datei nach einem Entfernen erneut gewaehlt // werden kann. event.target.value = ''; if (!file) return; setIsBusy(true); try { const result = await compressImage(file); onChange(result.dataUrl); addToast( `Foto übernommen (${formatBytes(result.sourceBytes)} → ${formatBytes(result.resultBytes)}).`, 'success' ); } catch (err) { addToast(err instanceof Error ? err.message : 'Das Bild konnte nicht verarbeitet werden.', 'error'); } finally { setIsBusy(false); } }; return (
{value && !isBusy && ( )}
); };