From 36bcdb10953c4301066f5b6510d39bd9d9fa1f3f Mon Sep 17 00:00:00 2001 From: jason Date: Sun, 8 Mar 2026 22:53:37 -0500 Subject: [PATCH] Add DogList page --- client/src/pages/DogList.jsx | 118 +++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 client/src/pages/DogList.jsx 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
Loading dogs...
+ } + + return ( +
+
+

Dogs

+ +
+ +
+
+
+ + setSearch(e.target.value)} + style={{ paddingLeft: '2.5rem' }} + /> +
+ +
+
+ +
+ {filteredDogs.map(dog => ( + +
+ {dog.photo_urls && dog.photo_urls.length > 0 ? ( + {dog.name} + ) : ( + + )} +
+

{dog.name}

+

+ {dog.breed} • {dog.sex === 'male' ? '♂' : '♀'} +

+ {dog.registration_number && ( +

{dog.registration_number}

+ )} + {dog.birth_date && ( +

Born: {new Date(dog.birth_date).toLocaleDateString()}

+ )} + + ))} +
+ + {filteredDogs.length === 0 && ( +
+

No dogs found matching your search criteria.

+
+ )} +
+ ) +} + +export default DogList \ No newline at end of file