frontend_nyla/src/components/UiComponents/Messages/MessageUtils.ts
2025-12-01 17:01:25 +01:00

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;
}
};