@@ -68,6 +68,11 @@ const LibrarianHomePage: React.FC = () => {
6868
6969 const navigate = useNavigate ( ) ;
7070
71+ // Lazy Loading for the book list display
72+ const [ page , setPage ] = useState ( 0 ) ;
73+ const [ hasMore , setHasMore ] = useState ( true ) ;
74+ const [ isLoading , setIsLoading ] = useState ( false ) ;
75+
7176 useEffect ( ( ) => {
7277 fetchAssignedLibrary ( ) ;
7378 fetchDropdownData ( ) ;
@@ -113,6 +118,19 @@ const LibrarianHomePage: React.FC = () => {
113118 }
114119 } , [ deleteBooksMessage ] ) ;
115120
121+ // Lazy Loading
122+ useEffect ( ( ) => {
123+ const handleScroll = ( ) => {
124+ const nearBottom = window . innerHeight + window . scrollY >= document . body . offsetHeight - 1000 ;
125+ if ( nearBottom && ! isLoading && hasMore ) {
126+ fetchBooks ( isUserLibraryChecked , page ) ;
127+ }
128+ } ;
129+
130+ window . addEventListener ( 'scroll' , handleScroll ) ;
131+ return ( ) => window . removeEventListener ( 'scroll' , handleScroll ) ;
132+ } , [ isLoading , hasMore , page , isUserLibraryChecked ] ) ;
133+
116134 const fetchDropdownData = async ( ) => {
117135 const token = localStorage . getItem ( 'access_token' ) ;
118136
@@ -201,14 +219,16 @@ const LibrarianHomePage: React.FC = () => {
201219 }
202220 } ;
203221
204- const fetchBooks = async ( filterByLibrary : boolean ) => {
222+ const fetchBooks = async ( filterByLibrary : boolean , pageToFetch : number = 0 ) => {
205223 const token = localStorage . getItem ( 'access_token' ) ;
206- if ( ! token ) return ;
224+ if ( ! token || isLoading || ! hasMore ) return ;
225+
226+ setIsLoading ( true ) ;
207227
208228 const queryParams = new URLSearchParams ( ) ;
209229
210- if ( filterByLibrary && assignedLibrary ?. name ) {
211- queryParams . append ( "library " , assignedLibrary . name ) ;
230+ if ( filterByLibrary && assignedLibrary ?. id ) {
231+ queryParams . append ( "libraryId " , assignedLibrary . id . toString ( ) ) ;
212232 }
213233
214234 if ( bookSearchInput ) queryParams . append ( "title" , bookSearchInput ) ;
@@ -220,8 +240,8 @@ const LibrarianHomePage: React.FC = () => {
220240 if ( releaseYearFrom ) queryParams . append ( "releaseYearFrom" , releaseYearFrom . toString ( ) ) ;
221241 if ( releaseYearTo ) queryParams . append ( "releaseYearTo" , releaseYearTo . toString ( ) ) ;
222242
223- queryParams . append ( "page" , "0" ) ;
224- queryParams . append ( "size" , "20 " ) ;
243+ queryParams . append ( "page" , pageToFetch . toString ( ) ) ;
244+ queryParams . append ( "size" , "3 " ) ;
225245
226246 try {
227247 const response = await fetch ( `${ API_BASE_URL } /api/books/search?${ queryParams . toString ( ) } ` , {
@@ -232,22 +252,29 @@ const LibrarianHomePage: React.FC = () => {
232252 } ,
233253 } ) ;
234254
235- if ( ! response . ok ) {
236- throw new Error ( `Error: ${ response . statusText } ` ) ;
237- }
255+ if ( ! response . ok ) throw new Error ( `Error: ${ response . statusText } ` ) ;
238256
239257 const data = await response . json ( ) ;
240- setBookSearchResults ( data . content ) ;
258+ const newBooks = data . content ;
259+
260+ setBookSearchResults ( prev => [ ...prev , ...newBooks ] ) ;
261+ setPage ( pageToFetch + 1 ) ;
262+ setHasMore ( ! data . last ) ;
263+
241264 } catch ( error ) {
242265 console . error ( "Error: " , error ) ;
266+ } finally {
267+ setIsLoading ( false ) ;
243268 }
244269 } ;
245270
246271 const handleSearch = ( reset : boolean = false ) => {
247272 if ( reset ) {
248273 setBookSearchResults ( [ ] ) ;
274+ setPage ( 0 ) ;
275+ setHasMore ( true ) ;
249276 }
250- fetchBooks ( isUserLibraryChecked ) ;
277+ fetchBooks ( isUserLibraryChecked , 0 ) ;
251278 } ;
252279
253280 const handleRedirectToAddBook = ( ) => {
0 commit comments