type ProjectDragStateLike = { isDragging: boolean; projectId: string | null; projectName: string | null; allocationId: string | null; originalStartDate: Date | null; originalEndDate: Date | null; currentStartDate: Date | null; currentEndDate: Date | null; startMouseX: number; pointerDeltaX: number; originalLeft: number; blockWidth: number; daysDelta: number; }; type CreateProjectDragStateInput = { projectId: string; projectName: string; allocationId?: string | null; startDate: Date; endDate: Date; startMouseX: number; originalLeft?: number; blockWidth?: number; }; export function createProjectDragState( input: CreateProjectDragStateInput, ): TState { return { isDragging: true, projectId: input.projectId, projectName: input.projectName, allocationId: input.allocationId ?? null, originalStartDate: input.startDate, originalEndDate: input.endDate, currentStartDate: input.startDate, currentEndDate: input.endDate, startMouseX: input.startMouseX, pointerDeltaX: 0, originalLeft: input.originalLeft ?? 0, blockWidth: input.blockWidth ?? 0, daysDelta: 0, } as TState; } export function buildProjectShiftMutationInput( drag: Pick, ): { projectId: string; newStartDate: Date; newEndDate: Date } | null { if (drag.daysDelta === 0 || !drag.projectId || !drag.currentStartDate || !drag.currentEndDate) { return null; } return { projectId: drag.projectId, newStartDate: drag.currentStartDate, newEndDate: drag.currentEndDate, }; }