From 1a9daaddfe19bab211d4b209b961b960c63d2b59 Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Tue, 17 Oct 2023 20:26:28 +0800 Subject: [PATCH] feat: add monitor overview --- .../components/monitor/MonitorEventList.tsx | 62 +++++++++++++++++++ src/client/components/monitor/MonitorList.tsx | 5 +- src/client/pages/Monitor/Overview.tsx | 29 ++++++++- src/server/trpc/routers/monitor.ts | 21 +++++++ 4 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 src/client/components/monitor/MonitorEventList.tsx diff --git a/src/client/components/monitor/MonitorEventList.tsx b/src/client/components/monitor/MonitorEventList.tsx new file mode 100644 index 0000000..dc0d8b6 --- /dev/null +++ b/src/client/components/monitor/MonitorEventList.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { trpc } from '../../api/trpc'; +import { useCurrentWorkspaceId } from '../../store/user'; +import clsx from 'clsx'; +import dayjs from 'dayjs'; +import { Card, Empty } from 'antd'; +import { useNavigate } from 'react-router'; + +interface MonitorEventListProps { + monitorId?: string; +} +export const MonitorEventList: React.FC = React.memo( + (props) => { + const workspaceId = useCurrentWorkspaceId(); + const { data = [], isLoading } = trpc.monitor.events.useQuery({ + workspaceId, + monitorId: props.monitorId, + }); + const navigate = useNavigate(); + + if (isLoading === false && data.length === 0) { + return ; + } + + return ( +
+ {data.map((item) => ( + { + navigate(`/monitor/${item.monitorId}`); + }} + > +
+
+ {item.type} +
+ +
+ {dayjs(item.createdAt).format('YYYY-MM-DD HH:mm:ss')} +
+ +
{item.message}
+
+
+ ))} +
+ ); + } +); +MonitorEventList.displayName = 'MonitorEventList'; diff --git a/src/client/components/monitor/MonitorList.tsx b/src/client/components/monitor/MonitorList.tsx index dd0dbaa..0f27e0c 100644 --- a/src/client/components/monitor/MonitorList.tsx +++ b/src/client/components/monitor/MonitorList.tsx @@ -1,10 +1,8 @@ -import { Card } from 'antd'; import clsx from 'clsx'; import React, { useMemo, useState } from 'react'; -import { useLocation, useNavigate, useParams } from 'react-router'; +import { useNavigate } from 'react-router'; import { trpc } from '../../api/trpc'; import { useCurrentWorkspaceId } from '../../store/user'; -import { HealthBar } from '../HealthBar'; import { NoWorkspaceTip } from '../NoWorkspaceTip'; import { MonitorHealthBar } from './MonitorHealthBar'; @@ -80,7 +78,6 @@ export const MonitorList: React.FC = React.memo(() => { upPercent === 100 ? 'bg-green-400' : 'bg-amber-400' )} > - {/* {monitor.monthOnlineRate * 100}% */} {upPercent}% diff --git a/src/client/pages/Monitor/Overview.tsx b/src/client/pages/Monitor/Overview.tsx index b9ed6b6..b735bd9 100644 --- a/src/client/pages/Monitor/Overview.tsx +++ b/src/client/pages/Monitor/Overview.tsx @@ -1,6 +1,33 @@ import React from 'react'; +import { useCurrentWorkspaceId } from '../../store/user'; +import { trpc } from '../../api/trpc'; +import { Card } from 'antd'; +import { MonitorEventList } from '../../components/monitor/MonitorEventList'; export const MonitorOverview: React.FC = React.memo(() => { - return
Overview
; + const currentWorkspaceId = useCurrentWorkspaceId()!; + const { data: monitors = [] } = trpc.monitor.all.useQuery({ + workspaceId: currentWorkspaceId, + }); + + return ( +
+
+ +
Monitors
+
{monitors.length}
+
+ +
Available
+
+ {monitors.filter((m) => m.active).length} +
+
+
+
+ +
+
+ ); }); MonitorOverview.displayName = 'MonitorOverview'; diff --git a/src/server/trpc/routers/monitor.ts b/src/server/trpc/routers/monitor.ts index 3cc3b53..f3b9398 100644 --- a/src/server/trpc/routers/monitor.ts +++ b/src/server/trpc/routers/monitor.ts @@ -193,4 +193,25 @@ export const monitorRouter = router({ recent30DayOfflineCount, }; }), + events: workspaceProcedure + .input( + z.object({ + monitorId: z.string().cuid2().optional(), + }) + ) + .query(async ({ input }) => { + const { monitorId } = input; + + const list = await prisma.monitorEvent.findMany({ + where: { + monitorId, + }, + orderBy: { + createdAt: 'desc', + }, + take: 20, + }); + + return list; + }), });