|
|
| function initChatUpdater(contactId) {
|
|
|
| if (!contactId || contactId === 0) return;
|
|
|
|
|
| let lastMessageId = getLastMessageId();
|
|
|
|
|
| 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 = `
|
| <div class="message-content p-3 rounded ${message.sender_id == userId ? 'bg-primary text-white' : 'bg-light'}">
|
| ${message.content}
|
| `;
|
|
|
|
|
| if (message.attachment) {
|
| const attachment = message.attachment;
|
| messageContent += `
|
| <div class="message-attachment mt-2">
|
| <div class="attachment-info">
|
| <i class="fas ${getAttachmentIcon(attachment.file_type)}"></i>
|
| <a href="/download/${attachment.id}" class="attachment-link">
|
| ${attachment.original_filename}
|
| </a>
|
| <span class="attachment-size">${attachment.size_formatted}</span>
|
| </div>
|
| `;
|
|
|
|
|
| if (attachment.file_type === 'image') {
|
| messageContent += `
|
| <div class="attachment-preview mt-2">
|
| <a href="/download/${attachment.id}" target="_blank">
|
| <img src="/download/${attachment.id}" class="img-thumbnail" style="max-width: 200px; max-height: 200px;">
|
| </a>
|
| </div>
|
| `;
|
| } else if (attachment.file_type === 'video') {
|
| messageContent += `
|
| <div class="attachment-preview mt-2">
|
| <video controls class="img-thumbnail" style="max-width: 250px; max-height: 250px;">
|
| <source src="/download/${attachment.id}" type="video/mp4">
|
| Ваш браузер не поддерживает видео.
|
| </video>
|
| </div>
|
| `;
|
| } else if (attachment.file_type === 'audio') {
|
| messageContent += `
|
| <div class="attachment-preview mt-2">
|
| <audio controls style="max-width: 250px;">
|
| <source src="/download/${attachment.id}">
|
| Ваш браузер не поддерживает аудио.
|
| </audio>
|
| </div>
|
| `;
|
| }
|
|
|
| messageContent += `
|
| </div>
|
| `;
|
| }
|
|
|
|
|
| messageContent += `
|
| <div class="message-time text-end">
|
| <small class="${message.sender_id == userId ? 'text-white-50' : 'text-muted'}">
|
| ${message.created_at}
|
| ${message.sender_id == userId ?
|
| (message.is_read ? '<i class="fas fa-check-double"></i>' : '<i class="fas fa-check"></i>') :
|
| ''}
|
| </small>
|
| </div>
|
| </div>
|
| `;
|
|
|
| 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;
|
| }
|
|
|
|
|
| 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));
|
| }
|
|
|
|
|
| const intervalId = setInterval(fetchNewMessages, 5000);
|
|
|
|
|
| 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;
|
| }
|
| } |