// Функция для автоматического обновления сообщений в чате function initChatUpdater(contactId) { // Если нет активного контакта, не запускаем обновление if (!contactId || contactId === 0) return; // Последний ID сообщения, которое мы видели let lastMessageId = getLastMessageId(); // Функция для получения ID последнего сообщения в чате function getLastMessageId() { const messages = document.querySelectorAll('.message'); if (messages.length > 0) { const lastMessage = messages[messages.length - 1]; return lastMessage.dataset.messageId || 0; } return 0; } // Функция для добавления новых сообщений в чат function addNewMessages(messages, userId) { const chatMessages = document.getElementById('chatMessages'); const wasScrolledToBottom = isScrolledToBottom(chatMessages); // Добавляем каждое новое сообщение messages.forEach(message => { const messageDiv = document.createElement('div'); messageDiv.className = `message ${message.sender_id == userId ? 'message-sent' : 'message-received'} mb-3`; messageDiv.dataset.messageId = message.id; // Базовое содержимое сообщения let messageContent = `
${message.content} `; // Добавляем вложение, если оно есть if (message.attachment) { const attachment = message.attachment; messageContent += `
${attachment.original_filename} ${attachment.size_formatted}
`; // Добавляем предпросмотр в зависимости от типа файла if (attachment.file_type === 'image') { messageContent += ` `; } else if (attachment.file_type === 'video') { messageContent += `
`; } else if (attachment.file_type === 'audio') { messageContent += `
`; } messageContent += `
`; } // Добавляем время и статус прочтения messageContent += `
${message.created_at} ${message.sender_id == userId ? (message.is_read ? '' : '') : ''}
`; messageDiv.innerHTML = messageContent; chatMessages.appendChild(messageDiv); }); // Функция для получения иконки в зависимости от типа файла function getAttachmentIcon(fileType) { switch(fileType) { case 'image': return 'fa-image'; case 'video': return 'fa-video'; case 'audio': return 'fa-music'; case 'text': return 'fa-file-alt'; default: return 'fa-file'; } } // Если пользователь был прокручен вниз, прокручиваем к новым сообщениям if (wasScrolledToBottom) { chatMessages.scrollTop = chatMessages.scrollHeight; } // Обновляем последний ID сообщения if (messages.length > 0) { lastMessageId = messages[messages.length - 1].id; } } // Проверка, прокручен ли чат до конца function isScrolledToBottom(element) { return element.scrollHeight - element.clientHeight <= element.scrollTop + 1; } // Функция для получения новых сообщений function fetchNewMessages() { fetch(`/get_new_messages/${contactId}?last_id=${lastMessageId}`) .then(response => response.json()) .then(data => { if (data.messages && data.messages.length > 0) { addNewMessages(data.messages, data.user_id); } }) .catch(error => console.error('Ошибка при получении новых сообщений:', error)); } // Запускаем периодическое обновление каждые 5 секунд const intervalId = setInterval(fetchNewMessages, 5000); // Сохраняем ID интервала, чтобы можно было его остановить при необходимости window.chatUpdateInterval = intervalId; // Обработчик отправки формы сообщения const messageForm = document.getElementById('messageForm'); if (messageForm) { messageForm.addEventListener('submit', function(e) { // Стандартная отправка формы происходит, но после успешной отправки // мы сразу запрашиваем новые сообщения, чтобы не ждать интервала setTimeout(fetchNewMessages, 500); }); } } // Остановка обновления чата при переходе на другую страницу function stopChatUpdater() { if (window.chatUpdateInterval) { clearInterval(window.chatUpdateInterval); window.chatUpdateInterval = null; } }