import { useForm } from "@mantine/form"; import { zod4Resolver } from "mantine-form-zod-resolver"; import type { ZodDiscriminatedUnion, ZodIntersection, ZodObject, ZodPipe } from "zod/v4"; import { z } from "zod/v4"; import { useI18n } from "@homarr/translation/client"; import { zodErrorMap } from "@homarr/validation/form/i18n"; type inferPossibleSchema< TSchema extends | ZodObject | ZodPipe | ZodIntersection, ZodObject>, > = z.infer extends Record ? z.infer : never; export const useZodForm = < TSchema extends | ZodObject | ZodPipe | ZodIntersection, ZodObject>, >( schema: TSchema, options: Omit< Exclude>>[0], undefined>, "validate" | "validateInputOnBlur" | "validateInputOnChange" >, ) => { const t = useI18n(); z.config({ customError: zodErrorMap(t), }); return useForm>({ ...options, validateInputOnBlur: true, validateInputOnChange: true, validate: zod4Resolver(schema), }); };