From 6dcfb67246b246efdbae21fe3d4c8809dc49467d Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sun, 28 Dec 2025 19:49:36 +0000 Subject: [PATCH] status page --- client/src/hooks/forms/UseInitStatusPageForm.tsx | 8 +++----- client/src/pages/status-page/StatusPageConfig.tsx | 5 +---- client/src/pages/status-page/StatusPageCreate.tsx | 5 +---- client/src/pages/status-page/StatusPageForm.tsx | 4 ++-- client/src/validation/index.ts | 1 + client/src/validation/status-page.ts | 14 ++++++++++++++ client/src/validation/zod.ts | 13 ------------- 7 files changed, 22 insertions(+), 28 deletions(-) create mode 100644 client/src/validation/status-page.ts diff --git a/client/src/hooks/forms/UseInitStatusPageForm.tsx b/client/src/hooks/forms/UseInitStatusPageForm.tsx index 1a258ee0c..bb7a421a2 100644 --- a/client/src/hooks/forms/UseInitStatusPageForm.tsx +++ b/client/src/hooks/forms/UseInitStatusPageForm.tsx @@ -1,14 +1,12 @@ -import { statusPageSchema } from "@/validation/zod"; import { useMemo } from "react"; - -import { z } from "zod"; +import type { FormValues } from "@/pages/status-page/StatusPageForm"; export const useInitForm = ({ initialData, }: { - initialData: Partial> | undefined; + initialData: Partial | undefined; }) => { return useMemo(() => { - const defaults: z.infer = { + const defaults: FormValues = { name: initialData?.name || "", description: initialData?.description || "", url: initialData?.url || Math.floor(Math.random() * 1000000).toFixed(0), diff --git a/client/src/pages/status-page/StatusPageConfig.tsx b/client/src/pages/status-page/StatusPageConfig.tsx index 8b7b3af59..4ca29a775 100644 --- a/client/src/pages/status-page/StatusPageConfig.tsx +++ b/client/src/pages/status-page/StatusPageConfig.tsx @@ -2,14 +2,11 @@ import { StatusPageForm } from "@/pages/status-page/StatusPageForm"; import { useParams } from "react-router"; import { useNavigate } from "react-router"; -import { z } from "zod"; import { usePatch, useGet } from "@/hooks/UseApi"; import type { ApiResponse } from "@/types/api"; -import { statusPageSchema } from "@/validation/zod"; import type { IMonitor } from "@/types/monitor"; import type { IStatusPageWithMonitors } from "@/types/status-page"; - -type FormValues = z.infer; +import type { FormValues } from "@/pages/status-page/StatusPageForm"; const StatusPageConfigPage = () => { const navigate = useNavigate(); diff --git a/client/src/pages/status-page/StatusPageCreate.tsx b/client/src/pages/status-page/StatusPageCreate.tsx index 8ebbeeae3..600de764e 100644 --- a/client/src/pages/status-page/StatusPageCreate.tsx +++ b/client/src/pages/status-page/StatusPageCreate.tsx @@ -1,13 +1,10 @@ import { StatusPageForm } from "@/pages/status-page/StatusPageForm"; import { useNavigate } from "react-router"; -import { z } from "zod"; import { usePost, useGet } from "@/hooks/UseApi"; import type { ApiResponse } from "@/types/api"; -import { statusPageSchema } from "@/validation/zod"; import type { IMonitor } from "@/types/monitor"; - -type FormValues = z.infer; +import type { FormValues } from "@/pages/status-page/StatusPageForm"; const StatusPageCreatePage = () => { const navigate = useNavigate(); diff --git a/client/src/pages/status-page/StatusPageForm.tsx b/client/src/pages/status-page/StatusPageForm.tsx index 9ec694222..64b2f9534 100644 --- a/client/src/pages/status-page/StatusPageForm.tsx +++ b/client/src/pages/status-page/StatusPageForm.tsx @@ -9,7 +9,7 @@ import { useTheme } from "@mui/material/styles"; import { zodResolver } from "@hookform/resolvers/zod"; import { useTranslation } from "react-i18next"; import { z } from "zod"; -import { statusPageSchema } from "@/validation/zod"; +import { statusPageSchema } from "@/validation"; import { useForm, Controller, @@ -20,7 +20,7 @@ import { useEffect } from "react"; import { useInitForm } from "@/hooks/forms/UseInitStatusPageForm"; import type { IMonitor } from "@/types/monitor"; -type FormValues = z.infer; +export type FormValues = z.infer; export const StatusPageForm = ({ initialData, diff --git a/client/src/validation/index.ts b/client/src/validation/index.ts index 5644732eb..2116edbe2 100644 --- a/client/src/validation/index.ts +++ b/client/src/validation/index.ts @@ -9,3 +9,4 @@ export * from "./notification-channel"; export * from "./maintenance"; export * from "./team"; export * from "./system-settings"; +export * from "./status-page"; diff --git a/client/src/validation/status-page.ts b/client/src/validation/status-page.ts new file mode 100644 index 000000000..14e0cd2f1 --- /dev/null +++ b/client/src/validation/status-page.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; + +const statusPageUrlRegex = /^[A-Za-z0-9]+$/; + +export const statusPageSchema = z.object({ + name: z.string().min(1, "Status page name is required"), + description: z.string().optional(), + url: z + .string() + .min(1, "URL is required") + .regex(statusPageUrlRegex, "Invalid URL"), + isPublished: z.boolean().optional(), + monitors: z.array(z.string()), +}); diff --git a/client/src/validation/zod.ts b/client/src/validation/zod.ts index b9198315b..6246fc94c 100644 --- a/client/src/validation/zod.ts +++ b/client/src/validation/zod.ts @@ -7,19 +7,6 @@ export const inviteSchema = z.object({ orgRoleId: z.string().optional(), }); -const statusPageUrlRegex = /^[A-Za-z0-9]+$/; - -export const statusPageSchema = z.object({ - name: z.string().min(1, "Status page name is required"), - description: z.string().optional(), - url: z - .string() - .min(1, "URL is required") - .regex(statusPageUrlRegex, "Invalid URL"), - isPublished: z.boolean().optional(), - monitors: z.array(z.string()), -}); - export const recoverySchema = z.object({ email: z.email({ message: "Invalid email address" }).trim().toLowerCase(), });