import { ContentCopy, Launch, Public, PublicOff, Warning, } from '@mui/icons-material'; import { Box, Card, CardContent, Divider, IconButton, Tooltip, Typography, alpha, } from '@mui/material'; import { DataGrid, GridColDef } from '@mui/x-data-grid'; import { useEffect, useState } from 'react'; import { Link, useParams } from 'react-router-dom'; import { fetchData, fetchDemo } from '../apiUtil'; import { AlertResponse } from '../components/Alert'; import ErrorCard from '../components/ErrorCard'; import ExpansionBar from '../components/ExpansionsBar'; import ServerData, { ServerSettings, ServerSettingsInfo, } from '../data/ServerData'; import CopyImageIcon from '../images/copy-image.png'; interface KeyValueRow { id: number; key: string; name: string; value: string | number | boolean; } const columns: GridColDef[] = [ { field: 'key', headerName: 'Key', flex: 2 }, { field: 'name', headerName: 'Name', flex: 1 }, { field: 'value', headerName: 'Value', flex: 1 }, { field: 'description', headerName: 'Description', flex: 3 }, ]; function ServerSettingsDataGrid({ serverSettings, }: { serverSettings: ServerSettings; }) { const rows: KeyValueRow[] = Object.entries(serverSettings).map( ([key, value], index) => ({ id: index + 1, key, name: ServerSettingsInfo[key]?.name || 'none', value, description: ServerSettingsInfo[key]?.description || '', }) ); return ( ); } export default function ServerDetails({ setAlertInfo, }: { setAlertInfo: React.Dispatch>; }) { const { id } = useParams(); const [server, setServer] = useState(); const [error, setError] = useState(''); useEffect(() => { let data: ServerData; const fetchServerData = async () => { try { if (id === 'demo') { data = await fetchDemo(); } else { data = await fetchData(`server/${id}`); } } catch (err) { if (err instanceof Error) { setAlertInfo({ message: err.message, severity: 'error', }); } else { setError('An unknown error occurred.'); } } setServer(data); }; fetchServerData(); }, [id, setServer, setAlertInfo, setError]); const [clipboardTooltip, setClipboardTooltip] = useState('Copy server URL.'); const [clipboardTooltipOpen, setClipboardTooltipOpen] = useState(false); const handleClipboardTooltipClose = () => { setClipboardTooltipOpen(false); }; const handleClipboardTooltipOpen = () => { setClipboardTooltipOpen(true); }; const copyServerUrlToClipboard = async (text: string) => { try { navigator.clipboard.writeText(text); setClipboardTooltip('Copied server URL!'); handleClipboardTooltipOpen(); setTimeout(() => { handleClipboardTooltipClose(); setClipboardTooltip('Copy server URL.'); }, 3000); } catch (err) { handleClipboardTooltipOpen(); if (err instanceof Error) { setClipboardTooltip(err.message); } else { setClipboardTooltip('Something went wrong!'); } setTimeout(() => { handleClipboardTooltipClose(); setClipboardTooltip('Copy server URL.'); }, 3000); } }; function formatExternalUrl(url: string): string { // prepend 'https://' to the URL if it's not already there if (!/^https?:\/\//i.test(url)) { return `https://${url}`; } return url; } return ( {error || !server ? ( ) : ( {server.customizations['LOGIN.MAINT_MODE'] === 1 ? ( ) : (
{server.inactivity_counter > 0 ? ( ) : ( )}
)}
alpha(theme.palette.text.primary, 0.87)} sx={{ lineHeight: 1.0 }} > {server.name} {typeof server.customizations['API.WEBSITE'] === 'string' && server.customizations['API.WEBSITE'] !== '' && ( { event.stopPropagation(); }} disableRipple > theme.typography.caption.fontSize, }} /> )} alpha(theme.palette.text.primary, 0.6)} > {server.url} {window.isSecureContext && ( { event.stopPropagation(); copyServerUrlToClipboard(server.url); }} disableRipple > theme.typography.caption.fontSize, }} /> )} theme.palette.text.secondary} > {`Lv.${server.max_level}`}
{server.settings && ( )} {server.active_sessions} active sessions {server.login_limit !== 1 && ( event.preventDefault()} /> )} Updated: {new Date(server.updated).toLocaleString()}
)}
); }