import { useState, useEffect, useRef } from 'react' import { serverAction, sendRcon, getServerLogs } from '../api' import { useUser } from '../context/UserContext' import MetricsChart from './MetricsChart' export default function ServerDetailModal({ server, onClose, onUpdate }) { const { token, isModerator } = useUser() const [loading, setLoading] = useState(false) const [activeTab, setActiveTab] = useState('overview') const [rconCommand, setRconCommand] = useState('') const [rconHistory, setRconHistory] = useState([]) const [logs, setLogs] = useState('') const logsRef = useRef(null) const rconRef = useRef(null) const typeIcons = { minecraft: '⛏️', factorio: '⚙️' } const handleAction = async (action) => { setLoading(true) try { await serverAction(token, server.id, action) setTimeout(() => { onUpdate() setLoading(false) }, 2000) } catch (err) { console.error(err) setLoading(false) } } const handleRcon = async (e) => { e.preventDefault() if (!rconCommand.trim()) return const cmd = rconCommand setRconCommand('') try { const { response } = await sendRcon(token, server.id, cmd) setRconHistory([...rconHistory, { cmd, res: response, time: new Date() }]) } catch (err) { setRconHistory([...rconHistory, { cmd, res: 'ERROR: ' + err.message, time: new Date(), error: true }]) } } const fetchLogs = async () => { try { const data = await getServerLogs(token, server.id, 100) setLogs(data.logs || '') if (logsRef.current) { logsRef.current.scrollTop = logsRef.current.scrollHeight } } catch (err) { console.error(err) } } useEffect(() => { if (activeTab === 'logs' && isModerator) { fetchLogs() const interval = setInterval(fetchLogs, 5000) return () => clearInterval(interval) } }, [activeTab, isModerator]) useEffect(() => { if (rconRef.current) { rconRef.current.scrollTop = rconRef.current.scrollHeight } }, [rconHistory]) useEffect(() => { const handleEsc = (e) => { if (e.key === 'Escape') onClose() } window.addEventListener('keydown', handleEsc) return () => window.removeEventListener('keydown', handleEsc) }, [onClose]) const formatUptime = (seconds) => { const days = Math.floor(seconds / 86400) const hours = Math.floor((seconds % 86400) / 3600) const minutes = Math.floor((seconds % 3600) / 60) if (days > 0) return `${days}d ${hours}h ${minutes}m` return `${hours}h ${minutes}m` } const tabs = [ { id: 'overview', label: 'OVERVIEW', icon: '📊' }, { id: 'metrics', label: 'METRICS', icon: '📈' }, ...(isModerator ? [ { id: 'console', label: 'CONSOLE', icon: '💻' }, { id: 'logs', label: 'LOGS', icon: '📜' }, ] : []), ] return (