import { PointerEvent as ReactPointerEvent } from 'react'; import { CalendarChangeResult, CalendarEvent, CalendarEventChange, CalendarRangeSelection, CalendarSnapMinutes, ResolvedCalendarEvent } from './types'; export type CalendarDragKind = "move" | "resize" | "select"; /** Punto del calendario bajo el cursor, ya traducido por la vista. */ export interface CalendarPointerTarget { readonly day: Date; /** * Minutos desde la medianoche, o `null` si la superficie no tiene horario * (celda de mes, fila de "todo el día"). */ readonly minutes: number | null; } /** Traduce coordenadas de pantalla a un punto del calendario. La provee la vista. */ export type CalendarTargetResolver = (clientX: number, clientY: number) => CalendarPointerTarget | null; /** Posición propuesta mientras se arrastra, para dibujar el fantasma. */ export interface CalendarDragPreview { readonly kind: CalendarDragKind; readonly eventId: string | number | null; readonly start: Date; readonly end: Date; readonly allDay: boolean; } export interface StartDragOptions { readonly kind: CalendarDragKind; readonly pointerEvent: ReactPointerEvent; readonly resolve: CalendarTargetResolver; /** Evento arrastrado. Requerido para `move` y `resize`. */ readonly resolved?: ResolvedCalendarEvent; /** Punto donde arrancó el arrastre. Requerido para `select`. */ readonly origin?: CalendarPointerTarget; /** Contenedor scrolleable, para el autoscroll al llegar a los bordes. */ readonly scrollContainer?: HTMLElement | null; } export interface UseCalendarDragOptions { readonly events: readonly CalendarEvent[]; readonly editable: boolean; readonly selectable: boolean; readonly snapMinutes: CalendarSnapMinutes; readonly onEventDrop?: (change: CalendarEventChange) => CalendarChangeResult; readonly onEventResize?: (change: CalendarEventChange) => CalendarChangeResult; readonly onRangeSelect?: (selection: CalendarRangeSelection) => void; } export interface CalendarDragApi { /** Posición propuesta en curso, o null si no se está arrastrando. */ readonly preview: CalendarDragPreview | null; /** Id del evento que se está arrastrando o redimensionando. */ readonly draggingId: string | number | null; /** Aplica los movimientos aceptados sobre los eventos ya resueltos. */ readonly applyOverrides: (resolved: readonly ResolvedCalendarEvent[]) => ResolvedCalendarEvent[]; readonly startDrag: (options: StartDragOptions) => void; readonly isDragging: boolean; } /** * Sesión de arrastre del calendario: mover, redimensionar y seleccionar rangos. * * El movimiento se aplica de forma **optimista** —el evento se mueve en pantalla * apenas soltás— y se revierte solo si el callback devuelve `false` o rechaza. * El override se descarta cuando los `events` que llegan por props ya reflejan * la nueva posición, así el prop vuelve a ser la única fuente de verdad. */ export declare function useCalendarDrag({ events, editable, selectable, snapMinutes, onEventDrop, onEventResize, onRangeSelect, }: UseCalendarDragOptions): CalendarDragApi;