import { useEffect, useState, useRef } 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' const LIMIT = 50 function DogList() { const [dogs, setDogs] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) 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) const searchTimerRef = useRef(null) useEffect(() => { fetchDogs(1, '', 'all') }, []) // eslint-disable-line const fetchDogs = async (p, q, s) => { setLoading(true) try { const params = { page: p, limit: LIMIT } if (q) params.search = q if (s !== 'all') params.sex = s const res = await axios.get('/api/dogs', { params }) setDogs(res.data.data) setTotal(res.data.total) setPage(p) } catch (error) { console.error('Error fetching dogs:', error) } finally { setLoading(false) } } const handleSearchChange = (value) => { setSearch(value) if (searchTimerRef.current) clearTimeout(searchTimerRef.current) searchTimerRef.current = setTimeout(() => fetchDogs(1, value, sexFilter), 300) } const handleSexChange = (value) => { setSexFilter(value) fetchDogs(1, search, value) } const handleClearFilters = () => { setSearch('') setSexFilter('all') fetchDogs(1, '', 'all') } const handleSave = () => { fetchDogs(page, search, sexFilter) } const handleDelete = async () => { if (!deleteTarget) return setDeleting(true) try { await axios.delete(`/api/dogs/${deleteTarget.id}`) setDeleteTarget(null) fetchDogs(page, search, sexFilter) } catch (err) { console.error('Delete failed:', err) alert('Failed to delete dog. Please try again.') } finally { setDeleting(false) } } const totalPages = Math.ceil(total / LIMIT) 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
{total} {total === 1 ? 'dog' : 'dogs'} {search || sexFilter !== 'all' ? ' matching filters' : ' total'}
{search || sexFilter !== 'all' ? 'Try adjusting your search or filters' : 'Add your first dog to get started'}
{!search && sexFilter === 'all' && ( )}{deleteTarget.name} will be permanently removed along with all parent relationships, health records, and heat cycles. This cannot be undone.