140 lines
4.1 KiB
JavaScript
140 lines
4.1 KiB
JavaScript
/**
|
|
* Formatting utility functions
|
|
*/
|
|
|
|
export const formatFileSize = (bytes) => {
|
|
if (bytes == null || bytes === 0) return '0 Bytes';
|
|
const k = 1024;
|
|
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
|
if (bytes < 0) bytes = 0;
|
|
const i = bytes === 0 ? 0 : Math.max(0, Math.floor(Math.log(bytes) / Math.log(k)));
|
|
const size = i === 0 ? bytes : parseFloat((bytes / Math.pow(k, i)).toFixed(2));
|
|
return size + ' ' + sizes[i];
|
|
};
|
|
|
|
export const formatDisplayDate = (dateString) => {
|
|
if (!dateString) return '';
|
|
try {
|
|
let date = new Date(dateString);
|
|
|
|
if (isNaN(date.getTime())) {
|
|
if (/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
|
|
date = new Date(dateString + 'T00:00:00');
|
|
} else {
|
|
return dateString;
|
|
}
|
|
}
|
|
|
|
if (isNaN(date.getTime())) {
|
|
return dateString;
|
|
}
|
|
|
|
return date.toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' });
|
|
} catch (e) {
|
|
console.error("Error formatting date:", e);
|
|
return dateString;
|
|
}
|
|
};
|
|
|
|
export const formatShortDate = (dateString) => {
|
|
if (!dateString) return '';
|
|
try {
|
|
let date = new Date(dateString);
|
|
|
|
if (isNaN(date.getTime())) {
|
|
if (/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
|
|
date = new Date(dateString + 'T00:00:00');
|
|
} else {
|
|
return dateString;
|
|
}
|
|
}
|
|
|
|
if (isNaN(date.getTime())) {
|
|
return dateString;
|
|
}
|
|
|
|
const now = new Date();
|
|
const isCurrentYear = date.getFullYear() === now.getFullYear();
|
|
|
|
if (isCurrentYear) {
|
|
return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
|
|
} else {
|
|
return date.toLocaleDateString(undefined, { year: '2-digit', month: 'short', day: 'numeric' });
|
|
}
|
|
} catch (e) {
|
|
console.error("Error formatting short date:", e);
|
|
return dateString;
|
|
}
|
|
};
|
|
|
|
export const formatStatus = (status, t) => {
|
|
if (!status || status === 'COMPLETED') return '';
|
|
const statusMap = {
|
|
'PENDING': t('status.queued'),
|
|
'QUEUED': t('status.queued'),
|
|
'PROCESSING': t('status.processing'),
|
|
'TRANSCRIBING': t('status.transcribing'),
|
|
'SUMMARIZING': t('status.summarizing'),
|
|
'FAILED': t('status.failed'),
|
|
'UPLOADING': t('status.uploading')
|
|
};
|
|
return statusMap[status] || status.charAt(0).toUpperCase() + status.slice(1).toLowerCase();
|
|
};
|
|
|
|
export const getStatusClass = (status) => {
|
|
switch(status) {
|
|
case 'PENDING': return 'status-pending';
|
|
case 'QUEUED': return 'status-pending';
|
|
case 'PROCESSING': return 'status-processing';
|
|
case 'SUMMARIZING': return 'status-summarizing';
|
|
case 'COMPLETED': return '';
|
|
case 'FAILED': return 'status-failed';
|
|
default: return 'status-pending';
|
|
}
|
|
};
|
|
|
|
export const formatTime = (seconds) => {
|
|
const minutes = Math.floor(seconds / 60);
|
|
const secs = seconds % 60;
|
|
return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
|
};
|
|
|
|
export const formatDuration = (totalSeconds) => {
|
|
if (totalSeconds == null || totalSeconds < 0) return 'N/A';
|
|
|
|
if (totalSeconds < 1) {
|
|
return `${totalSeconds.toFixed(2)} seconds`;
|
|
}
|
|
|
|
totalSeconds = Math.round(totalSeconds);
|
|
|
|
if (totalSeconds < 60) {
|
|
return `${totalSeconds} sec`;
|
|
}
|
|
|
|
const hours = Math.floor(totalSeconds / 3600);
|
|
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
const seconds = totalSeconds % 60;
|
|
|
|
let parts = [];
|
|
if (hours > 0) {
|
|
parts.push(`${hours} hr`);
|
|
}
|
|
if (minutes > 0) {
|
|
parts.push(`${minutes} min`);
|
|
}
|
|
if (hours === 0 && seconds > 0) {
|
|
parts.push(`${seconds} sec`);
|
|
}
|
|
|
|
return parts.join(' ');
|
|
};
|
|
|
|
export const formatProcessingDuration = (seconds) => {
|
|
if (!seconds && seconds !== 0) return null;
|
|
if (seconds < 60) return `${seconds}s`;
|
|
const mins = Math.floor(seconds / 60);
|
|
const secs = seconds % 60;
|
|
return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;
|
|
};
|