44
55const ListView = {
66 name : 'ListView' ,
7- template : `<transition-group name="fade" appear>
7+ template : `<transition-group name="fade" appear @after-enter="restoreScroll" >
88 <div class="listview" v-for="(activity, index) in sortedActivities" :key="activity.id">
99 <div class="listview_left" >
1010 <icon
@@ -94,13 +94,28 @@ const ListView = {
9494 constant : {
9595 timerPopupDuration : 1000 ,
9696 } ,
97+ scrollRestored : false ,
98+ scrollbar_session_value : 0 , // Saved scroll position from user preferences
9799 }
98100 } ,
99101
100102 props : [ 'filter' ] ,
101103
102104 mounted ( ) {
103105 this . getUser ( ) ;
106+ // Setup scroll event listener to save scroll position
107+ const container = document . getElementById ( 'canvas' ) ;
108+ if ( container ) {
109+ container . addEventListener ( 'scroll' , this . onScroll ) ;
110+ }
111+ } ,
112+
113+ beforeUnmount ( ) {
114+ // Remove scroll event listener
115+ const container = document . getElementById ( 'canvas' ) ;
116+ if ( container ) {
117+ container . removeEventListener ( 'scroll' , this . onScroll ) ;
118+ }
104119 } ,
105120
106121 beforeUnmount ( ) {
@@ -125,19 +140,33 @@ const ListView = {
125140
126141 methods : {
127142 async getUser ( ) {
128- sugarizer . modules . user . get ( ) . then ( ( user ) => {
143+ // Keep promise-style error handling while keeping the function async
144+ // Return the underlying promise so callers can await if needed.
145+ return sugarizer . modules . user . get ( ) . then ( ( user ) => {
129146 this . buddycolor = user . color ;
147+ this . scrollbar_session_value = user . scrollValue || 0 ;
130148 sugarizer . modules . activities . updateFavorites ( user . favorites ) ;
131- this . activities = sugarizer . modules . activities . get ( ) . filter ( ( activity ) => {
132- return activity . name . toUpperCase ( ) . includes ( this . filter . toUpperCase ( ) )
133- } ) ;
149+ this . activities = sugarizer . modules . activities . get ( ) . filter ( a =>
150+ a . name . toUpperCase ( ) . includes ( this . filter . toUpperCase ( ) )
151+ ) ;
134152 this . favactivities = sugarizer . modules . activities . getFavoritesName ( ) ;
135153 this . activitiesLoaded = true ;
136154 } , ( error ) => {
137- throw new Error ( 'Unable to load the user, error ' + error ) ;
155+ // preserve original rejection semantics
156+ throw new Error ( 'Unable to get the user, error ' + error ) ;
138157 } ) ;
139158 } ,
140159
160+ restoreScroll ( ) {
161+ if ( this . scrollRestored ) return ;
162+ this . scrollRestored = true ;
163+
164+ const container = document . getElementById ( 'canvas' ) ;
165+ if ( container && this . scrollbar_session_value > 0 ) {
166+ container . scrollTop = this . scrollbar_session_value ;
167+ }
168+ } ,
169+
141170 async toggleFavorite ( activity ) {
142171 sugarizer . modules . stats . trace ( 'list_view' , 'switch_favorite' , activity . id , null ) ;
143172
@@ -182,9 +211,25 @@ const ListView = {
182211 } ,
183212
184213 launchActivity ( activity ) {
214+ // Save scroll position to user preferences before launching activity
215+ const container = document . getElementById ( 'canvas' ) ;
216+ if ( container ) {
217+ const scrollPos = container . scrollTop ;
218+ sugarizer . modules . user . update ( { scrollValue : scrollPos } ) ;
219+ }
185220 sugarizer . modules . activities . runActivity ( activity , null , activity . title , undefined , false , 'list_view' ) ;
186221 } ,
187222
223+ onScroll ( event ) {
224+ const container = event . target ;
225+ const scrollPos = Math . ceil ( container . scrollTop ) ;
226+ const maxScroll = Math . ceil ( container . scrollHeight - container . clientHeight ) ;
227+
228+ sugarizer . modules . user . update ( {
229+ scrollValue : Math . min ( scrollPos , maxScroll )
230+ } ) ;
231+ } ,
232+
188233 computePopup ( ) {
189234 const popupData = { } ;
190235 const activities = sugarizer . modules . activities . get ( ) ;
0 commit comments