import { useEffect, useState } from "react" import { cn } from "@/lib/utils" import { useEditModeContext } from "../../hooks/use-edit-mode" import { EDIT_MODES } from "../../types/edit-modes" interface SplitIndicatorProps { containerRef: React.RefObject timeScale: number scrollX: number onSplit: (time: number, trackId: string | null) => void disabled?: boolean } export function SplitIndicator({ containerRef, timeScale, scrollX, onSplit, disabled = false }: SplitIndicatorProps) { const { isEditMode } = useEditModeContext() const [mouseX, setMouseX] = useState(null) const [hoveredTrackId, setHoveredTrackId] = useState(null) const [isVisible, setIsVisible] = useState(false) const showIndicator = isEditMode(EDIT_MODES.SPLIT) && !disabled useEffect(() => { if (!showIndicator || !containerRef.current) { setIsVisible(false) return } const container = containerRef.current const handleMouseMove = (e: MouseEvent) => { const rect = container.getBoundingClientRect() const relativeX = e.clientX - rect.left setMouseX(relativeX) setIsVisible(true) // Find hovered track const trackElement = (e.target as HTMLElement).closest("[data-track-id]") if (trackElement) { setHoveredTrackId(trackElement.getAttribute("data-track-id")) } else { setHoveredTrackId(null) } } const handleMouseLeave = () => { setIsVisible(false) setHoveredTrackId(null) } const handleClick = (e: MouseEvent) => { if (!isVisible || mouseX === null) return const rect = container.getBoundingClientRect() const relativeX = e.clientX - rect.left const time = (relativeX + scrollX) / timeScale // Find clicked track const trackElement = (e.target as HTMLElement).closest("[data-track-id]") const trackId = trackElement?.getAttribute("data-track-id") || null onSplit(time, trackId) } container.addEventListener("mousemove", handleMouseMove) container.addEventListener("mouseleave", handleMouseLeave) container.addEventListener("click", handleClick) return () => { container.removeEventListener("mousemove", handleMouseMove) container.removeEventListener("mouseleave", handleMouseLeave) container.removeEventListener("click", handleClick) } }, [showIndicator, containerRef, timeScale, scrollX, onSplit, isVisible, mouseX]) if (!showIndicator || !isVisible || mouseX === null) return null return ( <> {/* Vertical split line */}
{/* Split cursor indicator */}
{/* Track highlight */} {hoveredTrackId && (
)}
{/* Time indicator */}
{formatTime((mouseX + scrollX) / timeScale)}
) } // Split icon component function SplitIcon({ className }: { className?: string }) { return ( ) } // Format time to display function formatTime(seconds: number): string { const minutes = Math.floor(seconds / 60) const secs = Math.floor(seconds % 60) const frames = Math.floor((seconds % 1) * 30) // Assuming 30fps return `${minutes.toString().padStart(2, "0")}:${secs .toString() .padStart(2, "0")}.${frames.toString().padStart(2, "0")}` } // Split preview component - shows where the split will occur interface SplitPreviewProps { clips: Array<{ id: string startTime: number duration: number trackId: string }> splitTime: number timeScale: number className?: string } export function SplitPreview({ clips, splitTime, timeScale, className }: SplitPreviewProps) { const affectedClips = clips.filter((clip) => splitTime > clip.startTime && splitTime < clip.startTime + clip.duration) if (affectedClips.length === 0) return null return (
{affectedClips.map((clip) => { const splitPoint = splitTime - clip.startTime const splitPosition = splitPoint * timeScale const clipLeft = clip.startTime * timeScale return (
{/* Split line within clip */}
{/* Split point indicator */}
) })}
) }