import { MILLISECONDS_PER_DAY } from "@capakraken/shared"; import type { useTimelineDrag } from "~/hooks/useTimelineDrag.js"; import { formatDateShort } from "~/lib/format.js"; import { ShiftPreviewTooltip } from "./ShiftPreviewTooltip.js"; interface TimelineDragOverlaysProps { dragState: ReturnType["dragState"]; allocDragState: ReturnType["allocDragState"]; rangeState: ReturnType["rangeState"]; multiSelectState: ReturnType["multiSelectState"]; shiftPreview: ReturnType["shiftPreview"]; isPreviewLoading: boolean; isApplying: boolean; isAllocSaving: boolean; mousePosRef: React.RefObject<{ x: number; y: number }>; dragTooltipRef: React.RefObject; allocTooltipRef: React.RefObject; rangeHintRef: React.RefObject; multiDragTooltipRef: React.RefObject; today: Date; } export function TimelineDragOverlays({ dragState, allocDragState, rangeState, multiSelectState, shiftPreview, isPreviewLoading, isApplying, isAllocSaving, mousePosRef, dragTooltipRef, allocTooltipRef, rangeHintRef, multiDragTooltipRef, today, }: TimelineDragOverlaysProps) { return ( <> {/* Multi-select rectangle overlay */} {multiSelectState.isSelecting && (
)} {/* Saving indicators */} {(isApplying || isAllocSaving) && (
{isApplying ? "Applying shift…" : "Saving…"}
)} {/* Drag preview tooltip */} {dragState.isDragging && dragState.daysDelta !== 0 && (
)} {/* Alloc drag tooltip */} {allocDragState.isActive && allocDragState.daysDelta !== 0 && allocDragState.currentStartDate && allocDragState.currentEndDate && (
{allocDragState.projectName}
{formatDateShort(allocDragState.currentStartDate)} {" – "} {formatDateShort(allocDragState.currentEndDate)}
)} {/* Range-select hint */} {rangeState.isSelecting && rangeState.startDate && rangeState.currentDate && (
{(() => { const end = rangeState.currentDate; const [s, e] = rangeState.startDate <= end ? [rangeState.startDate, end] : [end, rangeState.startDate]; const days = Math.round((e.getTime() - s.getTime()) / MILLISECONDS_PER_DAY) + 1; return `${days} day${days !== 1 ? "s" : ""}`; })()}
)} {/* Multi-drag tooltip */} {multiSelectState.isMultiDragging && multiSelectState.multiDragDaysDelta !== 0 && (
{multiSelectState.multiDragMode === "resize-start" ? "Start " : multiSelectState.multiDragMode === "resize-end" ? "End " : ""} {multiSelectState.multiDragDaysDelta > 0 ? "+" : ""} {multiSelectState.multiDragDaysDelta}d ({multiSelectState.selectedAllocationIds.length}{" "} allocations)
)} ); }