/** * Компонент для интеграции Speed Ramping с Timeline UI */ import { useEffect } from "react" import { useSpeedRampingPlayerIntegration } from "../hooks/use-speed-ramping-player-integration" import { useTimeline } from "../hooks/use-timeline" export function TimelineSpeedRampingIntegration() { const timeline = useTimeline() const { updatePlaybackRateForTime, setAutoUpdateEnabled, resetPlaybackRate } = useSpeedRampingPlayerIntegration() // Автоматически включаем интеграцию при монтировании useEffect(() => { setAutoUpdateEnabled(true) return () => { setAutoUpdateEnabled(false) } }, [setAutoUpdateEnabled]) // Обновляем скорость при изменении времени воспроизведения useEffect(() => { if (timeline.isPlaying) { updatePlaybackRateForTime(timeline.currentTime) } }, [timeline.currentTime, timeline.isPlaying, updatePlaybackRateForTime]) // Сбрасываем скорость при паузе useEffect(() => { if (!timeline.isPlaying) { resetPlaybackRate() } }, [timeline.isPlaying, resetPlaybackRate]) // Этот компонент не рендерит UI, только обрабатывает логику return null } /** * Индикатор текущей скорости воспроизведения */ export function SpeedRampingIndicator() { const { getCurrentPlaybackRate, isSpeedRampingActive } = useSpeedRampingPlayerIntegration() const timeline = useTimeline() const currentRate = getCurrentPlaybackRate() const hasActiveSpeedRamping = timeline.project ? timeline.project.globalTracks?.some((track) => track.clips?.some((clip) => isSpeedRampingActive(clip.id))) || timeline.project.sections?.some((section) => section.tracks?.some((track) => track.clips?.some((clip) => isSpeedRampingActive(clip.id))), ) : false if (!hasActiveSpeedRamping || currentRate === 1.0) { return null } return (