@tapie-kr/inspire-react
Version:
React Component Collection for INSPIRE
18 lines (15 loc) • 1.91 kB
JavaScript
/* eslint-disable */
/*
* INSPIRE : Creative Kit
* React Component Collection for INSPIRE
*
* This file is generated automatically. Do not modify it manually
* Generated at : 2025. 3. 4. 오후 6:18:13
* @tapie-kr/inspire-react version: 0.2.15
*
* (c) 2025 TAPIE. All rights reserved.
* MIT License
*/
import { useState, useCallback } from 'react';
function useDraggableFileInputController(inputProps){const[files,setFiles]=useState(null);const[isDragging,setIsDragging]=useState(false);const handleFileChange=useCallback(e=>{const fileList=e.target.files;if(inputProps.onChange){inputProps.onChange(e);}if(fileList&&fileList.length>0&&!fileList[0].webkitRelativePath){setFiles(Array.from(fileList));}},[]);const removeFile=useCallback(index=>{setFiles(prev=>{if(!prev)return null;const newFiles=[...prev];newFiles.splice(index,1);return newFiles.length>0?newFiles:null});},[]);const handleDragEnter=useCallback(e=>{e.preventDefault();e.stopPropagation();setIsDragging(true);},[]);const handleDragLeave=useCallback(e=>{e.preventDefault();e.stopPropagation();setIsDragging(false);},[]);const handleDragOver=useCallback(e=>{e.preventDefault();e.stopPropagation();},[]);const handleDrop=useCallback(e=>{e.preventDefault();e.stopPropagation();setIsDragging(false);if(e.dataTransfer.items){const items=Array.from(e.dataTransfer.items);const filesOnly=items.reduce((acc,item)=>{const entry=item.webkitGetAsEntry();if(item.kind==="file"&&!entry?.isDirectory){const file=item.getAsFile();if(file)acc.push(file);}return acc},[]);if(filesOnly.length>0){setFiles(filesOnly);}}},[]);const clearFiles=useCallback(()=>setFiles(null),[]);const controller={files,onChange:handleFileChange,onDragEnter:handleDragEnter,onDragLeave:handleDragLeave,onDragOver:handleDragOver,onDrop:handleDrop};const tools={clearFiles,removeFile};return {files,isDragging,tools,controller}}
export { useDraggableFileInputController };