Fix: улучшена загрузка видео и сделан текст необязательным
Исправления видео: - Видео элементы теперь создаются программно через createElement - Удалён setTimeout, добавлена прямая замена placeholder'ов - video.load() вызывается сразу после создания элемента - Исправлен доступ к правильному контейнеру вложения Текст необязателен при файлах: - Удалён атрибут required у textarea - Добавлена валидация: должен быть либо текст, либо файлы - При отправке файла без текста отправляется пустая строка - Показывается alert если нет ни текста, ни файлов
This commit is contained in:
parent
e2f29fc6bd
commit
f64d06f2da
@ -223,14 +223,42 @@ export function createMessageElement(msg, options = {}) {
|
||||
wrap.innerHTML = `${bubble}<a class="ms-2 text-decoration-none" href="${profileUrl}">${ava}</a>`;
|
||||
}
|
||||
|
||||
// Принудительно загружаем видео после добавления в DOM
|
||||
// Принудительно создаём и загружаем видео элементы после добавления в DOM
|
||||
if (msg.has_attachments && msg.attachments && msg.attachments.length > 0) {
|
||||
setTimeout(() => {
|
||||
const videos = wrap.querySelectorAll('video');
|
||||
videos.forEach(video => {
|
||||
video.load();
|
||||
});
|
||||
}, 100);
|
||||
// Находим все video placeholder'ы и заменяем их реальными элементами
|
||||
const videoContainers = wrap.querySelectorAll('.attachment-item');
|
||||
msg.attachments.forEach((att, index) => {
|
||||
if (att.file_type === 'video') {
|
||||
const container = videoContainers[index];
|
||||
if (container) {
|
||||
// Очищаем контейнер
|
||||
container.innerHTML = '';
|
||||
|
||||
// Создаём video элемент программно
|
||||
const video = document.createElement('video');
|
||||
video.controls = true;
|
||||
video.preload = 'metadata';
|
||||
video.className = 'w-100';
|
||||
video.style.maxWidth = '400px';
|
||||
|
||||
const source = document.createElement('source');
|
||||
source.src = att.file_url;
|
||||
source.type = att.mime_type;
|
||||
|
||||
video.appendChild(source);
|
||||
|
||||
const textDiv = document.createElement('div');
|
||||
textDiv.className = 'small text-secondary';
|
||||
textDiv.textContent = att.file_name;
|
||||
|
||||
container.appendChild(video);
|
||||
container.appendChild(textDiv);
|
||||
|
||||
// Загружаем видео
|
||||
video.load();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return wrap;
|
||||
|
||||
@ -200,8 +200,7 @@
|
||||
id="id_content"
|
||||
class="form-control composer-textarea"
|
||||
rows="1"
|
||||
placeholder="Напишите сообщение…"
|
||||
required></textarea>
|
||||
placeholder="Напишите сообщение…"></textarea>
|
||||
</div>
|
||||
|
||||
<!-- Кнопка отправки -->
|
||||
@ -349,10 +348,17 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
const textarea = document.getElementById('id_content');
|
||||
const content = textarea.value.trim();
|
||||
|
||||
// Проверка: должен быть либо текст, либо файлы
|
||||
if (!content && selectedFiles.length === 0) {
|
||||
alert('Введите текст сообщения или прикрепите файл');
|
||||
return;
|
||||
}
|
||||
|
||||
// Если есть вложения, отправляем через API
|
||||
if (selectedFiles.length > 0) {
|
||||
const formData = new FormData();
|
||||
formData.append('content', content || 'Вложение');
|
||||
// Если текст пустой, отправляем пустую строку
|
||||
formData.append('content', content || '');
|
||||
|
||||
selectedFiles.forEach((file, index) => {
|
||||
formData.append(`file_${index}`, file);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user