From 65970d3a2f52c26930c8c026a4becd3f7572ef2a Mon Sep 17 00:00:00 2001 From: Meierschlumpf Date: Sun, 11 Dec 2022 13:58:28 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8Add=20service=20ping?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dashboard/Tiles/Service/ServicePing.tsx | 64 +++++++++++++++++++ .../Dashboard/Tiles/Service/ServiceTile.tsx | 3 +- src/pages/api/modules/ping.ts | 3 + 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/components/Dashboard/Tiles/Service/ServicePing.tsx diff --git a/src/components/Dashboard/Tiles/Service/ServicePing.tsx b/src/components/Dashboard/Tiles/Service/ServicePing.tsx new file mode 100644 index 000000000..21460b0d9 --- /dev/null +++ b/src/components/Dashboard/Tiles/Service/ServicePing.tsx @@ -0,0 +1,64 @@ +import { Indicator, Tooltip } from '@mantine/core'; +import { useQuery } from '@tanstack/react-query'; +import { motion } from 'framer-motion'; +import { useTranslation } from 'next-i18next'; +import { useConfigContext } from '../../../../config/provider'; +import { ServiceType } from '../../../../types/service'; + +interface ServicePingProps { + service: ServiceType; +} + +export const ServicePing = ({ service }: ServicePingProps) => { + const { t } = useTranslation('modules/ping'); + const { config } = useConfigContext(); + const active = + (config?.settings.customization.layout.enabledPing && service.network.enabledStatusChecker) ?? + false; + const { data, isLoading } = useQuery({ + queryKey: [`ping/${service.id}`], + queryFn: async () => { + const response = await fetch(`/api/modules/ping?url=${encodeURI(service.url)}`); + const isOk = service.network.okStatus.includes(response.status); + return { + status: response.status, + state: isOk ? 'online' : 'down', + }; + }, + enabled: active, + }); + + const isOnline = data?.state === 'online'; + + if (!active) return null; + + return ( + + + + + + ); +}; + +type PingState = 'loading' | 'down' | 'online'; diff --git a/src/components/Dashboard/Tiles/Service/ServiceTile.tsx b/src/components/Dashboard/Tiles/Service/ServiceTile.tsx index ce71dd60f..7c1236868 100644 --- a/src/components/Dashboard/Tiles/Service/ServiceTile.tsx +++ b/src/components/Dashboard/Tiles/Service/ServiceTile.tsx @@ -6,6 +6,7 @@ import { useCardStyles } from '../../../layout/useCardStyles'; import { useEditModeStore } from '../../Views/useEditModeStore'; import { BaseTileProps } from '../type'; import { ServiceMenu } from './ServiceMenu'; +import { ServicePing } from './ServicePing'; interface ServiceTileProps extends BaseTileProps { service: ServiceType; @@ -58,7 +59,7 @@ export const ServiceTile = ({ className, service }: ServiceTileProps) => { {inner} )} - {/**/} + ); }; diff --git a/src/pages/api/modules/ping.ts b/src/pages/api/modules/ping.ts index 1ac40498b..3ed773ee2 100644 --- a/src/pages/api/modules/ping.ts +++ b/src/pages/api/modules/ping.ts @@ -10,6 +10,9 @@ async function Get(req: NextApiRequest, res: NextApiResponse) { const response = await ping.promise.probe(parsedUrl.hostname, { timeout: 1, }); + + console.log(response); + // Return 200 if the alive property is true if (response.alive) { return res.status(200).end();