Fix: formatTime undefined → appendMessage падал → чат пустой

Grok не зря говорил — bubbles не появлялись из-за неопределённой
функции formatTime в appendMessage template. ReferenceError ловился
в try/catch, но bubbles не рендерились.

Добавлен formatTime(s) в app.js + try/catch в appendMessage с
отправкой AppendMsgError на /api/v1/debug/log
This commit is contained in:
root 2026-08-24 17:41:58 +00:00
parent bfaa3af1af
commit bc47c1ff64
3 changed files with 33 additions and 10 deletions

View File

@ -34,15 +34,15 @@
</button>
</nav>
</div>
<script src="/js/tg.js?v=27"></script>
<script src="/js/api.js?v=27"></script>
<script src="/js/views/map.js?v=27"></script>
<script src="/js/views/chats.js?v=27"></script>
<script src="/js/views/chat.js?v=27"></script>
<script src="/js/views/profile.js?v=27"></script>
<script src="/js/views/settings.js?v=27"></script>
<script src="/js/views/onboarding.js?v=27"></script>
<script src="/js/views/review.js?v=27"></script>
<script src="/js/app.js?v=27"></script>
<script src="/js/tg.js?v=28"></script>
<script src="/js/api.js?v=28"></script>
<script src="/js/views/map.js?v=28"></script>
<script src="/js/views/chats.js?v=28"></script>
<script src="/js/views/chat.js?v=28"></script>
<script src="/js/views/profile.js?v=28"></script>
<script src="/js/views/settings.js?v=28"></script>
<script src="/js/views/onboarding.js?v=28"></script>
<script src="/js/views/review.js?v=28"></script>
<script src="/js/app.js?v=28"></script>
</body>
</html>

View File

@ -556,6 +556,22 @@ function escapeHtml(s) {
return String(s).replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
}
function formatTime(s) {
if (!s) return '';
try {
const d = new Date(s);
if (isNaN(d.getTime())) return '';
const now = new Date();
const sameDay = d.toDateString() === now.toDateString();
const hh = String(d.getHours()).padStart(2, '0');
const mm = String(d.getMinutes()).padStart(2, '0');
if (sameDay) return `${hh}:${mm}`;
const dd = String(d.getDate()).padStart(2, '0');
const mo = String(d.getMonth() + 1).padStart(2, '0');
return `${dd}.${mo} ${hh}:${mm}`;
} catch { return ''; }
}
// Debug-оверлей: показывает ошибки JS прямо на экране (для отладки в обычном браузере)
window.addEventListener('error', (e) => {
console.error('Global error:', e);

View File

@ -83,6 +83,7 @@ const ChatView = {
appendMessage(m) {
console.log('[Chat] appendMessage called, m:', JSON.stringify(m).slice(0, 200), 'me check:', API.Store.user && m.sender_id === (API.Store.user.id || API.Store.user.user_id));
try {
const box = document.getElementById('messages');
if (!box) { console.error('[Chat] appendMessage: no box'); return; }
const me = API.Store.user && m.sender_id === (API.Store.user.id || API.Store.user.user_id);
@ -110,6 +111,12 @@ const ChatView = {
box.appendChild(div);
console.log('[Chat] appended bubble, children:', box.children.length);
box.scrollTop = box.scrollHeight;
} catch (e) {
console.error('[Chat] appendMessage EXCEPTION:', e, 'm:', JSON.stringify(m).slice(0, 200));
try {
fetch('/api/v1/debug/log', { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ kind: 'AppendMsgError', msg: String(e && e.message), stack: String(e && e.stack || '').slice(0, 400), m: String(JSON.stringify(m).slice(0, 200)) }) });
} catch {}
}
},
onMessageClick(m) {