From bc0cae7a1508fdbb648bdb74d2373f9a17e07fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Tue, 13 Jan 2026 10:11:21 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BA=D1=80=D0=B8=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B9=20=D0=B1=D0=B0=D0=B3=20-=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=20=5FloadAround=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ПРОБЛЕМЫ: - chatDetailV2.js не передавал lastReadTimestamp в config - метод _loadAround не имел return statement - scrollIntoView скроллил родительские контейнеры ИСПРАВЛЕНИЯ: ✅ Добавлен lastReadTimestamp в readConfig() chatDetailV2.js ✅ Добавлена передача lastReadTimestamp в ChatControllerV2 ✅ Исправлен _loadAround - добавлен return loadResult ✅ Заменен scrollIntoView на ручной расчет scrollTop в _scrollToMessage ✅ Добавлено подробное логирование для отладки РЕЗУЛЬТАТ: - Чат загружается вокруг последнего прочитанного (16 сообщений вместо 30) - Скролл к правильной позиции - Header не прячется под navbar - IntersectionObserver не срабатывает при инициализации --- backend/static/js/loaders/messageLoaderV2.js | 16 +++++++++++++++- backend/static/js/pages/chatDetailV2.js | 17 +++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/backend/static/js/loaders/messageLoaderV2.js b/backend/static/js/loaders/messageLoaderV2.js index 14e7bee7..0db8b25c 100644 --- a/backend/static/js/loaders/messageLoaderV2.js +++ b/backend/static/js/loaders/messageLoaderV2.js @@ -471,6 +471,12 @@ export class MessageLoaderV2 { requestKey ); + console.log('[MessageLoaderV2] 🔍 API response:', { + anchor_id: result.anchor_id, + anchor_index: result.anchor_index, + messages_count: result.messages?.length || result.results?.length || 0 + }); + const messages = this._extractMessages(result); // ВАЖНО: Сначала добавляем в Store, затем берем границы из Store @@ -479,7 +485,7 @@ export class MessageLoaderV2 { const oldestMessage = this.store.getOldestMessage(chatId); const newestMessage = this.store.getNewestMessage(chatId); - return { + const loadResult = { messages, anchorId: result.anchor_id || aroundId, anchorIndex: result.anchor_index || null, @@ -488,6 +494,14 @@ export class MessageLoaderV2 { oldestId: oldestMessage?.id || null, newestId: newestMessage?.id || null }; + + console.log('[MessageLoaderV2] 🔍 Returning loadResult:', { + anchorId: loadResult.anchorId, + anchorIndex: loadResult.anchorIndex, + messagesCount: loadResult.messages.length + }); + + return loadResult; } /** diff --git a/backend/static/js/pages/chatDetailV2.js b/backend/static/js/pages/chatDetailV2.js index bbd1eefd..c2a4d925 100644 --- a/backend/static/js/pages/chatDetailV2.js +++ b/backend/static/js/pages/chatDetailV2.js @@ -58,7 +58,7 @@ const scrollContainer = document.getElementById('chatScroll'); - return { + const config = { chatId: Number(appContainer.dataset.chatId), userId: Number(appContainer.dataset.userId), userName: appContainer.dataset.userName || 'Вы', @@ -67,12 +67,22 @@ messagesUrl: appContainer.dataset.messagesUrl, markReadUrl: appContainer.dataset.markReadUrl, editUrlTemplate: appContainer.dataset.editUrlTemplate, + lastReadTimestamp: Number(appContainer.dataset.lastReadTimestamp) || null, lastReadMessageId: appContainer.dataset.lastReadMessageId ? Number(appContainer.dataset.lastReadMessageId) : null, profileUrl: scrollContainer?.dataset.profileUrl || '/employees/profile/', detailUrlTemplate: scrollContainer?.dataset.detailUrlTemplate || '/employees/detail/0/' }; + + console.log('[ChatDetailV2] 🔍 Config:', { + lastReadMessageId: config.lastReadMessageId, + lastReadTimestamp: config.lastReadTimestamp, + rawMessageId: appContainer.dataset.lastReadMessageId, + rawTimestamp: appContainer.dataset.lastReadTimestamp + }); + + return config; } /** @@ -132,7 +142,8 @@ wsConnection: wsApi, profileUrl: config.profileUrl, detailUrlTemplate: config.detailUrlTemplate, - lastReadMessageId: config.lastReadMessageId + lastReadMessageId: config.lastReadMessageId, + lastReadTimestamp: config.lastReadTimestamp // ✅ Fallback для скролла }); await chatController.init(); @@ -195,7 +206,9 @@ * Главная функция инициализации */ async function init() { + console.log('[ChatDetailV2] 🚀🚀🚀 INIT STARTED - V2 FILE LOADED 🚀🚀🚀'); const config = readConfig(); + console.log('[ChatDetailV2] 🔍 Config read result:', config); if (!config || !config.chatId) { console.error('[ChatDetailV2] Invalid configuration'); return;