import { memo, type ReactNode } from "react"; import type { TimelineElement } from "../store/playerStore"; import type { TimelineTheme } from "./timelineTheme"; import { getRenderedTimelineElement } from "./timelineTheme"; import { TimelineClip } from "./TimelineClip"; import { getTimelineEditCapabilities } from "./timelineEditing"; import { renderClipChildren } from "./timelineClipChildren"; import { getTimelineDragOverlayPosition } from "./timelineClipDragPreview"; import type { DraggedClipState } from "./timelineClipDragTypes"; import type { TrackVisualStyle } from "./timelineIcons"; import { isTimelineClipActive } from "./useTimelineActiveClips"; interface TimelineGestureOverlayProps { drag: DraggedClipState | null; scrollRef: React.RefObject; pixelsPerSecond: number; rowHeight: number; selectedElementId: string | null; currentTime: number; theme: TimelineTheme; getTrackStyle: (tag: string) => TrackVisualStyle; renderClipContent?: ( element: TimelineElement, style: { clip: string; label: string }, ) => ReactNode; renderClipOverlay?: (element: TimelineElement) => ReactNode; } /** Stable canvas child that owns the live drag actor independently of source rows. */ export const TimelineGestureOverlay = memo(function TimelineGestureOverlay({ drag, scrollRef, pixelsPerSecond, rowHeight, selectedElementId, currentTime, theme, getTrackStyle, renderClipContent, renderClipOverlay, }: TimelineGestureOverlayProps) { const element = drag?.started === true ? getRenderedTimelineElement({ element: drag.element, draggedElementId: drag.element.key ?? drag.element.id, previewStart: drag.previewStart, previewTrack: drag.previewTrack, }) : null; const position = drag ? getTimelineDragOverlayPosition(drag, scrollRef.current) : null; return (
{element && position && (
{}} onHoverEnd={() => {}} onResizeStart={() => {}} onClick={() => {}} onDoubleClick={() => {}} > {renderClipChildren( element, getTrackStyle(element.tag), renderClipContent, renderClipOverlay, )}
)}
); });