160 lines
3.8 KiB
TypeScript
160 lines
3.8 KiB
TypeScript
import { useMemo } from "react";
|
|
import { monitorSchema, type MonitorFormData } from "@/Validation/monitor";
|
|
import { DefaultHttpMethod, DefaultPageSpeedStrategy } from "@/Types/Monitor";
|
|
import type { Monitor, MonitorType } from "@/Types/Monitor";
|
|
|
|
interface UseMonitorFormOptions {
|
|
data?: Monitor | null;
|
|
defaultType?: MonitorType;
|
|
}
|
|
|
|
const getBaseDefaults = (data?: Monitor | null) => ({
|
|
name: data?.name || "",
|
|
description: data?.description || "",
|
|
interval: data?.interval || 60000,
|
|
notifications: data?.notifications || [],
|
|
tags: data?.tags || [],
|
|
statusWindowSize: data?.statusWindowSize || 5,
|
|
statusWindowThreshold: data?.statusWindowThreshold || 60,
|
|
});
|
|
|
|
// Geo-check defaults — only http and ping support geo checks.
|
|
const getGeoCheckDefaults = (data?: Monitor | null) => ({
|
|
geoCheckEnabled: data?.geoCheckEnabled ?? false,
|
|
geoCheckLocations: data?.geoCheckLocations || [],
|
|
geoCheckInterval: data?.geoCheckInterval || 300000,
|
|
});
|
|
|
|
export const getMonitorDefaults = (
|
|
type: MonitorType,
|
|
data: Monitor | null = null
|
|
): MonitorFormData => {
|
|
const base = getBaseDefaults(data);
|
|
|
|
let defaults: MonitorFormData;
|
|
|
|
switch (type) {
|
|
case "http":
|
|
defaults = {
|
|
...base,
|
|
...getGeoCheckDefaults(data),
|
|
type: "http",
|
|
url: data?.url || "",
|
|
method: data?.method ?? DefaultHttpMethod,
|
|
ignoreTlsErrors: data?.ignoreTlsErrors || false,
|
|
useAdvancedMatching: data?.useAdvancedMatching || false,
|
|
matchMethod: data?.matchMethod || "",
|
|
expectedValue: data?.expectedValue || "",
|
|
jsonPath: data?.jsonPath || "",
|
|
customUpCodes: data?.customUpCodes || [],
|
|
};
|
|
break;
|
|
case "ping":
|
|
defaults = {
|
|
...base,
|
|
...getGeoCheckDefaults(data),
|
|
type: "ping",
|
|
url: data?.url || "",
|
|
};
|
|
break;
|
|
case "port":
|
|
defaults = {
|
|
...base,
|
|
type: "port",
|
|
url: data?.url || "",
|
|
port: data?.port || 80,
|
|
};
|
|
break;
|
|
case "docker":
|
|
defaults = {
|
|
...base,
|
|
type: "docker",
|
|
url: data?.url || "",
|
|
};
|
|
break;
|
|
case "game":
|
|
defaults = {
|
|
...base,
|
|
type: "game",
|
|
url: data?.url || "",
|
|
port: data?.port || 27015,
|
|
gameId: data?.gameId || "",
|
|
};
|
|
break;
|
|
case "grpc":
|
|
defaults = {
|
|
...base,
|
|
type: "grpc",
|
|
url: data?.url || "",
|
|
port: data?.port || 50051,
|
|
grpcServiceName: data?.grpcServiceName || "",
|
|
ignoreTlsErrors: data?.ignoreTlsErrors || false,
|
|
};
|
|
break;
|
|
case "pagespeed":
|
|
defaults = {
|
|
...base,
|
|
type: "pagespeed",
|
|
url: data?.url || "",
|
|
strategy: data?.strategy ?? DefaultPageSpeedStrategy,
|
|
};
|
|
break;
|
|
case "hardware":
|
|
defaults = {
|
|
...base,
|
|
type: "hardware",
|
|
url: data?.url || "",
|
|
secret: data?.secret || "",
|
|
cpuAlertThreshold: data?.cpuAlertThreshold ?? 100,
|
|
memoryAlertThreshold: data?.memoryAlertThreshold ?? 100,
|
|
diskAlertThreshold: data?.diskAlertThreshold ?? 100,
|
|
tempAlertThreshold: data?.tempAlertThreshold ?? 100,
|
|
selectedDisks: data?.selectedDisks || [],
|
|
};
|
|
break;
|
|
case "websocket":
|
|
defaults = {
|
|
...base,
|
|
type: "websocket",
|
|
url: data?.url || "",
|
|
ignoreTlsErrors: data?.ignoreTlsErrors || false,
|
|
};
|
|
break;
|
|
case "dns":
|
|
defaults = {
|
|
...base,
|
|
type: "dns",
|
|
url: data?.url || "",
|
|
dnsServer: data?.dnsServer || "",
|
|
dnsRecordType: data?.dnsRecordType || "A",
|
|
};
|
|
break;
|
|
default:
|
|
defaults = {
|
|
...base,
|
|
...getGeoCheckDefaults(data),
|
|
type: "http",
|
|
url: "",
|
|
method: DefaultHttpMethod,
|
|
ignoreTlsErrors: false,
|
|
useAdvancedMatching: false,
|
|
matchMethod: "",
|
|
expectedValue: "",
|
|
jsonPath: "",
|
|
customUpCodes: [],
|
|
};
|
|
}
|
|
|
|
return defaults;
|
|
};
|
|
|
|
export const useMonitorForm = ({
|
|
data = null,
|
|
defaultType = "http",
|
|
}: UseMonitorFormOptions = {}) => {
|
|
return useMemo(() => {
|
|
const type = data?.type || defaultType;
|
|
return { schema: monitorSchema, defaults: getMonitorDefaults(type, data) };
|
|
}, [data, defaultType]);
|
|
};
|