/**
* 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}
)
}