{"version":3,"file":"use-drag-drop-handlers.cjs","names":["useDragState"],"sources":["../../src/hooks/use-drag-drop-handlers.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport { useCallback, useEffectEvent, useState } from 'react';\nimport { DragContextValue } from '../components/DragContext/DragContext';\nimport { DateTimeStringValue, ScheduleEventData, ScheduleMode } from '../types';\nimport { useDragState } from './use-drag-state';\n\nexport interface UseDragDropHandlersOptions<T = any> {\n  /** Whether drag and drop is enabled */\n  enabled: boolean;\n\n  /** Schedule interaction mode */\n  mode: ScheduleMode;\n\n  /** Called when event is dropped at new location */\n  onEventDrop?: (data: {\n    eventId: string | number;\n    newStart: DateTimeStringValue;\n    newEnd: DateTimeStringValue;\n    event: ScheduleEventData;\n  }) => void;\n\n  /** Function to determine if event can be dragged */\n  canDragEvent?: (event: ScheduleEventData) => boolean;\n\n  /** Called when any event drag starts */\n  onEventDragStart?: (event: ScheduleEventData) => void;\n\n  /** Called when any event drag ends */\n  onEventDragEnd?: () => void;\n\n  /**\n   * Function to calculate drop target dates from drop location.\n   * Receives the target location and the dragged event.\n   */\n  calculateDropTarget: (target: T, draggedEvent: ScheduleEventData) => { start: Date; end: Date };\n\n  /** Called when an external item is dropped onto the schedule */\n  onExternalDrop?: (e: React.DragEvent, target: T) => void;\n}\n\nexport interface DragDropHandlers<T = any> {\n  /** Context value for DragContext.Provider */\n  dragContextValue: DragContextValue;\n\n  /** Current drop target */\n  dropTarget: T | null;\n\n  /** Handle drag start event */\n  handleDragStart: (event: ScheduleEventData) => void;\n\n  /** Handle drag end event */\n  handleDragEnd: () => void;\n\n  /** Handle drag over event */\n  handleDragOver: (e: React.DragEvent, target: T) => void;\n\n  /** Handle drag leave event */\n  handleDragLeave: () => void;\n\n  /** Handle drop event */\n  handleDrop: (e: React.DragEvent, target: T) => void;\n\n  /** Check if event is draggable */\n  isDraggableEvent: (event: ScheduleEventData) => boolean;\n\n  /** Check if target is the current drop target */\n  isDropTarget: (target: T) => boolean;\n}\n\n/**\n * Hook that provides unified drag-drop handlers for Schedule views.\n * Handles drag state management and event drops across Day, Week, and Month views.\n *\n * @template T - Type of the drop target (e.g., slot index, day string, etc.)\n */\nexport function useDragDropHandlers<T = any>(\n  options: UseDragDropHandlersOptions<T>\n): DragDropHandlers<T> {\n  const {\n    enabled,\n    mode,\n    onEventDrop,\n    canDragEvent,\n    onEventDragStart,\n    onEventDragEnd,\n    calculateDropTarget,\n    onExternalDrop,\n  } = options;\n\n  const stableOnEventDrop = useEffectEvent(onEventDrop || (() => {}));\n  const stableOnEventDragStart = useEffectEvent(onEventDragStart || (() => {}));\n  const stableOnEventDragEnd = useEffectEvent(onEventDragEnd || (() => {}));\n  const stableOnExternalDrop = useEffectEvent(onExternalDrop || (() => {}));\n\n  const dragState = useDragState();\n  const [dropTarget, setDropTarget] = useState<T | null>(null);\n\n  const handleDragEnd = useCallback(() => {\n    dragState.endDrag();\n    setDropTarget(null);\n    stableOnEventDragEnd();\n  }, [dragState]);\n\n  const handleDragStart = useCallback(\n    (event: ScheduleEventData) => {\n      if (!enabled || mode === 'static') {\n        return;\n      }\n      dragState.startDrag(event);\n      stableOnEventDragStart(event);\n    },\n    [enabled, mode, dragState]\n  );\n\n  const handleDragOver = useCallback(\n    (event: React.DragEvent, target: T) => {\n      if (mode === 'static') {\n        return;\n      }\n\n      let isInternalDrag = dragState.state.isDragging;\n\n      if (isInternalDrag && !event.dataTransfer.types.includes('application/json')) {\n        handleDragEnd();\n        isInternalDrag = false;\n      }\n\n      if (isInternalDrag && !enabled) {\n        return;\n      }\n\n      if (!isInternalDrag && !onExternalDrop) {\n        return;\n      }\n\n      event.preventDefault();\n      event.dataTransfer.dropEffect = isInternalDrag ? 'move' : 'copy';\n      setDropTarget(target);\n    },\n    [enabled, mode, dragState.state.isDragging, onExternalDrop, handleDragEnd]\n  );\n\n  const handleDragLeave = useCallback(() => {\n    setDropTarget(null);\n  }, []);\n\n  const handleDrop = useCallback(\n    (event: React.DragEvent, target: T) => {\n      event.preventDefault();\n\n      const isInternalDrag =\n        dragState.state.isDragging && event.dataTransfer.types.includes('application/json');\n\n      if (isInternalDrag && enabled && dragState.state.draggedEvent && onEventDrop) {\n        const { start, end } = calculateDropTarget(target, dragState.state.draggedEvent);\n        stableOnEventDrop({\n          eventId: dragState.state.draggedEventId!,\n          newStart: dayjs(start).format('YYYY-MM-DD HH:mm:ss'),\n          newEnd: dayjs(end).format('YYYY-MM-DD HH:mm:ss'),\n          event: dragState.state.draggedEvent,\n        });\n        handleDragEnd();\n        return;\n      }\n\n      if (!isInternalDrag && onExternalDrop) {\n        if (dragState.state.isDragging) {\n          handleDragEnd();\n        }\n        stableOnExternalDrop(event, target);\n        setDropTarget(null);\n        return;\n      }\n\n      setDropTarget(null);\n    },\n    [\n      enabled,\n      dragState.state,\n      onEventDrop,\n      onExternalDrop,\n      calculateDropTarget,\n      handleDragEnd,\n      stableOnEventDrop,\n      stableOnExternalDrop,\n    ]\n  );\n\n  const isDraggableEvent = useCallback(\n    (event: ScheduleEventData) => {\n      return (\n        enabled &&\n        mode !== 'static' &&\n        event.display !== 'background' &&\n        (canDragEvent ? canDragEvent(event) : true)\n      );\n    },\n    [enabled, mode, canDragEvent]\n  );\n\n  const isDropTarget = useCallback(\n    (target: T) => {\n      // Handle complex target comparison (for WeekView with day + slotIndex)\n      if (dropTarget && typeof dropTarget === 'object' && typeof target === 'object') {\n        return JSON.stringify(dropTarget) === JSON.stringify(target);\n      }\n      return dropTarget === target;\n    },\n    [dropTarget]\n  );\n\n  const dragContextValue: DragContextValue = {\n    isDragging: dragState.state.isDragging,\n    draggedEventId: dragState.state.draggedEventId,\n    draggedEvent: dragState.state.draggedEvent,\n    dropTarget: dragState.state.dropTarget,\n    onDragStart: handleDragStart,\n    onDragEnd: handleDragEnd,\n    setDropTarget: dragState.setDropTarget,\n  };\n\n  return {\n    dragContextValue,\n    dropTarget,\n    handleDragStart,\n    handleDragEnd,\n    handleDragOver,\n    handleDragLeave,\n    handleDrop,\n    isDraggableEvent,\n    isDropTarget,\n  };\n}\n"],"mappings":";;;;;;;;;;;;;AA2EA,SAAgB,oBACd,SACqB;CACrB,MAAM,EACJ,SACA,MACA,aACA,cACA,kBACA,gBACA,qBACA,mBACE;CAEJ,MAAM,qBAAA,GAAA,MAAA,eAAA,CAAmC,sBAAsB,CAAC,EAAE;CAClE,MAAM,0BAAA,GAAA,MAAA,eAAA,CAAwC,2BAA2B,CAAC,EAAE;CAC5E,MAAM,wBAAA,GAAA,MAAA,eAAA,CAAsC,yBAAyB,CAAC,EAAE;CACxE,MAAM,wBAAA,GAAA,MAAA,eAAA,CAAsC,yBAAyB,CAAC,EAAE;CAExE,MAAM,YAAYA,uBAAAA,aAAa;CAC/B,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,SAAA,CAAoC,IAAI;CAE3D,MAAM,iBAAA,GAAA,MAAA,YAAA,OAAkC;EACtC,UAAU,QAAQ;EAClB,cAAc,IAAI;EAClB,qBAAqB;CACvB,GAAG,CAAC,SAAS,CAAC;CAEd,MAAM,mBAAA,GAAA,MAAA,YAAA,EACH,UAA6B;EAC5B,IAAI,CAAC,WAAW,SAAS,UACvB;EAEF,UAAU,UAAU,KAAK;EACzB,uBAAuB,KAAK;CAC9B,GACA;EAAC;EAAS;EAAM;CAAS,CAC3B;CAEA,MAAM,kBAAA,GAAA,MAAA,YAAA,EACH,OAAwB,WAAc;EACrC,IAAI,SAAS,UACX;EAGF,IAAI,iBAAiB,UAAU,MAAM;EAErC,IAAI,kBAAkB,CAAC,MAAM,aAAa,MAAM,SAAS,kBAAkB,GAAG;GAC5E,cAAc;GACd,iBAAiB;EACnB;EAEA,IAAI,kBAAkB,CAAC,SACrB;EAGF,IAAI,CAAC,kBAAkB,CAAC,gBACtB;EAGF,MAAM,eAAe;EACrB,MAAM,aAAa,aAAa,iBAAiB,SAAS;EAC1D,cAAc,MAAM;CACtB,GACA;EAAC;EAAS;EAAM,UAAU,MAAM;EAAY;EAAgB;CAAa,CAC3E;CAEA,MAAM,mBAAA,GAAA,MAAA,YAAA,OAAoC;EACxC,cAAc,IAAI;CACpB,GAAG,CAAC,CAAC;CAEL,MAAM,cAAA,GAAA,MAAA,YAAA,EACH,OAAwB,WAAc;EACrC,MAAM,eAAe;EAErB,MAAM,iBACJ,UAAU,MAAM,cAAc,MAAM,aAAa,MAAM,SAAS,kBAAkB;EAEpF,IAAI,kBAAkB,WAAW,UAAU,MAAM,gBAAgB,aAAa;GAC5E,MAAM,EAAE,OAAO,QAAQ,oBAAoB,QAAQ,UAAU,MAAM,YAAY;GAC/E,kBAAkB;IAChB,SAAS,UAAU,MAAM;IACzB,WAAA,GAAA,MAAA,QAAA,CAAgB,KAAK,CAAC,CAAC,OAAO,qBAAqB;IACnD,SAAA,GAAA,MAAA,QAAA,CAAc,GAAG,CAAC,CAAC,OAAO,qBAAqB;IAC/C,OAAO,UAAU,MAAM;GACzB,CAAC;GACD,cAAc;GACd;EACF;EAEA,IAAI,CAAC,kBAAkB,gBAAgB;GACrC,IAAI,UAAU,MAAM,YAClB,cAAc;GAEhB,qBAAqB,OAAO,MAAM;GAClC,cAAc,IAAI;GAClB;EACF;EAEA,cAAc,IAAI;CACpB,GACA;EACE;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,oBAAA,GAAA,MAAA,YAAA,EACH,UAA6B;EAC5B,OACE,WACA,SAAS,YACT,MAAM,YAAY,iBACjB,eAAe,aAAa,KAAK,IAAI;CAE1C,GACA;EAAC;EAAS;EAAM;CAAY,CAC9B;CAEA,MAAM,gBAAA,GAAA,MAAA,YAAA,EACH,WAAc;EAEb,IAAI,cAAc,OAAO,eAAe,YAAY,OAAO,WAAW,UACpE,OAAO,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,MAAM;EAE7D,OAAO,eAAe;CACxB,GACA,CAAC,UAAU,CACb;CAYA,OAAO;EACL,kBAAA;GAVA,YAAY,UAAU,MAAM;GAC5B,gBAAgB,UAAU,MAAM;GAChC,cAAc,UAAU,MAAM;GAC9B,YAAY,UAAU,MAAM;GAC5B,aAAa;GACb,WAAW;GACX,eAAe,UAAU;EAIV;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}