/** * Drag and Drop Provider for Timeline * * Wraps the timeline with DndContext and provides drag overlay */ import { DndContext, DragOverlay, MouseSensor, TouchSensor, useSensor, useSensors } from "@dnd-kit/core" import { createSnapModifier } from "@dnd-kit/modifiers" import React from "react" import { MediaFile } from "@/features/media/types/media" import { useDragDropTimeline } from "../hooks/use-drag-drop-timeline" interface DragDropProviderProps { children: React.ReactNode } /** * Drag overlay component showing the dragged video */ function DraggedVideoOverlay({ mediaFile }: { mediaFile: MediaFile }) { return (
Video
{mediaFile.name} {mediaFile.duration ? `${Math.round(mediaFile.duration)}s` : ""}
) } export function DragDropProvider({ children }: DragDropProviderProps) { const { dragState, handleDragStart, handleDragOver, handleDragEnd } = useDragDropTimeline() // Configure sensors for mouse and touch const mouseSensor = useSensor(MouseSensor, { activationConstraint: { distance: 10, // Require 10px movement to start drag }, }) const touchSensor = useSensor(TouchSensor, { activationConstraint: { delay: 250, // Require 250ms hold to start drag on touch tolerance: 5, }, }) const sensors = useSensors(mouseSensor, touchSensor) // Create snap modifier for grid snapping const snapToGridModifier = createSnapModifier(20) // Grid size in pixels return ( {children} {dragState.isDragging && dragState.draggedItem ? ( ) : null} ) }