2025-12-01 09:33:29 +00:00
|
|
|
import type { SystemHealthStatus } from "../../../types/types";
|
|
|
|
|
import { useGetSystemHealth } from "../hooks/useGetSystemHealth";
|
2025-12-02 14:10:06 +00:00
|
|
|
import CameraStatus from "./cameraStatus/CameraStatus";
|
|
|
|
|
import SystemHealthCard from "./systemHealth/SystemHealthCard";
|
|
|
|
|
import SystemStatusCard from "./systemStatus/SystemStatusCard";
|
2025-12-17 14:19:23 +00:00
|
|
|
import { CAMERA_IDS } from "../../../app/config/cameraConfig";
|
2025-11-20 19:09:43 +00:00
|
|
|
|
|
|
|
|
const DashboardGrid = () => {
|
2025-12-01 09:33:29 +00:00
|
|
|
const { query } = useGetSystemHealth();
|
|
|
|
|
const startTime = query?.data?.StartTimeHumane;
|
|
|
|
|
const uptime = query?.data?.UptimeHumane;
|
|
|
|
|
const statuses: SystemHealthStatus[] = query?.data?.Status;
|
|
|
|
|
const isLoading = query?.isLoading;
|
|
|
|
|
const isError = query?.isError;
|
|
|
|
|
const dateUpdatedAt = query?.dataUpdatedAt;
|
|
|
|
|
const refetch = query?.refetch;
|
|
|
|
|
|
|
|
|
|
const statusCategories = statuses?.reduce<Record<string, SystemHealthStatus[]>>(
|
|
|
|
|
(acc, cur) => {
|
|
|
|
|
if (cur?.groupID === "ChannelA") acc?.channelA?.push(cur);
|
|
|
|
|
if (cur?.groupID === "ChannelB") acc?.channelB?.push(cur);
|
|
|
|
|
if (cur?.groupID === "ChannelC") acc?.channelC?.push(cur);
|
|
|
|
|
if (cur?.groupID === "Default") acc?.default?.push(cur);
|
|
|
|
|
return acc;
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
channelA: [],
|
|
|
|
|
channelB: [],
|
|
|
|
|
channelC: [],
|
2025-12-17 14:19:23 +00:00
|
|
|
// todo: check if more cameras will be added later
|
2025-12-01 09:33:29 +00:00
|
|
|
default: [],
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
2025-11-20 19:09:43 +00:00
|
|
|
return (
|
2025-12-05 17:01:57 +00:00
|
|
|
<div className="grid grid-cols-1 md:grid-rows-2 md:grid-cols-2 gap-4">
|
2025-12-17 14:19:23 +00:00
|
|
|
<div className="grid grid-cols-1 md:grid-rows-0 md:grid-cols-2 gap-4 md:col-span-2">
|
|
|
|
|
<SystemStatusCard />
|
|
|
|
|
<SystemHealthCard
|
|
|
|
|
startTime={startTime}
|
|
|
|
|
uptime={uptime}
|
|
|
|
|
statuses={statuses}
|
|
|
|
|
isLoading={isLoading}
|
|
|
|
|
isError={isError}
|
|
|
|
|
dateUpdatedAt={dateUpdatedAt}
|
|
|
|
|
refetch={refetch}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="grid grid-cols-1 md:col-span-2 md:grid-cols-[repeat(3,1fr)] gap-x-4">
|
|
|
|
|
{CAMERA_IDS.map((cameraID) => (
|
|
|
|
|
<CameraStatus
|
|
|
|
|
key={cameraID}
|
|
|
|
|
title={`Camera ${cameraID}`}
|
|
|
|
|
category={statusCategories?.[`channel${cameraID}`] ?? []}
|
|
|
|
|
isError={isError}
|
|
|
|
|
/>
|
|
|
|
|
))}
|
2025-11-24 16:17:27 +00:00
|
|
|
</div>
|
2025-11-20 19:09:43 +00:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default DashboardGrid;
|