Skip to content

Commit f4efca8

Browse files
author
Lionel Laské
committed
Merge branch 'pr/1908' into dev
2 parents aad3d62 + 815cf59 commit f4efca8

File tree

1 file changed

+51
-6
lines changed

1 file changed

+51
-6
lines changed

js/screens/listview.js

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
const 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

Comments
 (0)