import {useParams} from "react-router-dom"; import {useDataRequest} from "../../../../hooks/dataFetchHook"; import {fetchOptimizedPerformance, fetchPingGraph, fetchPluginHistory} from "../../../../service/serverService"; import {ErrorViewBody} from "../../../../views/ErrorView"; import {useTranslation} from "react-i18next"; import {Card} from "react-bootstrap"; import CardTabs from "../../../CardTabs"; import {faGears, faHdd, faMap, faMicrochip, faSignal, faTachometerAlt} from "@fortawesome/free-solid-svg-icons"; import React, {useEffect, useState} from "react"; import {ChartLoader} from "../../../navigation/Loader"; import AllPerformanceGraph from "../../../graphs/performance/AllPerformanceGraph"; import TpsPerformanceGraph from "../../../graphs/performance/TpsPerformanceGraph"; import CpuRamPerformanceGraph from "../../../graphs/performance/CpuRamPerformanceGraph"; import WorldPerformanceGraph from "../../../graphs/performance/WorldPerformanceGraph"; import DiskPerformanceGraph from "../../../graphs/performance/DiskPerformanceGraph"; import PingGraph from "../../../graphs/performance/PingGraph"; import {mapPerformanceDataToSeries} from "../../../../util/graphs"; import {useAuth} from "../../../../hooks/authenticationHook"; const AllGraphTab = ({data, dataSeries, pluginHistorySeries, loadingError}) => { if (loadingError) return if (!dataSeries) return ; return } const TpsGraphTab = ({data, dataSeries, pluginHistorySeries, loadingError}) => { if (loadingError) return if (!dataSeries) return ; return } const CpuRamGraphTab = ({data, dataSeries, pluginHistorySeries, loadingError}) => { if (loadingError) return if (!dataSeries) return ; return } const WorldGraphTab = ({data, dataSeries, pluginHistorySeries, loadingError}) => { if (loadingError) return if (!dataSeries) return ; return } const DiskGraphTab = ({data, dataSeries, pluginHistorySeries, loadingError}) => { if (loadingError) return if (!dataSeries) return ; return } const PingGraphTab = ({identifier}) => { const {data, loadingError} = useDataRequest(fetchPingGraph, [identifier]); if (loadingError) return if (!data) return ; return ; } const PerformanceGraphsCard = () => { const {t} = useTranslation(); const {authRequired, hasPermission} = useAuth(); const {identifier} = useParams(); const {data, loadingError} = useDataRequest(fetchOptimizedPerformance, [identifier]); const [parsedData, setParsedData] = useState(undefined); const { data: pluginHistory, loadingError: pluginHistoryLoadingError } = useDataRequest(fetchPluginHistory, [identifier], authRequired && hasPermission('page.server.plugin.history')); const [pluginHistorySeries, setPluginHistorySeries] = useState({}); useEffect(() => { if (data) { mapPerformanceDataToSeries(data.values).then(parsed => setParsedData(parsed)) } }, [data, setParsedData]); useEffect(() => { // https://stackoverflow.com/a/34890276/20825073 const groupBy = function (xs, key) { return xs.reduce(function (rv, x) { (rv[x[key]] = rv[x[key]] || []).push(x); return rv; }, {}); }; if (pluginHistory) { const grouped = groupBy(pluginHistory.history.reverse(), 'modified'); setPluginHistorySeries({ type: 'flags', accessibility: { exposeAsGroupOnly: true, description: t('html.label.pluginVersionHistory') }, tooltip: {headerFormat: ''}, data: Object.entries(grouped).map(entry => { const installedLines = entry[1].filter(p => p.version).map(plugin => plugin.name + ': ' + plugin.version).join(',
'); const uninstalledLines = entry[1].filter(p => !p.version).map(plugin => plugin.name).join(',
'); return { x: entry[0], title: entry[1].length, text: (installedLines.length ? '' + t('html.label.installed') + '
' + installedLines : '') + (uninstalledLines.length ? '' + t('html.label.uninstalled') + '
' + uninstalledLines : '') } }) }) } }, [pluginHistory, setPluginHistorySeries, t]); return }, { name: t('html.label.tps'), icon: faTachometerAlt, color: 'red', href: 'tps', element: }, { name: t('html.label.cpuRam'), icon: faMicrochip, color: 'light-green', href: 'cpu-ram', element: }, { name: t('html.label.world'), icon: faMap, color: 'purple', href: 'world-load', element: }, { name: t('html.label.ping'), icon: faSignal, color: 'amber', href: 'ping', element: }, { name: t('html.label.diskSpace'), icon: faHdd, color: 'green', href: 'disk', element: }, ]}/> } export default PerformanceGraphsCard;