import React, { useRef, useEffect, useMemo } from 'react'; import { LogEntry } from '../types'; import { Terminal, Plug, Unplug, Settings2, Trash2, Usb } from 'lucide-react'; interface SerialConsoleProps { title: string; logs: LogEntry[]; isConnected: boolean; onConnect: () => void; onDisconnect: () => void; onClear: () => void; baudRate: number; setBaudRate: (rate: number) => void; portInfo?: string | null; colorClass?: string; // Text color for the source label } const BAUD_RATES = [9600, 19200, 38400, 57600, 115200]; const SerialConsole: React.FC = ({ title, logs, isConnected, onConnect, onDisconnect, onClear, baudRate, setBaudRate, portInfo, colorClass = 'text-gray-400' }) => { const logContainerRef = useRef(null); // Memoize reversed logs to prevent unnecessary array operations on every render const reversedLogs = useMemo(() => [...logs].reverse(), [logs]); // Force scroll to top whenever logs update to ensure the newest (top) is visible useEffect(() => { if (logContainerRef.current) { logContainerRef.current.scrollTop = 0; } }, [reversedLogs]); return (
{/* Header with Connection Controls */}
{title}
{isConnected && portInfo && (
{portInfo.replace('ID:', '')}
)}
{/* Log Body */}
{reversedLogs.length === 0 && (
No Data
)} {reversedLogs.map((log, index) => (
{/* Row Number (1 = Newest) */} {index + 1} {log.timestamp} {log.type === 'RX' ? 'RX' : log.type === 'TX' ? 'TX' : '--'} {log.message}
))}
); }; export default SerialConsole;