mirror of
https://github.com/Noooste/garage-ui.git
synced 2026-08-19 09:16:16 +00:00
80553c6450
Signed-off-by: Noste <83548733+Noooste@users.noreply.github.com>
116 lines
2.9 KiB
TypeScript
116 lines
2.9 KiB
TypeScript
/**
|
|
* 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<string, string> = {
|
|
// 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];
|
|
}
|