diff --git a/client/src/Hooks/useSettingsForm.ts b/client/src/Hooks/useSettingsForm.ts new file mode 100644 index 000000000..6abf386be --- /dev/null +++ b/client/src/Hooks/useSettingsForm.ts @@ -0,0 +1,35 @@ +import { useMemo } from "react"; +import { settingsSchema } from "@/Validation/settings"; +import type { Settings } from "@/Types/Settings"; +import type { SettingsFormData } from "@/Validation/settings"; + +interface UseSettingsFormOptions { + data?: Settings | null; +} +export const useSettingsForm = ({ data = null }: UseSettingsFormOptions = {}) => { + return useMemo(() => { + const defaults: SettingsFormData = { + systemEmailIgnoreTLS: data?.systemEmailIgnoreTLS || false, + systemEmailRequireTLS: data?.systemEmailRequireTLS || false, + systemEmailRejectUnauthorized: data?.systemEmailRejectUnauthorized || true, + systemEmailConnectionHost: data?.systemEmailConnectionHost || "", + systemEmailSecure: data?.systemEmailSecure || true, + systemEmailPool: data?.systemEmailPool || false, + showURL: data?.showURL || false, + //timezone: data?.timezone || "UTC", + language: data?.language || "en", + //chartType: data?.chartType || "histogram", + checkTTL: data?.checkTTL || 30, + pagespeedApiKey: data?.pagespeedApiKey || "", + systemEmailHost: data?.systemEmailHost || "", + systemEmailPort: data?.systemEmailPort || "", + systemEmailAddress: data?.systemEmailAddress || "", + systemEmailUser: data?.systemEmailUser || "", + systemEmailPassword: data?.systemEmailPassword || "", + + } + + + + } +} \ No newline at end of file diff --git a/client/src/Validation/settings.ts b/client/src/Validation/settings.ts new file mode 100644 index 000000000..99d0d826d --- /dev/null +++ b/client/src/Validation/settings.ts @@ -0,0 +1,37 @@ +import { z } from "zod"; + +export const settingsSchema = z.object({ + systemEmailIgnoreTLS: z.boolean(), + systemEmailRequireTLS: z.boolean(), + systemEmailRejectUnauthorized: z.boolean(), + systemEmailConnectionHost: z.string().optional().or(z.literal("")), + systemEmailSecure: z.boolean().optional(), + systemEmailPool: z.boolean().optional(), + showURL: z.boolean().optional(), + timezone: z.string().min(1, "Timezone is required").optional(), + mode: z.enum(["light", "dark"]).optional(), + language: z.string().min(2, "Language is required"), + chartType: z.enum(["histogram", "heatmap"]).optional(), + checkTTL: z.coerce.number().int().min(1, "Please enter a value"), + pagespeedApiKey: z.string().optional().or(z.literal("")), + systemEmailHost: z.string().optional().or(z.literal("")), + systemEmailPort: z.coerce.number().nullable().optional().or(z.literal("")), + systemEmailAddress: z + .email("Please enter a valid email address") + .transform((val) => val.toLowerCase().trim()) + .optional() + .or(z.literal("")), + systemEmailUser: z.string().optional().or(z.literal("")), + systemEmailPassword: z.string().optional().or(z.literal("")), + systemEmailTLSServername: z.string().optional().or(z.literal("")), + globalThresholds: z + .object({ + cpu: z.coerce.number().min(1).max(100).optional(), + memory: z.coerce.number().min(1).max(100).optional(), + disk: z.coerce.number().min(1).max(100).optional(), + temperature: z.coerce.number().min(1).max(150).optional(), + }) + .optional(), +}); + +export type SettingsFormData = z.infer;