Files
Homarr/src/components/modules/system/SystemModule.tsx

122 lines
3.5 KiB
TypeScript
Raw Normal View History

2022-05-31 19:59:31 +02:00
import {
Card,
Center,
ColorSwatch,
Group,
RingProgress,
Text,
Title,
useMantineTheme,
} from '@mantine/core';
2022-05-23 09:57:49 +02:00
import { Cpu } from 'tabler-icons-react';
import { useEffect, useState } from 'react';
import axios from 'axios';
import si from 'systeminformation';
2022-05-31 19:59:31 +02:00
import { ResponsiveLine } from '@nivo/line';
2022-05-23 09:57:49 +02:00
import { IModule } from '../modules';
2022-05-31 19:59:31 +02:00
import { useListState } from '@mantine/hooks';
2022-05-23 09:57:49 +02:00
export const SystemModule: IModule = {
title: 'System info',
description: 'Show the current CPU usage and memory usage',
icon: Cpu,
component: SystemInfo,
};
interface ApiResponse {
cpu: si.Systeminformation.CpuData;
os: si.Systeminformation.OsData;
memory: si.Systeminformation.MemData;
load: si.Systeminformation.CurrentLoadData;
}
export default function SystemInfo(args: any) {
const [data, setData] = useState<ApiResponse>();
2022-05-31 19:59:31 +02:00
// Refresh data every second
2022-05-23 09:57:49 +02:00
useEffect(() => {
setInterval(() => {
axios.get('/api/modules/systeminfo').then((res) => setData(res.data));
2022-05-31 19:59:31 +02:00
}, 1000);
}, [args]);
2022-05-31 20:22:53 +02:00
// Update data every time data changes
2022-05-31 19:59:31 +02:00
const [cpuLoadHistory, cpuLoadHistoryHandlers] =
useListState<si.Systeminformation.CurrentLoadData>([]);
2022-05-31 20:22:53 +02:00
// useEffect(() => {
// }, [data]);
2022-05-31 19:59:31 +02:00
const theme = useMantineTheme();
const currentLoad = data?.load?.currentLoad ?? 0;
2022-05-23 09:57:49 +02:00
return (
<Center>
<Group p="sm" direction="column" align="center">
<Title order={3}>Current CPU load</Title>
2022-05-31 20:22:53 +02:00
{/* <ResponsiveLine
2022-05-31 19:59:31 +02:00
isInteractive
enableSlices="x"
sliceTooltip={({ slice }) => {
const Download = slice.points[0].data.y as number;
const Upload = slice.points[1].data.y as number;
// Get the number of seconds since the last update.
const seconds = (Date.now() - (slice.points[0].data.x as number)) / 1000;
// Round to the nearest second.
const roundedSeconds = Math.round(seconds);
return (
<Card p="sm" radius="md" withBorder>
<Text size="md">{roundedSeconds} seconds ago</Text>
<Card.Section p="sm">
<Group direction="column">
<Group>
<ColorSwatch size={10} color={theme.colors.green[5]} />
<Text size="md">CPU: {currentLoad}</Text>
</Group>
</Group>
</Card.Section>
</Card>
);
}}
data={[
{
id: 'downloads',
data: chartDataUp,
},
]}
curve="monotoneX"
yFormat=" >-.2f"
axisTop={null}
axisRight={null}
enablePoints={false}
animate={false}
enableGridX={false}
enableGridY={false}
enableArea
defs={[
linearGradientDef('gradientA', [
{ offset: 0, color: 'inherit' },
{ offset: 100, color: 'inherit', opacity: 0 },
]),
]}
fill={[{ match: '*', id: 'gradientA' }]}
colors={[
// Blue
theme.colors.blue[5],
// Green
theme.colors.green[5],
]}
2022-05-31 20:22:53 +02:00
/> */}
2022-05-23 09:57:49 +02:00
<RingProgress
size={120}
2022-05-31 19:59:31 +02:00
label={<Center>{`${(currentLoad * 100).toFixed(2)}%`}</Center>}
2022-05-23 09:57:49 +02:00
thickness={12}
roundCaps
sections={[{ value: data?.load?.currentLoad ?? 0, color: 'cyan' }]}
/>
</Group>
</Center>
);
}