aboutsummaryrefslogtreecommitdiffstats
path: root/src/features
diff options
context:
space:
mode:
Diffstat (limited to 'src/features')
-rw-r--r--src/features/messages.js14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/features/messages.js b/src/features/messages.js
index 701b131..dd31f46 100644
--- a/src/features/messages.js
+++ b/src/features/messages.js
@@ -3021,7 +3021,20 @@ export function messagesFeature(ctx) {
}
}
+ // A profile opens at its top: keeping the feed's scroll offset landed the
+ // reader deep in that person's posts, which read as a thread. Back (a
+ // popstate) puts them where they were on the page they left.
+ const profReturn = []; // [{ pk, y }] per profile opened, newest last
+ window.addEventListener('popstate', () => {
+ const top = profReturn[profReturn.length - 1];
+ if (!top || ui.profilePk === top.pk) return;
+ profReturn.pop();
+ requestAnimationFrame(() => { try { window.scrollTo(0, top.y); } catch {} });
+ });
function openProfile(pk) {
+ let y = 0; try { y = window.scrollY || 0; } catch {}
+ if (ui.profilePk !== pk) profReturn.push({ pk, y });
+ if (profReturn.length > 20) profReturn.shift();
ui.profilePk = pk;
// Opened from inside a thread (an author's avatar/name), the profile
// stacks ON TOP of it — back returns to the conversation. The screen
@@ -3030,6 +3043,7 @@ export function messagesFeature(ctx) {
ui.profOverThread = !!ui.noteThread;
ui.profEdit = null; ui.profEditFilled = false; ui.logoutConfirm = null; ui.profCompose = null;
render();
+ try { window.scrollTo(0, 0); } catch {}
fetchFullProfile(pk);
notesFor(pk);
}