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();