diff --git a/client/src/pages/DogList.jsx b/client/src/pages/DogList.jsx new file mode 100644 index 0000000..5f09f22 --- /dev/null +++ b/client/src/pages/DogList.jsx @@ -0,0 +1,118 @@ +import { useEffect, useState } from 'react' +import { Link } from 'react-router-dom' +import { Dog, Plus, Search } from 'lucide-react' +import axios from 'axios' + +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) + + 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) + } + + if (loading) { + return
+ {dog.breed} • {dog.sex === 'male' ? '♂' : '♀'} +
+ {dog.registration_number && ( +{dog.registration_number}
+ )} + {dog.birth_date && ( +Born: {new Date(dog.birth_date).toLocaleDateString()}
+ )} + + ))} +No dogs found matching your search criteria.
+