"use client"; import { useRef } from "react"; import { TimelineTrack } from "@/types/timeline"; import { TIMELINE_CONSTANTS, getTotalTracksHeight, } from "@/constants/timeline-constants"; import { useTimelinePlayhead } from "@/hooks/use-timeline-playhead"; interface TimelinePlayheadProps { currentTime: number; duration: number; zoomLevel: number; tracks: TimelineTrack[]; seek: (time: number) => void; rulerRef: React.RefObject; rulerScrollRef: React.RefObject; tracksScrollRef: React.RefObject; trackLabelsRef?: React.RefObject; timelineRef: React.RefObject; playheadRef?: React.RefObject; isSnappingToPlayhead?: boolean; } export function TimelinePlayhead({ currentTime, duration, zoomLevel, tracks, seek, rulerRef, rulerScrollRef, tracksScrollRef, trackLabelsRef, timelineRef, playheadRef: externalPlayheadRef, isSnappingToPlayhead = false, }: TimelinePlayheadProps) { const internalPlayheadRef = useRef(null); const playheadRef = externalPlayheadRef || internalPlayheadRef; const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ currentTime, duration, zoomLevel, seek, rulerRef, rulerScrollRef, tracksScrollRef, playheadRef, }); // Use timeline container height minus a few pixels for breathing room const timelineContainerHeight = timelineRef.current?.offsetHeight || 400; const totalHeight = timelineContainerHeight - 8; // 8px padding from edges // Get dynamic track labels width, fallback to 192px (ml-48) if no tracks or no ref const trackLabelsWidth = 192; // Fixed width from grid layout const leftPosition = playheadPosition * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel; return ( <> {/* Playhead line container */}
{/* The playhead line spanning full height */}
{/* Playhead dot indicator - separate container with highest z-index */}
); } // Also export a hook for getting ruler handlers export function useTimelinePlayheadRuler({ currentTime, duration, zoomLevel, seek, rulerRef, rulerScrollRef, tracksScrollRef, playheadRef, }: Omit) { const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({ currentTime, duration, zoomLevel, seek, rulerRef, rulerScrollRef, tracksScrollRef, playheadRef, }); return { handleRulerMouseDown, isDraggingRuler }; }