File size: 1,620 Bytes
fe90915
1acafa4
 
 
 
 
 
fe90915
1acafa4
 
 
fe90915
1acafa4
 
fe90915
1acafa4
 
 
 
 
 
 
 
 
 
 
 
 
 
fe90915
 
 
 
1acafa4
fe90915
1acafa4
 
fe90915
 
 
1acafa4
 
 
 
 
 
 
 
 
 
 
 
 
 
fe90915
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import React, { useContext, useEffect, useRef, useState } from 'react';
import { LogContext } from './LogContext';
import './LogPanel.css';

const LogPanel = () => {
  const { logs } = useContext(LogContext);
  const panelRef = useRef(null);
  const [isMinimized, setIsMinimized] = useState(false);

  // Auto-scroll to the bottom when new logs arrive
  useEffect(() => {
    if (panelRef.current && !isMinimized) {
      panelRef.current.scrollTop = panelRef.current.scrollHeight;
    }
  }, [logs, isMinimized]);

  const getLogLevelClass = (level) => {
    switch (level) {
      case 'ERROR':
        return 'log-error';
      case 'SUCCESS':
        return 'log-success';
      case 'WARN':
        return 'log-warn';
      default:
        return 'log-info';
    }
  };

  const toggleMinimize = () => {
    setIsMinimized(!isMinimized);
  };

  return (
    <div className={`log-panel ${isMinimized ? 'minimized' : ''}`} ref={panelRef}>
      <div className="log-header">
        <span>Application Logs</span>
        <button className="log-minimize-btn" onClick={toggleMinimize}>
          {isMinimized ? '▲' : '▼'}
        </button>
      </div>
      <div className="log-content">
        {logs.map((log, index) => (
          <div key={index} className={`log-entry ${getLogLevelClass(log.level)}`}>
            <span className="log-timestamp">{new Date(log.timestamp).toLocaleTimeString()}</span>
            <span className="log-level">{log.level}</span>
            <span className="log-message">{log.message}</span>
          </div>
        ))}
      </div>
    </div>
  );
};

export default LogPanel;