(files: File[])
| 125 | }; |
| 126 | |
| 127 | const processFiles = (files: File[]): void => { |
| 128 | // Reset the invalid state when processing files. |
| 129 | setIsInvalid(false); |
| 130 | |
| 131 | const acceptedFiles: File[] = []; |
| 132 | const unacceptedFiles: File[] = []; |
| 133 | const oversizedFiles: File[] = []; |
| 134 | |
| 135 | // If multiple files are not allowed, only process the first file |
| 136 | const filesToProcess = allowsMultiple ? files : files.slice(0, 1); |
| 137 | |
| 138 | filesToProcess.forEach((file) => { |
| 139 | // Check file size first |
| 140 | if (maxSize && file.size > maxSize) { |
| 141 | oversizedFiles.push(file); |
| 142 | return; |
| 143 | } |
| 144 | |
| 145 | // Then check file type |
| 146 | if (isFileTypeAccepted(file)) { |
| 147 | acceptedFiles.push(file); |
| 148 | } else { |
| 149 | unacceptedFiles.push(file); |
| 150 | } |
| 151 | }); |
| 152 | |
| 153 | // Handle oversized files |
| 154 | if (oversizedFiles.length > 0 && typeof onSizeLimitExceed === "function") { |
| 155 | const dataTransfer = new DataTransfer(); |
| 156 | oversizedFiles.forEach((file) => dataTransfer.items.add(file)); |
| 157 | |
| 158 | setIsInvalid(true); |
| 159 | onSizeLimitExceed(dataTransfer.files); |
| 160 | } |
| 161 | |
| 162 | // Handle accepted files |
| 163 | if (acceptedFiles.length > 0 && typeof onDropFiles === "function") { |
| 164 | const dataTransfer = new DataTransfer(); |
| 165 | acceptedFiles.forEach((file) => dataTransfer.items.add(file)); |
| 166 | onDropFiles(dataTransfer.files); |
| 167 | } |
| 168 | |
| 169 | // Handle unaccepted files |
| 170 | if (unacceptedFiles.length > 0 && typeof onDropUnacceptedFiles === "function") { |
| 171 | const unacceptedDataTransfer = new DataTransfer(); |
| 172 | unacceptedFiles.forEach((file) => unacceptedDataTransfer.items.add(file)); |
| 173 | |
| 174 | setIsInvalid(true); |
| 175 | onDropUnacceptedFiles(unacceptedDataTransfer.files); |
| 176 | } |
| 177 | |
| 178 | // Clear the input value to ensure the same file can be selected again |
| 179 | if (inputRef.current) { |
| 180 | inputRef.current.value = ""; |
| 181 | } |
| 182 | }; |
| 183 | |
| 184 | const handleDrop = (event: React.DragEvent<HTMLDivElement>) => { |
no test coverage detected