/** * Get the file type based on file extension */ export function getFileType(filename: string): string { if (!filename) return 'Unknown'; const extension = filename.split('.').pop()?.toLowerCase() || ''; if (!extension) return 'File'; const typeMap: Record = { // Images 'png': 'Image', 'jpg': 'Image', 'jpeg': 'Image', 'gif': 'Image', 'svg': 'Image', 'webp': 'Image', // Documents 'pdf': 'PDF', 'doc': 'Document', 'docx': 'Document', 'xls': 'Spreadsheet', 'xlsx': 'Spreadsheet', 'ppt': 'Presentation', 'pptx': 'Presentation', 'txt': 'Text', // Archives 'zip': 'Archive', 'rar': 'Archive', 'gz': 'Archive', 'tar': 'Archive', // Video/Audio 'mp4': 'Video', 'avi': 'Video', 'mov': 'Video', 'mkv': 'Video', 'webm': 'Video', 'mp3': 'Audio', 'wav': 'Audio', 'flac': 'Audio', // Code 'js': 'JavaScript', 'ts': 'TypeScript', 'tsx': 'TypeScript', 'jsx': 'JavaScript', 'py': 'Python', 'java': 'Java', 'cpp': 'C++', 'c': 'C', 'html': 'HTML', 'css': 'CSS', 'json': 'JSON', 'xml': 'XML', 'sql': 'SQL', // Data 'csv': 'CSV', }; return typeMap[extension] || extension.toUpperCase(); } /** * Generate breadcrumbs from a file path */ export function getBreadcrumbs(currentPath: string): Array<{ label: string; path: string }> { if (!currentPath) return [{ label: 'Root', path: '' }]; const parts = currentPath.split('/').filter(Boolean); const breadcrumbs = [{ label: 'Root', path: '' }]; parts.forEach((part, index) => { const path = parts.slice(0, index + 1).join('/') + '/'; breadcrumbs.push({ label: part, path }); }); return breadcrumbs; } /** * Format relative time from a date */ export function formatRelativeTime(date: Date): string { const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); if (diffMins < 1) return 'just now'; if (diffMins < 60) return `${diffMins} minute${diffMins !== 1 ? 's' : ''} ago`; if (diffHours < 24) return `${diffHours} hour${diffHours !== 1 ? 's' : ''} ago`; if (diffDays < 7) return `${diffDays} day${diffDays !== 1 ? 's' : ''} ago`; if (diffDays < 30) return `${Math.floor(diffDays / 7)} week${Math.floor(diffDays / 7) !== 1 ? 's' : ''} ago`; return `${Math.floor(diffDays / 30)} month${Math.floor(diffDays / 30) !== 1 ? 's' : ''} ago`; } /** * Format bytes to human-readable size */ export function formatBytes(bytes: number, decimals = 2): string { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; }