"use client"; import { useRef } from "react"; import { TIMELINE_CONSTANTS } from "@/constants/timeline-constants"; import { useTimelinePlayhead } from "@/hooks/timeline/use-timeline-playhead"; import { useEditor } from "@/hooks/use-editor"; interface TimelinePlayheadProps { zoomLevel: number; rulerRef: React.RefObject; rulerScrollRef: React.RefObject; tracksScrollRef: React.RefObject; timelineRef: React.RefObject; playheadRef?: React.RefObject; isSnappingToPlayhead?: boolean; } export function TimelinePlayhead({ zoomLevel, rulerRef, rulerScrollRef, tracksScrollRef, timelineRef, playheadRef: externalPlayheadRef, isSnappingToPlayhead = false, }: TimelinePlayheadProps) { const editor = useEditor(); const duration = editor.timeline.getTotalDuration(); const internalPlayheadRef = useRef(null); const playheadRef = externalPlayheadRef || internalPlayheadRef; const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ zoomLevel, rulerRef, rulerScrollRef, tracksScrollRef, playheadRef, }); const timelineContainerHeight = tracksScrollRef.current?.clientHeight ?? timelineRef.current?.clientHeight ?? 400; const totalHeight = Math.max(0, timelineContainerHeight - 4); const timelinePosition = playheadPosition * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel; const leftPosition = timelinePosition; const handlePlayheadKeyDown = ( event: React.KeyboardEvent, ) => { if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return; event.preventDefault(); const step = 1 / Math.max(1, editor.project.getActive().settings.fps); const direction = event.key === "ArrowRight" ? 1 : -1; const nextTime = Math.max( 0, Math.min(duration, playheadPosition + direction * step), ); editor.playback.seek({ time: nextTime }); }; return (
); }