diff --git a/client/src/hooks/forms/UseInitMaintenanceForm.tsx b/client/src/hooks/forms/UseInitMaintenanceForm.tsx index e82d99543..5e2baee03 100644 --- a/client/src/hooks/forms/UseInitMaintenanceForm.tsx +++ b/client/src/hooks/forms/UseInitMaintenanceForm.tsx @@ -1,14 +1,13 @@ -import { maintenanceSchema } from "@/validation/zod"; import { useMemo } from "react"; +import type { FormValues } from "@/pages/maintenance/MaintenanceForm"; -import { z } from "zod"; export const useInitForm = ({ initialData, }: { - initialData: Partial> | undefined; + initialData: Partial | undefined; }) => { return useMemo(() => { - const defaults: z.infer = { + const defaults: FormValues = { name: initialData?.name || "", repeat: initialData?.repeat || "no repeat", startTime: initialData?.startTime diff --git a/client/src/pages/maintenance/MaintenanceConfig.tsx b/client/src/pages/maintenance/MaintenanceConfig.tsx index a35f4a9fa..d4187533b 100644 --- a/client/src/pages/maintenance/MaintenanceConfig.tsx +++ b/client/src/pages/maintenance/MaintenanceConfig.tsx @@ -2,13 +2,10 @@ import { MaintenanceForm } from "@/pages/maintenance/MaintenanceForm"; 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 { maintenanceSchema } from "@/validation/zod"; import type { IMonitor } from "@/types/monitor"; - -type FormValues = z.infer; +import type { FormValues } from "@/pages/maintenance/MaintenanceForm"; const MaintenanceConfigPage = () => { const { id } = useParams<{ id: string }>(); diff --git a/client/src/pages/maintenance/MaintenanceCreate.tsx b/client/src/pages/maintenance/MaintenanceCreate.tsx index dee0c734d..9d754a490 100644 --- a/client/src/pages/maintenance/MaintenanceCreate.tsx +++ b/client/src/pages/maintenance/MaintenanceCreate.tsx @@ -1,14 +1,11 @@ import { MaintenanceForm } from "@/pages/maintenance/MaintenanceForm"; import { useNavigate } from "react-router"; -import { z } from "zod"; import { usePost, useGet } from "@/hooks/UseApi"; import type { ApiResponse } from "@/types/api"; -import { maintenanceSchema } from "@/validation/zod"; import type { IMonitor } from "@/types/monitor"; import type { IMaintenance } from "@/types/maintenance"; - -type FormValues = z.infer; +import type { FormValues } from "@/pages/maintenance/MaintenanceForm"; const MaintenanceCreatePage = () => { const navigate = useNavigate(); diff --git a/client/src/pages/maintenance/MaintenanceForm.tsx b/client/src/pages/maintenance/MaintenanceForm.tsx index 9edf6ff28..388deb925 100644 --- a/client/src/pages/maintenance/MaintenanceForm.tsx +++ b/client/src/pages/maintenance/MaintenanceForm.tsx @@ -12,13 +12,13 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { useTranslation } from "react-i18next"; import { z } from "zod"; import { MaintenanceRepeats } from "@/types/maintenance"; -import { maintenanceSchema } from "@/validation/zod"; +import { maintenanceSchema } from "@/validation"; import { useForm, Controller, type SubmitHandler } from "react-hook-form"; import { useEffect } from "react"; import { useInitForm } from "@/hooks/forms/UseInitMaintenanceForm"; import type { IMonitor } from "@/types/monitor"; -type FormValues = z.infer; +export type FormValues = z.infer; export const MaintenanceForm = ({ monitorOptions, diff --git a/client/src/pages/notification-channels/NotificationChannelsConfig.tsx b/client/src/pages/notification-channels/NotificationChannelsConfig.tsx index 7cb12d9c4..33eac8818 100644 --- a/client/src/pages/notification-channels/NotificationChannelsConfig.tsx +++ b/client/src/pages/notification-channels/NotificationChannelsConfig.tsx @@ -2,13 +2,10 @@ import { NotificationChannelsForm } from "./NotificationChannelsForm"; 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 { notificationChannelSchema } from "@/validation"; import type { INotificationChannel } from "@/types/notification-channel"; - -type FormValues = z.infer; +import type { FormValues } from "./NotificationChannelsForm"; const NotificationsChannelConfigPage = () => { const navigate = useNavigate(); diff --git a/client/src/pages/notification-channels/NotificationChannelsCreate.tsx b/client/src/pages/notification-channels/NotificationChannelsCreate.tsx index bbfc0c0cc..7137aa170 100644 --- a/client/src/pages/notification-channels/NotificationChannelsCreate.tsx +++ b/client/src/pages/notification-channels/NotificationChannelsCreate.tsx @@ -1,12 +1,9 @@ import { NotificationChannelsForm } from "./NotificationChannelsForm"; import { useNavigate } from "react-router"; -import { z } from "zod"; import { usePost } from "@/hooks/UseApi"; -import { notificationChannelSchema } from "@/validation"; import type { INotificationChannel } from "@/types/notification-channel"; - -type FormValues = z.infer; +import type { FormValues } from "./NotificationChannelsForm"; const NotificationsChannelCreatePage = () => { const { post, loading } = usePost(); diff --git a/client/src/pages/notification-channels/NotificationChannelsForm.tsx b/client/src/pages/notification-channels/NotificationChannelsForm.tsx index 155106b83..bfb1b0aab 100644 --- a/client/src/pages/notification-channels/NotificationChannelsForm.tsx +++ b/client/src/pages/notification-channels/NotificationChannelsForm.tsx @@ -17,7 +17,7 @@ import { useInitForm } from "@/hooks/forms/UseInitNotificationsChannelForm"; import { Typography } from "@mui/material"; import { useTheme } from "@mui/material/styles"; -type FormValues = z.infer; +export type FormValues = z.infer; export const NotificationChannelsForm = ({ initialData, diff --git a/client/src/validation/index.ts b/client/src/validation/index.ts index 156e7f5cb..dc36f74f2 100644 --- a/client/src/validation/index.ts +++ b/client/src/validation/index.ts @@ -6,3 +6,4 @@ export * from "./pagespeed"; export * from "./infra"; export * from "./utils"; export * from "./notification-channel"; +export * from "./maintenance"; diff --git a/client/src/validation/maintenance.ts b/client/src/validation/maintenance.ts new file mode 100644 index 000000000..edbe69103 --- /dev/null +++ b/client/src/validation/maintenance.ts @@ -0,0 +1,29 @@ +import { z } from "zod"; +import { MaintenanceRepeats } from "@/types/maintenance"; + +export const maintenanceSchema = z + .object({ + name: z.string().min(1, "Maintenance name is required"), + repeat: z.enum(MaintenanceRepeats), + startTime: z.date(), + endTime: z.date(), + monitors: z.array(z.string()), + }) + .superRefine((data, ctx) => { + if (data.endTime <= data.startTime) { + ctx.addIssue({ + code: "custom", + path: ["endTime"], + message: "End time must be after start time", + }); + } + + if (data.startTime === data.endTime) { + ctx.addIssue({ + code: "custom", + path: ["endTime"], + message: "Start time and end time cannot be the same", + }); + } + }); + diff --git a/client/src/validation/zod.ts b/client/src/validation/zod.ts index b2e0f17a2..3f1c87374 100644 --- a/client/src/validation/zod.ts +++ b/client/src/validation/zod.ts @@ -39,34 +39,6 @@ export const inviteSchema = z.object({ orgRoleId: z.string().optional(), }); -// moved to client/src/validation/notification-channel.ts - -export const maintenanceSchema = z - .object({ - name: z.string().min(1, "Maintenance name is required"), - repeat: z.enum(MaintenanceRepeats), - startTime: z.date(), - endTime: z.date(), - monitors: z.array(z.string()), - }) - .superRefine((data, ctx) => { - if (data.endTime <= data.startTime) { - ctx.addIssue({ - code: "custom", - path: ["endTime"], - message: "End time must be after start time", - }); - } - - if (data.startTime === data.endTime) { - ctx.addIssue({ - code: "custom", - path: ["endTime"], - message: "Start time and end time cannot be the same", - }); - } - }); - export const systemSettingsSchema = z.object({ systemEmailHost: optionalString( z.string().trim().min(1, { message: "SMTP host is required" }).max(255, {