/** * VideoPlayer с поддержкой предпросмотра переходов * Интегрирует существующий VideoPlayer с TransitionsPreviewService */ import { useEffect, useRef } from "react" import { AspectRatio } from "@/components/ui/aspect-ratio" import { usePlayerAIIntegration } from "@/features/ai-chat/hooks/use-player-ai-integration" import { useProjectSettings } from "@/features/project-settings" import { useTimeline } from "@/features/timeline/hooks/use-timeline" import { convertVideoSrc } from "@/lib/tauri-utils" import { useTransitionPreview } from "../hooks/use-transition-preview" import { usePlayer } from "../services/player-provider" import { PlayerAIOverlay } from "./player-ai-overlay" import { PlayerControls } from "./player-controls" import { TransitionMiniIndicator, TransitionPlayerOverlay } from "./transition-player-overlay" interface VideoPlayerWithTransitionsProps { className?: string showTransitionOverlay?: boolean showMiniIndicator?: boolean enableTransitionPreview?: boolean } /** * VideoPlayer с поддержкой предпросмотра переходов в реальном времени */ export function VideoPlayerWithTransitions({ className, showTransitionOverlay = false, showMiniIndicator = true, enableTransitionPreview = true, }: VideoPlayerWithTransitionsProps) { const { settings: { aspectRatio }, } = useProjectSettings() const { currentVideo: video } = usePlayer() const { currentTime } = useTimeline() // Подключаем AI интеграцию const { isReady: aiReady } = usePlayerAIIntegration() // Refs для видео элементов и canvas const videoRefA = useRef(null) const videoRefB = useRef(null) const canvasRef = useRef(null) // Хук для управления предпросмотром переходов const { state: transitionState, renderTransition, isTransitionActive, } = useTransitionPreview({ enablePreview: enableTransitionPreview, autoPlay: false, // Управляется вручную через timeline loop: false, }) // Вычисляем соотношение сторон const aspectRatioValue = aspectRatio.value.width / aspectRatio.value.height // Рендеринг переходов при изменении состояния useEffect(() => { if ( transitionState.activeTransition && canvasRef.current && videoRefA.current && videoRefB.current && enableTransitionPreview ) { renderTransition(videoRefA.current, videoRefB.current, canvasRef.current) } }, [transitionState, renderTransition, enableTransitionPreview]) // Стили контейнера const containerStyle = { position: "relative" as const, width: "100%", height: "100%", display: "flex", justifyContent: "center", alignItems: "center", overflow: "hidden", } // Если нет видео if (!video?.path) { const file = { id: "no-video", path: "", name: "Нет видео", size: 0, type: "video/mp4", } return (
) } return (
{/* Основное видео */}
) }