(selectedFile: File)
| 250 | }; |
| 251 | |
| 252 | const validateAndSetFile = (selectedFile: File) => { |
| 253 | setError(null); |
| 254 | setOutputUrl(null); |
| 255 | |
| 256 | const expectedMimeType = getMimeType(currentSourceFormat); |
| 257 | |
| 258 | let isValidType = false; |
| 259 | |
| 260 | if (currentSourceFormat === "mov") { |
| 261 | isValidType = |
| 262 | selectedFile.type === "video/quicktime" || |
| 263 | selectedFile.type === "video/mov" || |
| 264 | selectedFile.name.toLowerCase().endsWith(".mov"); |
| 265 | } else if (currentSourceFormat === "mkv") { |
| 266 | isValidType = |
| 267 | selectedFile.type === "video/x-matroska" || |
| 268 | selectedFile.name.toLowerCase().endsWith(".mkv"); |
| 269 | } else if (currentSourceFormat === "avi") { |
| 270 | isValidType = |
| 271 | selectedFile.type === "video/x-msvideo" || |
| 272 | selectedFile.type === "video/avi" || |
| 273 | selectedFile.name.toLowerCase().endsWith(".avi"); |
| 274 | } else { |
| 275 | isValidType = |
| 276 | selectedFile.type === expectedMimeType || |
| 277 | selectedFile.type.includes(currentSourceFormat) || |
| 278 | selectedFile.name.toLowerCase().endsWith(`.${currentSourceFormat}`); |
| 279 | } |
| 280 | |
| 281 | if (!isValidType) { |
| 282 | setError(`Please select a ${currentSourceFormat.toUpperCase()} file.`); |
| 283 | trackEvent(`${conversionPath}_invalid_file_type`, { |
| 284 | fileType: selectedFile.type, |
| 285 | }); |
| 286 | return; |
| 287 | } |
| 288 | |
| 289 | if (selectedFile.size > 500 * 1024 * 1024) { |
| 290 | setError("File size exceeds 500MB limit."); |
| 291 | trackEvent(`${conversionPath}_file_too_large`, { |
| 292 | fileSize: selectedFile.size, |
| 293 | }); |
| 294 | return; |
| 295 | } |
| 296 | |
| 297 | setFile(selectedFile); |
| 298 | trackEvent(`${conversionPath}_file_selected`, { |
| 299 | fileSize: selectedFile.size, |
| 300 | }); |
| 301 | }; |
| 302 | |
| 303 | const handleDragOver = (e: React.DragEvent) => { |
| 304 | e.preventDefault(); |
no test coverage detected