'use client'; import * as React from 'react'; import { File, FileVideo, FileAudio, FileImage, Clock, HardDrive, Film, Music } from 'lucide-react'; import { Card } from '@/components/ui/Card'; import type { ConversionFormat } from '@/types/conversion'; interface FileInfoProps { file: File; format: ConversionFormat; } interface FileMetadata { name: string; size: string; type: string; category: string; duration?: string; dimensions?: string; } export function FileInfo({ file, format }: FileInfoProps) { const [metadata, setMetadata] = React.useState(null); React.useEffect(() => { extractMetadata(file, format); }, [file, format]); const extractMetadata = async (file: File, format: ConversionFormat) => { const sizeInMB = (file.size / (1024 * 1024)).toFixed(2); const baseMetadata: FileMetadata = { name: file.name, size: file.size < 1024 * 1024 ? `${(file.size / 1024).toFixed(2)} KB` : `${sizeInMB} MB`, type: format.name, category: format.category, }; // Try to extract media-specific metadata if (format.category === 'video' && file.type.startsWith('video/')) { try { const video = document.createElement('video'); video.preload = 'metadata'; const promise = new Promise((resolve) => { video.onloadedmetadata = () => { const duration = video.duration; const minutes = Math.floor(duration / 60); const seconds = Math.floor(duration % 60); const durationStr = `${minutes}:${seconds.toString().padStart(2, '0')}`; resolve({ ...baseMetadata, duration: durationStr, dimensions: `${video.videoWidth} × ${video.videoHeight}`, }); URL.revokeObjectURL(video.src); }; video.onerror = () => { resolve(baseMetadata); URL.revokeObjectURL(video.src); }; }); video.src = URL.createObjectURL(file); const result = await promise; setMetadata(result); return; } catch (error) { console.error('Failed to extract video metadata:', error); } } else if (format.category === 'audio' && file.type.startsWith('audio/')) { try { const audio = document.createElement('audio'); audio.preload = 'metadata'; const promise = new Promise((resolve) => { audio.onloadedmetadata = () => { const duration = audio.duration; const minutes = Math.floor(duration / 60); const seconds = Math.floor(duration % 60); const durationStr = `${minutes}:${seconds.toString().padStart(2, '0')}`; resolve({ ...baseMetadata, duration: durationStr, }); URL.revokeObjectURL(audio.src); }; audio.onerror = () => { resolve(baseMetadata); URL.revokeObjectURL(audio.src); }; }); audio.src = URL.createObjectURL(file); const result = await promise; setMetadata(result); return; } catch (error) { console.error('Failed to extract audio metadata:', error); } } else if (format.category === 'image' && file.type.startsWith('image/')) { try { const img = new Image(); const promise = new Promise((resolve) => { img.onload = () => { resolve({ ...baseMetadata, dimensions: `${img.width} × ${img.height}`, }); URL.revokeObjectURL(img.src); }; img.onerror = () => { resolve(baseMetadata); URL.revokeObjectURL(img.src); }; }); img.src = URL.createObjectURL(file); const result = await promise; setMetadata(result); return; } catch (error) { console.error('Failed to extract image metadata:', error); } } setMetadata(baseMetadata); }; const getCategoryIcon = () => { switch (format.category) { case 'video': return ; case 'audio': return ; case 'image': return ; default: return ; } }; if (!metadata) { return (
); } return (
{getCategoryIcon()}

{metadata.name}

{/* File Size */}
{metadata.size}
{/* Type */}
{metadata.type}
{/* Duration (for video/audio) */} {metadata.duration && (
{metadata.duration}
)} {/* Dimensions */} {metadata.dimensions && (
{format.category === 'video' ? ( ) : ( )} {metadata.dimensions}
)}
); }