import { useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { MediaFile } from "@/features/media/types/media" interface VideoPanelProps { video: MediaFile isActive: boolean videoRefs?: Record index?: number hideLabel?: boolean labelPosition?: "left" | "right" | "center" } /** * Компонент для отображения видео в шаблоне * Используем React.memo с функцией сравнения для предотвращения лишних рендеров */ export function VideoPanelComponent({ video, isActive, videoRefs, hideLabel = false, labelPosition = "center", }: VideoPanelProps) { const videoRef = useRef(null) const [isReady] = useState(false) const { t } = useTranslation() // Эффект для регистрации видео в videoRefs и обновления src при изменении источника useEffect(() => { if (videoRef.current && video.id && videoRefs) { console.log(`[VideoPanel] Регистрация видео ${video.id} startTime=${video.startTime}`) // Сохраняем ссылку на видео элемент videoRefs[video.id] = videoRef.current // Проверяем, что src установлен правильно if (video.path && !videoRef.current.src?.includes(video.id)) { console.log(`[VideoPanel] Принудительно обновляем src для видео ${video.id}: ${video.path}`) // Сохраняем текущее время и состояние воспроизведения const currentTime = videoRef.current.currentTime const wasPlaying = !videoRef.current.paused // Обновляем src с небольшой задержкой для предотвращения черного экрана setTimeout(() => { if (videoRef.current) { // Обновляем src videoRef.current.src = video.path videoRef.current.load() // Восстанавливаем время и состояние воспроизведения if (currentTime > 0) { videoRef.current.currentTime = currentTime } if (wasPlaying) { videoRef.current .play() .catch((e: unknown) => console.error(`[VideoPanel] Ошибка воспроизведения видео ${video.id}:`, e)) } } }, 100) } return () => { // Не удаляем ссылку на видео элемент при размонтировании компонента // Это позволяет избежать черного экрана при переключении между видео // delete videoRefs[video.id] } } }, [video, videoRefs]) const videoKey = video.path ? video.path : `empty-${video.id}` console.log(`[VideoPanel] Рендеринг видео с ключом: ${videoKey}`) return (
{video.path ? (