{"version":3,"file":"UploadDropZoneContext.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.tsx"],"sourcesContent":["import {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n  type DragEvent,\n  type ReactNode,\n} from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DropHandler = (files: File[]) => void | Promise<void>;\n\ninterface UploadDropZoneContextValue {\n  isDragging: boolean;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst UploadDropZoneContext = createContext<UploadDropZoneContextValue | null>(null);\n\n/* -------------------------------------------------------------------------------------------------\n * Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst DropZoneWrapper = styled(Box)`\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-height: 100%;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UploadDropZoneProps {\n  children: ReactNode;\n  onDrop?: DropHandler;\n}\n\nexport const UploadDropZoneProvider = ({ children, onDrop }: UploadDropZoneProps) => {\n  const [isDragging, setIsDragging] = useState(false);\n  const dragCounterRef = useRef(0);\n\n  const contextValue: UploadDropZoneContextValue = {\n    isDragging,\n  };\n\n  useEffect(() => {\n    const handleDragEnd = () => {\n      setIsDragging(false);\n      dragCounterRef.current = 0;\n    };\n\n    // Handle drag leaving the entire document/window\n    const handleDocumentDragLeave = (e: globalThis.DragEvent) => {\n      // When relatedTarget is null, we're leaving the document entirely\n      if (!e.relatedTarget) {\n        setIsDragging(false);\n        dragCounterRef.current = 0;\n      }\n    };\n\n    document.addEventListener('dragend', handleDragEnd);\n    document.addEventListener('dragleave', handleDocumentDragLeave);\n\n    return () => {\n      document.removeEventListener('dragend', handleDragEnd);\n      document.removeEventListener('dragleave', handleDocumentDragLeave);\n    };\n  }, []);\n\n  const handleDragEnter = useCallback((e: DragEvent<HTMLElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n\n    dragCounterRef.current += 1;\n\n    if (e.dataTransfer.types.includes('Files')) {\n      setIsDragging(true);\n    }\n  }, []);\n\n  const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n\n    dragCounterRef.current -= 1;\n\n    // Only set dragging to false if we've left the dropzone completely\n    // (counter reaches 0 or negative)\n    if (dragCounterRef.current <= 0) {\n      setIsDragging(false);\n      dragCounterRef.current = 0;\n    }\n  }, []);\n\n  const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n    e.dataTransfer.dropEffect = 'copy';\n  }, []);\n\n  const handleDrop = useCallback(\n    (e: DragEvent<HTMLElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      setIsDragging(false);\n      dragCounterRef.current = 0;\n\n      const { files } = e.dataTransfer;\n      if (files?.length && onDrop) {\n        onDrop(Array.from(files));\n      }\n    },\n    [onDrop]\n  );\n\n  return (\n    <UploadDropZoneContext.Provider value={contextValue}>\n      <DropZoneWrapper\n        data-testid=\"assets-dropzone\"\n        onDragEnter={handleDragEnter}\n        onDragLeave={handleDragLeave}\n        onDragOver={handleDragOver}\n        onDrop={handleDrop}\n      >\n        {children}\n      </DropZoneWrapper>\n    </UploadDropZoneContext.Provider>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\nexport const useUploadDropZone = () => {\n  const context = useContext(UploadDropZoneContext);\n\n  if (!context) {\n    throw new Error('useUploadDropZone must be used within UploadDropZone');\n  }\n\n  return {\n    isDragging: context.isDragging,\n  };\n};\n"],"names":["UploadDropZoneContext","createContext","DropZoneWrapper","styled","Box","UploadDropZoneProvider","children","onDrop","isDragging","setIsDragging","useState","dragCounterRef","useRef","contextValue","useEffect","handleDragEnd","current","handleDocumentDragLeave","e","relatedTarget","document","addEventListener","removeEventListener","handleDragEnter","useCallback","preventDefault","stopPropagation","dataTransfer","types","includes","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","length","Array","from","_jsx","Provider","value","data-testid","onDragEnter","onDragLeave","onDragOver","useUploadDropZone","context","useContext","Error"],"mappings":"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"}