Fix: улучшена загрузка видео и сделан текст необязательным

Исправления видео:
- Видео элементы теперь создаются программно через createElement
- Удалён setTimeout, добавлена прямая замена placeholder'ов
- video.load() вызывается сразу после создания элемента
- Исправлен доступ к правильному контейнеру вложения

Текст необязателен при файлах:
- Удалён атрибут required у textarea
- Добавлена валидация: должен быть либо текст, либо файлы
- При отправке файла без текста отправляется пустая строка
- Показывается alert если нет ни текста, ни файлов
This commit is contained in:
admin i 2025-11-28 08:14:08 +03:00
parent e2f29fc6bd
commit f64d06f2da
2 changed files with 44 additions and 10 deletions

View File

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

View File

@ -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);