@@ -8,8 +8,38 @@ import {ReviewPresenter} from "../presenters/ReviewPresenter.jsx"
88import { syncScrollPositionToFirebase } from "../../firebase.js"
99
1010const ListViewPresenter = observer ( ( { model } ) => {
11-
1211 const scrollContainerRef = useRef ( null ) ;
12+ let attempts = 0 ;
13+ const MAX_Depth = 49 ;
14+
15+ function persistantScrolling ( fetchMoreCourses , hasMore ) {
16+ const container = scrollContainerRef . current ;
17+ if ( ! container || ! model . scrollPosition ) return ;
18+
19+
20+
21+ const attemptScroll = ( ) => {
22+
23+ // refresh on significant change (same as in firebase)
24+ if ( Math . abs ( container . scrollTop - model . scrollPosition ) < 100 )
25+ return ;
26+
27+ attempts ++ ;
28+ if ( attempts > MAX_Depth ) {
29+ return ;
30+ }
31+ const needsMoreCourses = container . scrollHeight < model . scrollPosition && hasMore ;
32+
33+ if ( needsMoreCourses ) {
34+ fetchMoreCourses ( ) ;
35+ setTimeout ( attemptScroll , 100 ) ; // Add delay between attempts
36+ } else {
37+ container . scrollTop = model . scrollPosition ;
38+ syncScrollPositionToFirebase ( model , scrollContainerRef )
39+ }
40+ } ;
41+ attemptScroll ( ) ;
42+ }
1343
1444 useEffect ( ( ) => {
1545 // Load initial scroll position
@@ -24,7 +54,7 @@ const ListViewPresenter = observer(({ model }) => {
2454 useEffect ( ( ) => {
2555 const cleanup = syncScrollPositionToFirebase ( model , scrollContainerRef ) ;
2656 return ( ) => cleanup ;
27- } , [ model . user , scrollContainerRef ] ) ;
57+ } , [ model . user , model . currentSearch , scrollContainerRef ] ) ;
2858
2959 const addFavourite = ( course ) => {
3060 model . addFavourite ( course ) ;
@@ -60,16 +90,20 @@ const ListViewPresenter = observer(({ model }) => {
6090 return < ListView
6191 courses = { model . courses }
6292 searchResults = { model . currentSearch }
93+
6394 favouriteCourses = { model . favourites }
6495 addFavourite = { addFavourite }
6596 removeFavourite = { removeFavourite }
97+ handleFavouriteClick = { handleFavouriteClick }
98+
6699 isPopupOpen = { isPopupOpen }
67100 setIsPopupOpen = { setIsPopupOpen }
68101 setSelectedCourse = { setSelectedCourse }
69102 popup = { popup }
70- handleFavouriteClick = { handleFavouriteClick }
103+
71104 targetScroll = { model . scrollPosition }
72105 scrollContainerRef = { scrollContainerRef }
106+ persistantScrolling = { persistantScrolling }
73107 /> ;
74108} ) ;
75109
0 commit comments