"use client"; import { useRef } from "react"; import { TimelineTrack } from "@/types/timeline"; import { TIMELINE_CONSTANTS } 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; trackLabelsRef?: React.RefObject; timelineRef: React.RefObject; playheadRef?: React.RefObject; isSnappingToPlayhead?: boolean; } export function TimelinePlayhead({ currentTime, duration, zoomLevel, tracks, seek, rulerRef, rulerScrollRef, trackLabelsRef, timelineRef, playheadRef: externalPlayheadRef, isSnappingToPlayhead = false, }: TimelinePlayheadProps) { const internalPlayheadRef = useRef(null); const playheadRef = externalPlayheadRef || internalPlayheadRef; const { playheadPosition, handleRulerMouseDown } = useTimelinePlayhead({ currentTime, duration, zoomLevel, seek, rulerRef, rulerScrollRef, }); // 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 0 if no tracks or no ref const trackLabelsWidth = tracks.length > 0 && trackLabelsRef?.current ? trackLabelsRef.current.offsetWidth : 0; const leftPosition = trackLabelsWidth + playheadPosition * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel; return (
{/* The playhead line spanning full height */}
{/* Playhead dot indicator at the top (in ruler area) */}
); } // Also export a hook for getting ruler handlers export function useTimelinePlayheadRuler({ currentTime, duration, zoomLevel, seek, rulerRef, rulerScrollRef, }: Omit< TimelinePlayheadProps, | "tracks" | "trackLabelsRef" | "timelineRef" | "tracksScrollRef" | "playheadRef" >) { const { handleRulerMouseDown } = useTimelinePlayhead({ currentTime, duration, zoomLevel, seek, rulerRef, rulerScrollRef, }); return { handleRulerMouseDown }; } export { TimelinePlayhead as default };