import { useEffect, useState, useRef } from 'react' import { useParams, Link, useNavigate } from 'react-router-dom' import { Dog, GitBranch, Edit, Upload, Trash2, ArrowLeft, Calendar, Hash, Award } from 'lucide-react' import axios from 'axios' import DogForm from '../components/DogForm' function DogDetail() { const { id } = useParams() const navigate = useNavigate() const [dog, setDog] = useState(null) const [loading, setLoading] = useState(true) const [showEditModal, setShowEditModal] = useState(false) const [uploading, setUploading] = useState(false) const [selectedPhoto, setSelectedPhoto] = useState(0) const fileInputRef = useRef(null) useEffect(() => { fetchDog() }, [id]) const fetchDog = async () => { try { const res = await axios.get(`/api/dogs/${id}`) setDog(res.data) setLoading(false) } catch (error) { console.error('Error fetching dog:', error) setLoading(false) } } const handlePhotoUpload = async (e) => { const file = e.target.files[0] if (!file) return setUploading(true) const formData = new FormData() formData.append('photo', file) try { await axios.post(`/api/dogs/${id}/photos`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }) fetchDog() } catch (error) { console.error('Error uploading photo:', error) alert('Failed to upload photo') } finally { setUploading(false) if (fileInputRef.current) fileInputRef.current.value = '' } } const handleDeletePhoto = async (photoIndex) => { if (!confirm('Delete this photo?')) return try { await axios.delete(`/api/dogs/${id}/photos/${photoIndex}`) fetchDog() if (selectedPhoto >= photoIndex && selectedPhoto > 0) { setSelectedPhoto(selectedPhoto - 1) } } catch (error) { console.error('Error deleting photo:', error) alert('Failed to delete photo') } } const calculateAge = (birthDate) => { if (!birthDate) return null const today = new Date() const birth = new Date(birthDate) let years = today.getFullYear() - birth.getFullYear() let months = today.getMonth() - birth.getMonth() if (months < 0) { years-- months += 12 } if (years === 0) return `${months} month${months !== 1 ? 's' : ''}` if (months === 0) return `${years} year${years !== 1 ? 's' : ''}` return `${years}y ${months}m` } if (loading) { return
Loading...
} if (!dog) { return
Dog not found
} return (
{/* Header */}

{dog.name}

{dog.breed} {dog.sex === 'male' ? 'Male ♂' : 'Female ♀'} {dog.birth_date && ( <> {calculateAge(dog.birth_date)} )}
Pedigree
{/* Photo Section - Compact */}

Photos

{dog.photo_urls && dog.photo_urls.length > 0 ? ( <> {/* Main Photo */}
{dog.name}
{/* Thumbnail Strip */} {dog.photo_urls.length > 1 && (
{dog.photo_urls.map((url, index) => ( {`${dog.name} setSelectedPhoto(index)} style={{ width: '60px', height: '60px', objectFit: 'cover', borderRadius: 'var(--radius-sm)', cursor: 'pointer', border: selectedPhoto === index ? '2px solid var(--primary)' : '1px solid var(--border)', opacity: selectedPhoto === index ? 1 : 0.6, transition: 'all 0.2s' }} /> ))}
)} ) : (

No photos

)}
{/* Info Section */}

Details

Breed {dog.breed}
Sex {dog.sex === 'male' ? 'Male ♂' : 'Female ♀'}
{dog.birth_date && (
Birth Date {new Date(dog.birth_date).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })} ({calculateAge(dog.birth_date)})
)} {dog.color && (
Color {dog.color}
)} {dog.registration_number && (
Registration {dog.registration_number}
)} {dog.microchip && (
Microchip {dog.microchip}
)}
{/* Parents */}

Pedigree

Sire
{dog.sire ? ( {dog.sire.name} ) : ( Unknown )}
Dam
{dog.dam ? ( {dog.dam.name} ) : ( Unknown )}
{/* Notes */} {dog.notes && (

Notes

{dog.notes}

)} {/* Offspring */} {dog.offspring && dog.offspring.length > 0 && (

Offspring ({dog.offspring.length})

{dog.offspring.map(child => ( { e.currentTarget.style.borderColor = 'var(--primary)' e.currentTarget.style.background = 'var(--bg-tertiary)' }} onMouseLeave={(e) => { e.currentTarget.style.borderColor = 'var(--border)' e.currentTarget.style.background = 'var(--bg-primary)' }} > {child.name} {child.sex === 'male' ? '♂' : '♀'} ))}
)} {showEditModal && ( setShowEditModal(false)} onSave={() => { fetchDog() setShowEditModal(false) }} /> )}
) } export default DogDetail