diff --git a/web_app/src/Librarian/LibrarianHomePage.tsx b/web_app/src/Librarian/LibrarianHomePage.tsx index c8c16357..085ff501 100644 --- a/web_app/src/Librarian/LibrarianHomePage.tsx +++ b/web_app/src/Librarian/LibrarianHomePage.tsx @@ -40,9 +40,19 @@ const LibrarianHomePage: React.FC = () => { name: string; } + // UPDATED: Matches your new JSON structure + interface LibraryAddress { + street: string; + city: string; + postalCode: string; + } + interface Library { id: number; name: string; + phoneNumber: string; + email: string; + address: LibraryAddress; } // Books @@ -71,11 +81,12 @@ const LibrarianHomePage: React.FC = () => { const navigate = useNavigate(); - // Lazy Loading for the book list display + // Lazy Loading const [page, setPage] = useState(0); const [hasMore, setHasMore] = useState(true); const [isLoading, setIsLoading] = useState(false); const isFetchingRef = useRef(false); + const listRef = useRef(null); useEffect(() => { fetchAssignedLibrary(); @@ -84,7 +95,14 @@ const LibrarianHomePage: React.FC = () => { useEffect(() => { if (assignedLibrary !== null) { - fetchBooks(isUserLibraryChecked); + setBookSearchResults([]); + setPage(0); + setHasMore(true); + + const timeoutId = setTimeout(() => { + fetchBooks(isUserLibraryChecked, 0); + }, 0); + return () => clearTimeout(timeoutId); } }, [isUserLibraryChecked, assignedLibrary]); @@ -125,14 +143,25 @@ const LibrarianHomePage: React.FC = () => { // Lazy Loading useEffect(() => { const handleScroll = () => { - const nearBottom = window.innerHeight + window.scrollY >= document.body.offsetHeight - 1000; - if (nearBottom && !isLoading && hasMore) { - fetchBooks(isUserLibraryChecked, page); + if (listRef.current) { + const { scrollTop, scrollHeight, clientHeight } = listRef.current; + if (scrollTop + clientHeight >= scrollHeight - 50) { + if (!isLoading && hasMore) { + fetchBooks(isUserLibraryChecked, page); + } + } } }; - window.addEventListener('scroll', handleScroll); - return () => window.removeEventListener('scroll', handleScroll); + const listElement = listRef.current; + if (listElement) { + listElement.addEventListener('scroll', handleScroll); + } + return () => { + if (listElement) { + listElement.removeEventListener('scroll', handleScroll); + } + }; }, [isLoading, hasMore, page, isUserLibraryChecked]); useWebSocketNotification('librarian/orders/pending', () => { @@ -232,15 +261,16 @@ const LibrarianHomePage: React.FC = () => { const fetchBooks = async (filterByLibrary: boolean, pageToFetch: number = 0) => { const token = localStorage.getItem('access_token'); - if (!token || isFetchingRef.current || isLoading || !hasMore) return; + if (!token || isFetchingRef.current || (isLoading && pageToFetch !== 0) || (!hasMore && pageToFetch !== 0)) + return; isFetchingRef.current = true; setIsLoading(true); const queryParams = new URLSearchParams(); - if (filterByLibrary && assignedLibrary?.id) { - queryParams.append("libraryId", assignedLibrary.id.toString()); + if (filterByLibrary && assignedLibrary?.name) { + queryParams.append("library", assignedLibrary.name); } if (bookSearchInput) queryParams.append("title", bookSearchInput); @@ -253,7 +283,7 @@ const LibrarianHomePage: React.FC = () => { if (releaseYearTo) queryParams.append("releaseYearTo", releaseYearTo.toString()); queryParams.append("page", pageToFetch.toString()); - queryParams.append("size", "2"); + queryParams.append("size", "10"); try { const response = await fetch(`${API_BASE_URL}/api/books/search?${queryParams.toString()}`, { @@ -269,9 +299,10 @@ const LibrarianHomePage: React.FC = () => { const data = await response.json(); const newBooks = data.content; - setBookSearchResults(prev => [...prev, ...newBooks]); + setBookSearchResults(prev => pageToFetch === 0 ? newBooks : [...prev, ...newBooks]); setPage(pageToFetch + 1); - setHasMore(!data.last); + + setHasMore(data.currentPage < data.totalPages - 1); } catch (error) { console.error("Error: ", error); @@ -286,8 +317,10 @@ const LibrarianHomePage: React.FC = () => { setBookSearchResults([]); setPage(0); setHasMore(true); + fetchBooks(isUserLibraryChecked, 0); + } else { + fetchBooks(isUserLibraryChecked, 0); } - fetchBooks(isUserLibraryChecked, 0); }; const handleRedirectToAddBook = () => { @@ -636,7 +669,10 @@ const LibrarianHomePage: React.FC = () => { {searchResults.length > 0 ? ( -