| |
|
| | 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;
|
| | }
|
| | } |