This commit is contained in:
Lizandro Guarnizo
2026-02-21 11:45:32 -05:00
parent e00c96c614
commit 51f1b04293
3 changed files with 36 additions and 13 deletions
+13 -12
View File
@@ -2547,6 +2547,7 @@ if (!isset($_SESSION['user_id'])) {
if (append) {
this.conversations = this.conversations.concat(items);
this._justLoadedMore = true; // evita que renderConversations baje el scroll y dispare otro loadMore
} else {
this.conversations = items;
}
@@ -2688,29 +2689,29 @@ if (!isset($_SESSION['user_id'])) {
this._prevConversations[c.user_id] = { unread_count: c.unread_count };
});
// Preserve sidebar scroll position as best-effort: snapshot and restore using delta
// Preservar posición visual del scroll del sidebar
try {
const prevScrollTop = container.scrollTop;
const prevScrollTop = container.scrollTop;
const prevScrollHeight = container.scrollHeight;
const wasAtTop = prevScrollTop <= 4;
const wasAtTop = prevScrollTop <= 4;
// Flag: si veníamos de un loadMore (items appended al fondo) NO compensar
const wasLoadingMore = !!this._justLoadedMore;
this._justLoadedMore = false;
container.innerHTML = html;
void container.offsetHeight; // forzar repaint
const newScrollHeight = container.scrollHeight;
const scrollDelta = newScrollHeight - prevScrollHeight;
if (wasAtTop) {
container.scrollTop = 0;
} else if (wasLoadingMore) {
// Items se agregaron al FONDO — mantener posición exacta sin compensar
// (compensar causaría que el scroll baje y disparara otro loadMore)
container.scrollTop = prevScrollTop;
} else {
// Restaurar posición visual exacta compensando cambio de altura del contenido
// Re-render normal (SSE update): compensar cambio de altura
const scrollDelta = container.scrollHeight - prevScrollHeight;
container.scrollTop = Math.max(0, prevScrollTop + scrollDelta);
// NOTA: NO llamar scrollIntoView aquí — se ejecuta en cada update SSE
// y causa que el scroll baje solo continuamente hasta el fondo.
// scrollIntoView solo se llama manualmente al abrir una conversación.
}
console.log('✅ renderConversations COMPLETADO');
} catch (e) {
console.warn('renderConversations: scroll preservation failed', e);
container.innerHTML = html;