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.name}

📍 {user.address}

{userTypeLabels[user.type] || user.type}

📱 {user.phone} {user.landline && ( 📞 {user.landline} )}

Foto

{user.photo ? (
{user.name}
) : (
Kein Foto
)}
{user.photo && ( )}

Max. 500 KB, JPG oder PNG

GPS-Koordinaten

{!isEditingGPS ? (
{user.gps && user.gps.lat && user.gps.lng ? ( {user.gps.lat.toFixed(6)}, {user.gps.lng.toFixed(6)} ) : ( Keine GPS-Daten )}
) : (
setLat(e.target.value)} step="any" className="gps-input" /> setLng(e.target.value)} step="any" className="gps-input" />
)}
{/* Einladungs-Token: einmalig gültiger Code, mit dem der Hundeführer sein eigenes Passwort setzt. Ohne hinterlegte E-Mail nicht möglich. */}

Zugang für den Drohnenführer

{!user.email ? (

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}
)} )}
); }; export default UserCard;