UNPKG

smart-dropzone-react

Version:

🚀 A production-ready React dropzone component with smart defaults, drag & drop reordering, chunked uploads, resume functionality, and comprehensive provider support (Cloudinary, AWS S3, Supabase)

1 lines • 27.8 kB
{"version":3,"sources":["../src/core/drag-reorder.ts"],"names":["DragReorderManager","options","__publicField","TIMING","LAYOUT","container","validation","InputValidator","UploadError","id","element","e","event","rect","newTargetIndex","_event","targetIndex","clientX","clientY","containerRect","relativeX","relativeY","snappedX","snappedY","x","y","closestIndex","closestDistance","centerX","centerY","distance","targetElement","fromIndex","toIndex","newOrder","movedItem","preview","DIMENSIONS","updatePreview","file","index","files","items"],"mappings":"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","file":"chunk-PSKKURAZ.cjs","sourcesContent":["import { UploadFile } from \"../types\";\r\nimport { TIMING, LAYOUT, DIMENSIONS } from \"./config\";\r\nimport { InputValidator } from \"./validation\";\r\nimport { UploadError } from \"./error-handler\";\r\n\r\nexport interface DragReorderOptions {\r\n enableReordering?: boolean;\r\n animationDuration?: number;\r\n dragThreshold?: number;\r\n snapToGrid?: boolean;\r\n gridSize?: number;\r\n constrainToContainer?: boolean;\r\n}\r\n\r\nexport interface DragState {\r\n isDragging: boolean;\r\n draggedItem: UploadFile | null;\r\n draggedIndex: number;\r\n targetIndex: number;\r\n startPosition: { x: number; y: number };\r\n currentPosition: { x: number; y: number };\r\n offset: { x: number; y: number };\r\n}\r\n\r\nexport interface ReorderResult {\r\n success: boolean;\r\n newOrder: UploadFile[];\r\n movedItem: UploadFile | null;\r\n fromIndex: number;\r\n toIndex: number;\r\n}\r\n\r\nexport class DragReorderManager {\r\n private options: Required<DragReorderOptions>;\r\n private dragState: DragState;\r\n private containerRef: HTMLElement | null = null;\r\n private itemRefs: Map<string, HTMLElement> = new Map();\r\n private animationFrame: number | null = null;\r\n private isEnabled: boolean = true;\r\n private files: UploadFile[] = []; // For testing purposes\r\n\r\n constructor(options: DragReorderOptions = {}) {\r\n this.options = {\r\n enableReordering: true,\r\n animationDuration: TIMING.ANIMATION_DURATION,\r\n dragThreshold: LAYOUT.DRAG_THRESHOLD,\r\n snapToGrid: false,\r\n gridSize: LAYOUT.GRID_SIZE,\r\n constrainToContainer: true,\r\n ...options,\r\n };\r\n\r\n this.dragState = {\r\n isDragging: false,\r\n draggedItem: null,\r\n draggedIndex: -1,\r\n targetIndex: -1,\r\n startPosition: { x: 0, y: 0 },\r\n currentPosition: { x: 0, y: 0 },\r\n offset: { x: 0, y: 0 },\r\n };\r\n }\r\n\r\n enable(): void {\r\n this.isEnabled = true;\r\n }\r\n\r\n disable(): void {\r\n this.isEnabled = false;\r\n this.stopDrag();\r\n }\r\n\r\n setContainer(container: HTMLElement): void {\r\n const validation = InputValidator.validateElement(container);\r\n if (!validation.isValid) {\r\n throw UploadError.validationError(\r\n `Invalid container element: ${validation.errors.join(\", \")}`\r\n );\r\n }\r\n\r\n this.containerRef = container;\r\n this.setupContainerListeners();\r\n }\r\n\r\n registerItem(id: string, element: HTMLElement): void {\r\n if (!id || typeof id !== \"string\") {\r\n throw UploadError.validationError(\"Item ID must be a non-empty string\");\r\n }\r\n\r\n const validation = InputValidator.validateElement(element);\r\n if (!validation.isValid) {\r\n throw UploadError.validationError(\r\n `Invalid element for item ${id}: ${validation.errors.join(\", \")}`\r\n );\r\n }\r\n\r\n this.itemRefs.set(id, element);\r\n this.setupItemListeners(id, element);\r\n }\r\n\r\n unregisterItem(id: string): void {\r\n this.itemRefs.delete(id);\r\n }\r\n\r\n private setupContainerListeners(): void {\r\n if (!this.containerRef) return;\r\n\r\n this.containerRef.addEventListener(\r\n \"dragover\",\r\n this.handleDragOver.bind(this)\r\n );\r\n this.containerRef.addEventListener(\"drop\", this.handleDrop.bind(this));\r\n this.containerRef.addEventListener(\r\n \"dragleave\",\r\n this.handleDragLeave.bind(this)\r\n );\r\n }\r\n\r\n private setupItemListeners(id: string, element: HTMLElement): void {\r\n element.setAttribute(\"draggable\", \"true\");\r\n element.addEventListener(\"dragstart\", (e) => this.handleDragStart(e, id));\r\n element.addEventListener(\"dragend\", this.handleDragEnd.bind(this));\r\n element.addEventListener(\"dragenter\", (e) => this.handleDragEnter(e, id));\r\n element.addEventListener(\"dragover\", this.handleDragOver.bind(this));\r\n }\r\n\r\n private handleDragStart(event: DragEvent, id: string): void {\r\n if (!this.isEnabled || !this.options.enableReordering) return;\r\n\r\n const element = event.currentTarget as HTMLElement;\r\n const rect = element.getBoundingClientRect();\r\n\r\n this.dragState = {\r\n isDragging: true,\r\n draggedItem: this.findFileById(id),\r\n draggedIndex: this.findFileIndex(id),\r\n targetIndex: -1,\r\n startPosition: { x: event.clientX, y: event.clientY },\r\n currentPosition: { x: event.clientX, y: event.clientY },\r\n offset: {\r\n x: event.clientX - rect.left,\r\n y: event.clientY - rect.top,\r\n },\r\n };\r\n\r\n if (this.dragState.draggedItem) {\r\n event.dataTransfer?.setData(\"text/plain\", id);\r\n event.dataTransfer!.effectAllowed = \"move\";\r\n\r\n // Add visual feedback\r\n element.style.opacity = \"0.5\";\r\n element.style.transform = \"rotate(5deg) scale(1.05)\";\r\n element.style.transition = `all ${this.options.animationDuration}ms ease`;\r\n\r\n // Create drag preview\r\n this.createDragPreview(element);\r\n }\r\n }\r\n\r\n private handleDragOver(event: DragEvent): void {\r\n if (!this.isEnabled || !this.dragState.isDragging) return;\r\n\r\n event.preventDefault();\r\n event.dataTransfer!.dropEffect = \"move\";\r\n\r\n this.dragState.currentPosition = { x: event.clientX, y: event.clientY };\r\n\r\n // Update target index based on current position\r\n const newTargetIndex = this.calculateTargetIndex(\r\n event.clientX,\r\n event.clientY\r\n );\r\n\r\n if (\r\n newTargetIndex !== this.dragState.targetIndex &&\r\n newTargetIndex !== this.dragState.draggedIndex\r\n ) {\r\n this.dragState.targetIndex = newTargetIndex;\r\n this.updateVisualFeedback();\r\n }\r\n }\r\n\r\n private handleDragEnter(_event: DragEvent, id: string): void {\r\n if (!this.isEnabled || !this.dragState.isDragging) return;\r\n\r\n const targetIndex = this.findFileIndex(id);\r\n if (targetIndex !== -1 && targetIndex !== this.dragState.draggedIndex) {\r\n this.dragState.targetIndex = targetIndex;\r\n this.updateVisualFeedback();\r\n }\r\n }\r\n\r\n private handleDragLeave(event: DragEvent): void {\r\n if (!this.isEnabled || !this.dragState.isDragging) return;\r\n\r\n // Only handle if leaving the container entirely\r\n const rect = this.containerRef!.getBoundingClientRect();\r\n const { clientX, clientY } = event;\r\n\r\n if (\r\n clientX < rect.left ||\r\n clientX > rect.right ||\r\n clientY < rect.top ||\r\n clientY > rect.bottom\r\n ) {\r\n this.dragState.targetIndex = -1;\r\n this.updateVisualFeedback();\r\n }\r\n }\r\n\r\n private handleDrop(event: DragEvent): void {\r\n if (!this.isEnabled || !this.dragState.isDragging) return;\r\n\r\n event.preventDefault();\r\n\r\n const targetIndex = this.calculateTargetIndex(event.clientX, event.clientY);\r\n\r\n if (targetIndex !== -1 && targetIndex !== this.dragState.draggedIndex) {\r\n this.completeReorder(this.dragState.draggedIndex, targetIndex);\r\n }\r\n\r\n this.stopDrag();\r\n }\r\n\r\n private handleDragEnd(_event: DragEvent): void {\r\n this.stopDrag();\r\n }\r\n\r\n private calculateTargetIndex(clientX: number, clientY: number): number {\r\n if (!this.containerRef) return -1;\r\n\r\n const containerRect = this.containerRef.getBoundingClientRect();\r\n const relativeX = clientX - containerRect.left;\r\n const relativeY = clientY - containerRect.top;\r\n\r\n // Apply grid snapping if enabled\r\n if (this.options.snapToGrid) {\r\n const snappedX =\r\n Math.round(relativeX / this.options.gridSize) * this.options.gridSize;\r\n const snappedY =\r\n Math.round(relativeY / this.options.gridSize) * this.options.gridSize;\r\n return this.findClosestItemIndex(snappedX, snappedY);\r\n }\r\n\r\n return this.findClosestItemIndex(relativeX, relativeY);\r\n }\r\n\r\n private findClosestItemIndex(x: number, y: number): number {\r\n let closestIndex = -1;\r\n let closestDistance = Infinity;\r\n\r\n this.itemRefs.forEach((element, id) => {\r\n const rect = element.getBoundingClientRect();\r\n const containerRect = this.containerRef!.getBoundingClientRect();\r\n\r\n const centerX = rect.left + rect.width / 2 - containerRect.left;\r\n const centerY = rect.top + rect.height / 2 - containerRect.top;\r\n\r\n const distance = Math.sqrt((x - centerX) ** 2 + (y - centerY) ** 2);\r\n\r\n if (distance < closestDistance) {\r\n closestDistance = distance;\r\n closestIndex = this.findFileIndex(id);\r\n }\r\n });\r\n\r\n return closestIndex;\r\n }\r\n\r\n private updateVisualFeedback(): void {\r\n if (!this.containerRef) return;\r\n\r\n // Remove previous feedback\r\n this.itemRefs.forEach((element) => {\r\n element.style.transform = \"\";\r\n element.style.border = \"\";\r\n element.style.backgroundColor = \"\";\r\n });\r\n\r\n // Add new feedback\r\n if (this.dragState.targetIndex !== -1) {\r\n const targetElement = this.findElementByIndex(this.dragState.targetIndex);\r\n if (targetElement) {\r\n targetElement.style.border = \"2px dashed #3b82f6\";\r\n targetElement.style.backgroundColor = \"rgba(59, 130, 246, 0.1)\";\r\n targetElement.style.transition = `all ${this.options.animationDuration}ms ease`;\r\n }\r\n }\r\n }\r\n\r\n private completeReorder(fromIndex: number, toIndex: number): ReorderResult {\r\n // Perform the actual reordering on internal files array\r\n if (\r\n fromIndex === toIndex ||\r\n fromIndex < 0 ||\r\n toIndex < 0 ||\r\n fromIndex >= this.files.length ||\r\n toIndex >= this.files.length\r\n ) {\r\n return {\r\n success: false,\r\n newOrder: [...this.files],\r\n movedItem: this.dragState.draggedItem,\r\n fromIndex,\r\n toIndex,\r\n };\r\n }\r\n\r\n const newOrder = [...this.files];\r\n const [movedItem] = newOrder.splice(fromIndex, 1);\r\n newOrder.splice(toIndex, 0, movedItem);\r\n\r\n // Update internal files array with new order\r\n this.files = newOrder;\r\n\r\n // Emit reorder event for parent components to listen to\r\n this.emitReorderEvent(fromIndex, toIndex, newOrder, movedItem);\r\n\r\n return {\r\n success: true,\r\n newOrder,\r\n movedItem,\r\n fromIndex,\r\n toIndex,\r\n };\r\n }\r\n\r\n private stopDrag(): void {\r\n if (this.dragState.isDragging) {\r\n // Reset visual feedback\r\n this.itemRefs.forEach((element) => {\r\n element.style.opacity = \"\";\r\n element.style.transform = \"\";\r\n element.style.border = \"\";\r\n element.style.backgroundColor = \"\";\r\n element.style.transition = \"\";\r\n });\r\n\r\n // Remove drag preview\r\n this.removeDragPreview();\r\n\r\n // Reset drag state\r\n this.dragState = {\r\n isDragging: false,\r\n draggedItem: null,\r\n draggedIndex: -1,\r\n targetIndex: -1,\r\n startPosition: { x: 0, y: 0 },\r\n currentPosition: { x: 0, y: 0 },\r\n offset: { x: 0, y: 0 },\r\n };\r\n }\r\n }\r\n\r\n private createDragPreview(element: HTMLElement): void {\r\n const preview = element.cloneNode(true) as HTMLElement;\r\n preview.setAttribute(\"data-drag-preview\", \"true\");\r\n preview.style.position = \"fixed\";\r\n preview.style.top = \"0\";\r\n preview.style.left = \"0\";\r\n preview.style.pointerEvents = \"none\";\r\n preview.style.zIndex = DIMENSIONS.DRAG_PREVIEW_Z_INDEX.toString();\r\n preview.style.opacity = DIMENSIONS.PREVIEW_OPACITY.toString();\r\n preview.style.transform = \"rotate(5deg) scale(1.05)\";\r\n\r\n document.body.appendChild(preview);\r\n\r\n // Update preview position on mousemove\r\n const updatePreview = (e: MouseEvent) => {\r\n if (this.dragState.isDragging) {\r\n preview.style.left = `${e.clientX - this.dragState.offset.x}px`;\r\n preview.style.top = `${e.clientY - this.dragState.offset.y}px`;\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousemove\", updatePreview);\r\n\r\n // Store reference for cleanup\r\n (preview as any)._updateHandler = updatePreview;\r\n }\r\n\r\n private removeDragPreview(): void {\r\n const previews = document.querySelectorAll(\"[data-drag-preview]\");\r\n previews.forEach((preview) => {\r\n const element = preview as HTMLElement;\r\n if ((element as any)._updateHandler) {\r\n document.removeEventListener(\r\n \"mousemove\",\r\n (element as any)._updateHandler\r\n );\r\n }\r\n element.remove();\r\n });\r\n }\r\n\r\n private findFileById(id: string): UploadFile | null {\r\n return this.files.find((file) => file.id === id) || null;\r\n }\r\n\r\n private findFileIndex(id: string): number {\r\n return this.files.findIndex((file) => file.id === id);\r\n }\r\n\r\n private findElementByIndex(index: number): HTMLElement | null {\r\n // Find element by file at the given index\r\n if (index < 0 || index >= this.files.length) {\r\n return null;\r\n }\r\n\r\n const file = this.files[index];\r\n if (!file) {\r\n return null;\r\n }\r\n\r\n return this.itemRefs.get(file.id) || null;\r\n }\r\n\r\n private emitReorderEvent(\r\n fromIndex: number,\r\n toIndex: number,\r\n newOrder: UploadFile[],\r\n movedItem: UploadFile\r\n ): void {\r\n // Create a custom event for reorder notifications\r\n const event = new CustomEvent(\"fileReorder\", {\r\n detail: {\r\n fromIndex,\r\n toIndex,\r\n newOrder,\r\n movedItem,\r\n timestamp: Date.now(),\r\n },\r\n });\r\n\r\n // Dispatch event on container if available, otherwise on document\r\n const target = this.containerRef || document;\r\n target.dispatchEvent(event);\r\n }\r\n\r\n // Public methods for external control\r\n setFiles(files: UploadFile[]): void {\r\n this.files = files;\r\n }\r\n\r\n reorderItems(\r\n fromIndex: number,\r\n toIndex: number,\r\n items: UploadFile[]\r\n ): ReorderResult {\r\n // Validate array operation\r\n const validation = InputValidator.validateArrayOperation(\r\n fromIndex,\r\n toIndex,\r\n items?.length || 0\r\n );\r\n if (!validation.isValid) {\r\n return {\r\n success: false,\r\n newOrder: items || [],\r\n movedItem: null,\r\n fromIndex,\r\n toIndex,\r\n };\r\n }\r\n\r\n // Handle null/undefined items safely\r\n if (!items || !Array.isArray(items)) {\r\n return {\r\n success: false,\r\n newOrder: [],\r\n movedItem: null,\r\n fromIndex,\r\n toIndex,\r\n };\r\n }\r\n\r\n if (\r\n fromIndex === toIndex ||\r\n fromIndex < 0 ||\r\n toIndex < 0 ||\r\n fromIndex >= items.length ||\r\n toIndex >= items.length\r\n ) {\r\n return {\r\n success: false,\r\n newOrder: items,\r\n movedItem: null,\r\n fromIndex,\r\n toIndex,\r\n };\r\n }\r\n\r\n const newOrder = [...items];\r\n const [movedItem] = newOrder.splice(fromIndex, 1);\r\n newOrder.splice(toIndex, 0, movedItem);\r\n\r\n return {\r\n success: true,\r\n newOrder,\r\n movedItem,\r\n fromIndex,\r\n toIndex,\r\n };\r\n }\r\n\r\n getDragState(): DragState {\r\n return { ...this.dragState };\r\n }\r\n\r\n isReorderingEnabled(): boolean {\r\n return this.isEnabled && this.options.enableReordering;\r\n }\r\n\r\n destroy(): void {\r\n this.stopDrag();\r\n this.itemRefs.clear();\r\n this.containerRef = null;\r\n\r\n if (this.animationFrame) {\r\n cancelAnimationFrame(this.animationFrame);\r\n }\r\n }\r\n}\r\n"]}