import React, { useState, useRef } from 'react'; import { useConfigContext } from '../../contexts/ConfigContext'; import './UserCard.css'; const UserCard = ({ user, onAvailabilityToggle, onGPSUpdate, onEdit, onDelete, onPhotoUpload, onPhotoDelete, onGenerateInvite }) => { const { userTypeLabels } = useConfigContext(); const [lat, setLat] = useState(user.gps?.lat?.toString() || ''); const [lng, setLng] = useState(user.gps?.lng?.toString() || ''); const [isEditingGPS, setIsEditingGPS] = useState(false); const [photoUploading, setPhotoUploading] = useState(false); const [invite, setInvite] = useState(null); const [inviteLoading, setInviteLoading] = useState(false); const photoInputRef = useRef(null); const handleGPSUpdate = () => { if (lat && lng) { onGPSUpdate(user._id, parseFloat(lat), parseFloat(lng)); setIsEditingGPS(false); } }; const handleDelete = () => { if (window.confirm(`Möchten Sie "${user.name}" wirklich löschen?`)) { onDelete(user._id); } }; const handlePhotoUpload = (e) => { const file = e.target.files[0]; if (!file) return; if (!file.type.startsWith('image/')) { alert('Nur Bilddateien erlaubt (JPG, PNG, ...)'); return; } if (file.size > 500 * 1024) { alert('Foto darf max. 500 KB groß sein'); return; } setPhotoUploading(true); const reader = new FileReader(); reader.onload = async (ev) => { await onPhotoUpload(user._id, ev.target.result); setPhotoUploading(false); }; reader.readAsDataURL(file); e.target.value = ''; }; const handlePhotoDelete = () => { if (window.confirm('Foto wirklich entfernen?')) { onPhotoDelete(user._id); } }; const handleGenerateInvite = async () => { if (!onGenerateInvite) return; setInviteLoading(true); const result = await onGenerateInvite(user._id); if (result?.success) { setInvite(result.data); } setInviteLoading(false); }; return (
📍 {user.address}
{userTypeLabels[user.type] || user.type}
📱 {user.phone} {user.landline && ( 📞 {user.landline} )}Max. 500 KB, JPG oder PNG
Keine E-Mail hinterlegt – ohne E-Mail ist kein Login möglich.
) : ( <> {invite && (Diesen Token an {invite.email} weitergeben. Gültig bis{' '} {new Date(invite.expiresAt).toLocaleDateString('de-DE')}.
{invite.inviteToken}