up
This commit is contained in:
+13
-12
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user