diff --git a/.changeset/dull-spies-refuse.md b/.changeset/dull-spies-refuse.md new file mode 100644 index 0000000..26cb982 --- /dev/null +++ b/.changeset/dull-spies-refuse.md @@ -0,0 +1,6 @@ +--- +'@makerx/forms-core': patch +'@makerx/forms-mui': patch +--- + +Fix bug where validation errors would only show after an externally triggered re-render diff --git a/packages/core/src/hooks/useFormFieldError.ts b/packages/core/src/hooks/useFormFieldError.ts new file mode 100644 index 0000000..1594ca9 --- /dev/null +++ b/packages/core/src/hooks/useFormFieldError.ts @@ -0,0 +1,9 @@ +import { useFormContext } from 'react-hook-form' +import type { FieldError } from 'react-hook-form/dist/types/errors' + +export const useFormFieldError = (field: string): FieldError | undefined => { + const { + formState: { errors }, + } = useFormContext() + return field.split('.').reduce((acc: any, cur) => acc?.[cur], errors) +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f2585bf..b30d920 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,4 +2,5 @@ export { z } from 'zod'; export { zfd } from 'zod-form-data'; export * from './components/ValidatedFormFactory'; export * from './hooks/useFieldMetadata'; +export * from './hooks/useFormFieldError'; export * from './util/FormFieldHelperBase'; diff --git a/packages/mui/src/components/form-item/FormItem.tsx b/packages/mui/src/components/form-item/FormItem.tsx index 9480558..b94b01f 100644 --- a/packages/mui/src/components/form-item/FormItem.tsx +++ b/packages/mui/src/components/form-item/FormItem.tsx @@ -1,4 +1,4 @@ -import { useFieldMetaData } from '@makerx/forms-core'; +import { useFieldMetaData, useFormFieldError } from '@makerx/forms-core'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; import { InputLabel, Tooltip, Typography } from '@mui/material'; import clsx from 'clsx'; @@ -30,9 +30,11 @@ export function FormItem< field, longHint, }: FormItemProps) { - const { getFieldState } = useFormContext(); + const { + formState: { errors }, + } = useFormContext(); const { required } = useFieldMetaData(field); - const { error } = getFieldState(field); + const error = useFormFieldError(field); const errorMessage = error?.message; return (
diff --git a/packages/mui/tsconfig.json b/packages/mui/tsconfig.json index 5b921c3..d70800d 100644 --- a/packages/mui/tsconfig.json +++ b/packages/mui/tsconfig.json @@ -18,5 +18,6 @@ "isolatedModules": true, "jsx": "react-jsx" }, - "include": ["src"] + "include": ["src"], + }