diff --git a/src/features/dashboard/components/DashboardGrid.tsx b/src/features/dashboard/components/DashboardGrid.tsx
index 3e52ec0..b76ea25 100644
--- a/src/features/dashboard/components/DashboardGrid.tsx
+++ b/src/features/dashboard/components/DashboardGrid.tsx
@@ -1,10 +1,12 @@
import CameraStatus from "./CameraStatus";
+import SystemOverview from "./SystemOverview";
import SystemStatusCard from "./SystemStatusCard";
const DashboardGrid = () => {
return (
-
+
+
diff --git a/src/features/dashboard/components/StatusItems/StatusItemCPU.tsx b/src/features/dashboard/components/StatusItems/StatusItemCPU.tsx
new file mode 100644
index 0000000..937e5c4
--- /dev/null
+++ b/src/features/dashboard/components/StatusItems/StatusItemCPU.tsx
@@ -0,0 +1,23 @@
+import { faHardDrive } from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+
+type StatusItemProps = {
+ statusInfoItem: string;
+ description: string;
+};
+
+const StatusItemCPU = ({ statusInfoItem, description }: StatusItemProps) => {
+ return (
+
+
+
+
+
+
{statusInfoItem}
+
+
{description}
+
+ );
+};
+
+export default StatusItemCPU;
diff --git a/src/features/dashboard/components/StatusItems/StatusItemLocal.tsx b/src/features/dashboard/components/StatusItems/StatusItemLocal.tsx
new file mode 100644
index 0000000..77dd4ba
--- /dev/null
+++ b/src/features/dashboard/components/StatusItems/StatusItemLocal.tsx
@@ -0,0 +1,31 @@
+import { faClock } from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+
+type StatusItemProps = {
+ statusInfoItem: string;
+ description: string;
+};
+
+const StatusItemLocal = ({ statusInfoItem, description }: StatusItemProps) => {
+ const humanReadable = (string: string) => {
+ if (description.toLowerCase().includes("local")) {
+ const text = string.slice(0, statusInfoItem.length - 5);
+ return text;
+ }
+ };
+
+ return (
+
+
+
+
+
+
{description.toLowerCase().includes("local") && humanReadable(statusInfoItem)}
+
+
+
{description}
+
+ );
+};
+
+export default StatusItemLocal;
diff --git a/src/features/dashboard/components/StatusItems/StatusItemThreads.tsx b/src/features/dashboard/components/StatusItems/StatusItemThreads.tsx
new file mode 100644
index 0000000..01e9239
--- /dev/null
+++ b/src/features/dashboard/components/StatusItems/StatusItemThreads.tsx
@@ -0,0 +1,24 @@
+import { faMicrochip } from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+
+type StatusItemProps = {
+ statusInfoItem: string;
+ description: string;
+};
+
+const StatusItemThreads = ({ statusInfoItem, description }: StatusItemProps) => {
+ return (
+
+
+
+
+
+
{statusInfoItem}
+
+
+
{description}
+
+ );
+};
+
+export default StatusItemThreads;
diff --git a/src/features/dashboard/components/StatusItems/StatusItemUTC.tsx b/src/features/dashboard/components/StatusItems/StatusItemUTC.tsx
new file mode 100644
index 0000000..0b7a5d0
--- /dev/null
+++ b/src/features/dashboard/components/StatusItems/StatusItemUTC.tsx
@@ -0,0 +1,32 @@
+import { faClock } from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+
+type StatusItemProps = {
+ statusInfoItem: string;
+ description: string;
+};
+
+const StatusItemUTC = ({ statusInfoItem, description }: StatusItemProps) => {
+ const humanReadable = (string: string) => {
+ if (description.includes("UTC")) {
+ const text = string.slice(0, statusInfoItem.length - 3);
+ return text;
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
{description.toLowerCase().includes("utc") && humanReadable(statusInfoItem)}
+
+
+
{description}
+
+ );
+};
+
+export default StatusItemUTC;
diff --git a/src/features/dashboard/components/SystemOverview.tsx b/src/features/dashboard/components/SystemOverview.tsx
new file mode 100644
index 0000000..de6e89b
--- /dev/null
+++ b/src/features/dashboard/components/SystemOverview.tsx
@@ -0,0 +1,12 @@
+import Card from "../../../ui/Card";
+import CardHeader from "../../../ui/CardHeader";
+
+const SystemOverview = () => {
+ return (
+
+
+
+ );
+};
+
+export default SystemOverview;
diff --git a/src/features/dashboard/components/SystemStatusCard.tsx b/src/features/dashboard/components/SystemStatusCard.tsx
index d2ee725..e3307b4 100644
--- a/src/features/dashboard/components/SystemStatusCard.tsx
+++ b/src/features/dashboard/components/SystemStatusCard.tsx
@@ -1,20 +1,24 @@
import { useInfoSocket } from "../../../app/context/WebSocketContext";
import Card from "../../../ui/Card";
import CardHeader from "../../../ui/CardHeader";
+import StatusItemCPU from "./StatusItems/StatusItemCPU";
+import StatusItemLocal from "./StatusItems/StatusItemLocal";
+import StatusItemThreads from "./StatusItems/StatusItemThreads";
+import StatusItemUTC from "./StatusItems/StatusItemUTC";
const SystemStatusCard = () => {
const { data: stats } = useInfoSocket();
return (
-
-
+
+
{stats ? (
- <>
- UTC: {stats["system-clock-utc"]}
- Local: {stats["system-clock-local"]}
- CPU: {stats["memory-cpu-status"]}
- Threads: {stats["thread-count"]}
- >
+
+
+
+
+
+
) : (
Loading system status…
)}
diff --git a/src/features/dashboard/hooks/useGetSystemHealth.ts b/src/features/dashboard/hooks/useGetSystemHealth.ts
new file mode 100644
index 0000000..2c4bb3f
--- /dev/null
+++ b/src/features/dashboard/hooks/useGetSystemHealth.ts
@@ -0,0 +1,15 @@
+import { useQuery } from "@tanstack/react-query";
+
+const fetchData = async () => {
+ const response = await fetch(`http://192.168.202.121/api/system-health`);
+ if (!response.ok) throw new Error("Cannot get System overview");
+ return response.json();
+};
+
+export const useGetSystemHealth = () => {
+ const query = useQuery({
+ queryKey: ["fetchSystemData"],
+ queryFn: fetchData,
+ });
+ return { query };
+};