From 43f5edbbc3b37d693c3eb497bac09eca3d924a07 Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 27 May 2026 17:31:55 +0300 Subject: [PATCH] =?UTF-8?q?debug(tracker):=20=D0=B2=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20console.log=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D1=89=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20sync?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пользователь видит '1 из N' (от моих тестовых POST через API) но клики в браузере не увеличивают счётчик. Добавлены логи: - на boot: slug, есть ли LS, есть ли токен - на клик по пилюле: ключ - на каждый POST: тело + HTTP-статус ответа - на ошибку: response.text или fetch-exception Цель — собрать сигнал из DevTools-консоли пользователя. Уберём после диагностики (одобрено как временное). --- frontend/js/textbook-tracker.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/frontend/js/textbook-tracker.js b/frontend/js/textbook-tracker.js index fdb8f0b..a144bdb 100644 --- a/frontend/js/textbook-tracker.js +++ b/frontend/js/textbook-tracker.js @@ -31,26 +31,32 @@ let syncPending = false; let pendingExtra = null; function syncToServer(extra) { - if (typeof LS === 'undefined' || !LS.getToken || !LS.getToken()) return; + if (typeof LS === 'undefined' || !LS.getToken) { console.warn('[tracker] LS не загружен — пропускаем sync'); return; } + if (!LS.getToken()) { console.warn('[tracker] нет токена в localStorage — пользователь не залогинен'); return; } if (syncPending) { pendingExtra = Object.assign(pendingExtra || {}, extra || {}); return; } syncPending = true; + const body = JSON.stringify({ last_para: localState.last, ...(extra || {}) }); + console.log('[tracker]', slug, '→ POST', body); fetch('/api/textbooks/' + slug + '/progress', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + LS.getToken(), }, - body: JSON.stringify({ last_para: localState.last, ...(extra || {}) }), + body, + }).then(r => { + console.log('[tracker]', slug, '← HTTP', r.status); + if (!r.ok) r.text().then(t => console.warn('[tracker] ошибка:', t)); }).finally(() => { syncPending = false; if (pendingExtra) { const next = pendingExtra; pendingExtra = null; syncToServer(next); } - }).catch(() => {}); + }).catch(e => console.warn('[tracker] fetch упал:', e)); } /* ── 2. Initial load: merge server data into local state + push back ── @@ -224,6 +230,7 @@ const pill = e.target.closest('.para-pill[data-para]'); if (!pill) return; const key = pill.dataset.para; + console.log('[tracker] клик по пилюле', key); localState.last = key; if (!localState.read.includes(key)) { localState.read.push(key); @@ -456,6 +463,7 @@ } function boot() { + console.log('[tracker] boot, slug =', slug, '| LS:', typeof LS !== 'undefined', '| token:', typeof LS !== 'undefined' && LS.getToken && !!LS.getToken()); injectStyles(); installBackButton(); installBookmarksBtn();