import { useEffect, useState } from 'react' import { Link, useNavigate } from 'react-router-dom' import { Dog, Plus, Search, Calendar, Hash, ArrowRight, Trash2 } from 'lucide-react' import axios from 'axios' import DogForm from '../components/DogForm' import { ChampionBadge, ChampionBloodlineBadge } from '../components/ChampionBadge' function DogList() { const [dogs, setDogs] = useState([]) const [filteredDogs, setFilteredDogs] = useState([]) const [search, setSearch] = useState('') const [sexFilter, setSexFilter] = useState('all') const [loading, setLoading] = useState(true) const [showAddModal, setShowAddModal] = useState(false) const [deleteTarget, setDeleteTarget] = useState(null) // { id, name } const [deleting, setDeleting] = useState(false) useEffect(() => { fetchDogs() }, []) useEffect(() => { filterDogs() }, [dogs, search, sexFilter]) const fetchDogs = async () => { try { const res = await axios.get('/api/dogs') setDogs(res.data) setLoading(false) } catch (error) { console.error('Error fetching dogs:', error) setLoading(false) } } const filterDogs = () => { let filtered = dogs if (search) { filtered = filtered.filter(dog => dog.name.toLowerCase().includes(search.toLowerCase()) || (dog.registration_number && dog.registration_number.toLowerCase().includes(search.toLowerCase())) ) } if (sexFilter !== 'all') { filtered = filtered.filter(dog => dog.sex === sexFilter) } setFilteredDogs(filtered) } const handleSave = () => { fetchDogs() } const handleDelete = async () => { if (!deleteTarget) return setDeleting(true) try { await axios.delete(`/api/dogs/${deleteTarget.id}`) setDogs(prev => prev.filter(d => d.id !== deleteTarget.id)) setDeleteTarget(null) } catch (err) { console.error('Delete failed:', err) alert('Failed to delete dog. Please try again.') } finally { setDeleting(false) } } 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}mo` if (months === 0) return `${years}y` return `${years}y ${months}mo` } const hasChampionBlood = (dog) => (dog.sire && dog.sire.is_champion) || (dog.dam && dog.dam.is_champion) if (loading) { return
Loading dogs...
} return (

Dogs

{filteredDogs.length} {filteredDogs.length === 1 ? 'dog' : 'dogs'} {search || sexFilter !== 'all' ? ' matching filters' : ' total'}

{/* Search and Filter Bar */}
setSearch(e.target.value)} style={{ paddingLeft: '2.75rem' }} />
{(search || sexFilter !== 'all') && ( )}
{/* Dogs List */} {filteredDogs.length === 0 ? (

{search || sexFilter !== 'all' ? 'No dogs found' : 'No dogs yet'}

{search || sexFilter !== 'all' ? 'Try adjusting your search or filters' : 'Add your first dog to get started'}

{!search && sexFilter === 'all' && ( )}
) : (
{filteredDogs.map(dog => (
{ e.currentTarget.style.borderColor = 'var(--primary)' e.currentTarget.style.transform = 'translateY(-2px)' e.currentTarget.style.boxShadow = '0 8px 16px rgba(0, 0, 0, 0.3)' }} onMouseLeave={(e) => { e.currentTarget.style.borderColor = 'var(--border)' e.currentTarget.style.transform = 'translateY(0)' e.currentTarget.style.boxShadow = 'var(--shadow-sm)' }} > {/* Avatar */}
{dog.photo_urls && dog.photo_urls.length > 0 ? ( {dog.name} ) : ( )}
{/* Info — clicking navigates to detail */}

{dog.name} {dog.sex === 'male' ? '♂' : '♀'} {dog.is_champion ? : hasChampionBlood(dog) ? : null}

{dog.breed} {dog.birth_date && ( <> · {calculateAge(dog.birth_date)} )} {dog.color && ( <> · {dog.color} )}
{dog.registration_number && (
{dog.registration_number}
)} {/* Actions */}
))}
)} {/* Add Dog Modal */} {showAddModal && ( setShowAddModal(false)} onSave={handleSave} /> )} {/* Delete Confirmation Modal */} {deleteTarget && (

Delete Dog?

{deleteTarget.name} will be permanently removed along with all parent relationships, health records, and heat cycles. This cannot be undone.

)}
) } export default DogList