85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
/**
|
|
* Utility functions for message formatting and styling
|
|
*/
|
|
|
|
/**
|
|
* Formats a timestamp to a readable date/time string
|
|
* Handles both Unix timestamps in seconds and milliseconds
|
|
* Formats exactly like FormGenerator component
|
|
*/
|
|
export const formatTimestamp = (timestamp?: number): string => {
|
|
if (!timestamp) return '';
|
|
|
|
try {
|
|
// Backend sends UTC timestamp in seconds (Unix timestamp)
|
|
// JavaScript Date constructor expects milliseconds
|
|
// Check if timestamp is in seconds (typical Unix timestamp range)
|
|
// Timestamps less than 10000000000 (year 2286) are likely in seconds
|
|
let date: Date;
|
|
if (timestamp < 10000000000) {
|
|
// Convert seconds to milliseconds
|
|
date = new Date(timestamp * 1000);
|
|
} else {
|
|
// Already in milliseconds
|
|
date = new Date(timestamp);
|
|
}
|
|
|
|
// Validate date
|
|
if (isNaN(date.getTime())) {
|
|
console.warn('Invalid timestamp:', timestamp);
|
|
return '';
|
|
}
|
|
|
|
// Format exactly like FormGenerator: YYYY-MM-DD HH:MM:SS GMT±HHMM
|
|
const year = date.getFullYear();
|
|
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
const day = String(date.getDate()).padStart(2, '0');
|
|
const hours = String(date.getHours()).padStart(2, '0');
|
|
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
const timezoneOffset = date.getTimezoneOffset();
|
|
const offsetHours = Math.floor(Math.abs(timezoneOffset) / 60);
|
|
const offsetMinutes = Math.abs(timezoneOffset) % 60;
|
|
const offsetSign = timezoneOffset <= 0 ? '+' : '-';
|
|
const timezone = `GMT${offsetSign}${String(offsetHours).padStart(2, '0')}${offsetMinutes > 0 ? ':' + String(offsetMinutes).padStart(2, '0') : ''}`;
|
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds} ${timezone}`;
|
|
} catch (error) {
|
|
console.warn('Error formatting timestamp:', timestamp, error);
|
|
return '';
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Formats file size to human-readable format
|
|
*/
|
|
export const formatFileSize = (bytes: number): string => {
|
|
if (bytes === 0) return '0 Bytes';
|
|
const k = 1024;
|
|
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
|
|
};
|
|
|
|
/**
|
|
* Gets status badge color class based on status
|
|
*/
|
|
export const getStatusClass = (baseStyles: any, status?: string, success?: boolean): string => {
|
|
if (success === false) return baseStyles.statusError;
|
|
if (success === true) return baseStyles.statusSuccess;
|
|
|
|
switch (status?.toLowerCase()) {
|
|
case 'completed':
|
|
case 'success':
|
|
return baseStyles.statusSuccess;
|
|
case 'failed':
|
|
case 'error':
|
|
return baseStyles.statusError;
|
|
case 'running':
|
|
case 'pending':
|
|
return baseStyles.statusPending;
|
|
default:
|
|
return baseStyles.statusDefault;
|
|
}
|
|
};
|
|
|