import React, { useState } from "react"; import { WorkflowLog } from "./dashboardChatAreaTypes"; import messageStyles from './DashboardChatAreaStyles/DashboardChatMessages.module.css'; interface LogItemProps { log: WorkflowLog; index: number; } const LogItem: React.FC = ({ log }) => { const [showDetails, setShowDetails] = useState(false); // Format timestamp with robust parsing (same logic as MessageList) const formatTimestamp = (timestamp: any) => { if (!timestamp) { return 'No timestamp'; } // Handle different timestamp formats (same as safeParseDate) let dateToTry = timestamp; // If it's a number, check if it's in seconds or milliseconds if (typeof timestamp === 'number') { // If it's a 10-digit number, it's likely seconds since epoch if (timestamp < 10000000000) { dateToTry = timestamp * 1000; // Convert seconds to milliseconds } else { dateToTry = timestamp; // Already in milliseconds } } // If it's a string that looks like a number, parse it and handle seconds/milliseconds else if (typeof timestamp === 'string' && /^\d+$/.test(timestamp)) { const numericTimestamp = parseInt(timestamp); // If it's a 10-digit number, it's likely seconds since epoch if (numericTimestamp < 10000000000) { dateToTry = numericTimestamp * 1000; // Convert seconds to milliseconds } else { dateToTry = numericTimestamp; // Already in milliseconds } } // If it's already a Date object else if (timestamp instanceof Date) { dateToTry = timestamp; } const date = new Date(dateToTry); // Check if the date is valid if (isNaN(date.getTime())) { console.warn(`⚠️ LogItem: Invalid timestamp detected:`, { originalTimestamp: timestamp, type: typeof timestamp, processedTimestamp: dateToTry }); return `Invalid: ${timestamp}`; } const now = new Date(); const isToday = date.toDateString() === now.toDateString(); let formatted = ''; if (isToday) { formatted = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } else { formatted = date.toLocaleDateString([], { month: 'short', day: 'numeric' }) + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } return formatted; }; // Determine log level for styling const logLevel = log.level || (log.type?.toLowerCase() as 'info' | 'warning' | 'error' | 'debug') || 'info'; // Debug: Log what the LogItem is receiving return (
{logLevel.toUpperCase()} {formatTimestamp(log.timestamp)}
{log.message}
{log.source && (
Source: {log.source}
)}
); }; export default LogItem;