@graphcommerce/react-hook-form 10.0.0-canary.68 → 10.0.0-canary.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Change Log
2
2
 
3
+ ## 10.0.0-canary.72
4
+
5
+ ## 10.0.0-canary.71
6
+
7
+ ## 10.0.0-canary.70
8
+
9
+ ### Major Changes
10
+
11
+ - [#2565](https://github.com/graphcommerce-org/graphcommerce/pull/2565) [`c96dfcd`](https://github.com/graphcommerce-org/graphcommerce/commit/c96dfcdca981baca387c270ad9e2b9515cdd00cc) - Updated to Apollo Client 4 ([@paales](https://github.com/paales))
12
+
13
+ ## 10.0.0-canary.69
14
+
15
+ ### Patch Changes
16
+
17
+ - [#2567](https://github.com/graphcommerce-org/graphcommerce/pull/2567) [`41f9619`](https://github.com/graphcommerce-org/graphcommerce/commit/41f96194a5740465663d8f8e5ee1c10af0365748) - Fix issue where FormAutoSubmit would not listen for changes when no field names were provided (meaning it should watch changes on all fields) ([@paales](https://github.com/paales))
18
+
3
19
  ## 10.0.0-canary.68
4
20
 
5
21
  ## 10.0.0-canary.67
package/index.ts CHANGED
@@ -5,9 +5,7 @@ export * from './src/useFormAutoSubmit'
5
5
  export * from './src/useFormGql'
6
6
  export * from './src/useFormGqlMutation'
7
7
  export * from './src/useFormGqlQuery'
8
- export * from './src/useFormMuiRegister'
9
8
  export * from './src/useFormPersist'
10
- export * from './src/useFormValidFields'
11
9
  export * from './src/utils/tryTuple'
12
10
  export * from './src/utils/useDebounce'
13
11
  export * from './src/validationPatterns'
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@graphcommerce/react-hook-form",
3
3
  "homepage": "https://www.graphcommerce.org/",
4
4
  "repository": "github:graphcommerce-org/graphcommerce",
5
- "version": "10.0.0-canary.68",
5
+ "version": "10.0.0-canary.72",
6
6
  "sideEffects": false,
7
7
  "prettier": "@graphcommerce/prettier-config-pwa",
8
8
  "eslintConfig": {
@@ -13,9 +13,9 @@
13
13
  },
14
14
  "peerDependencies": {
15
15
  "@apollo/client": "*",
16
- "@graphcommerce/eslint-config-pwa": "^10.0.0-canary.68",
17
- "@graphcommerce/prettier-config-pwa": "^10.0.0-canary.68",
18
- "@graphcommerce/typescript-config-pwa": "^10.0.0-canary.68",
16
+ "@graphcommerce/eslint-config-pwa": "^10.0.0-canary.72",
17
+ "@graphcommerce/prettier-config-pwa": "^10.0.0-canary.72",
18
+ "@graphcommerce/typescript-config-pwa": "^10.0.0-canary.72",
19
19
  "@mui/utils": "^7.0.0",
20
20
  "graphql": "^16.6.0",
21
21
  "react": "^19.2.0",
@@ -1,5 +1,7 @@
1
- import { ApolloError } from '@apollo/client'
2
- import React, { useContext, useEffect, useRef } from 'react'
1
+ import type { ErrorLike } from '@apollo/client'
2
+ import { CombinedGraphQLErrors } from '@apollo/client/errors'
3
+ import type React from 'react'
4
+ import { useContext, useEffect, useRef } from 'react'
3
5
  import { isFormGqlOperation } from '../useFormGqlMutation'
4
6
  import { composedFormContext } from './context'
5
7
  import type { ComposedSubmitRenderComponentProps } from './types'
@@ -9,13 +11,29 @@ export type ComposedSubmitProps = {
9
11
  render: React.FC<ComposedSubmitRenderComponentProps>
10
12
  }
11
13
 
12
- export function mergeErrors(errors: ApolloError[]): ApolloError | undefined {
14
+ export function mergeErrors(errors: ErrorLike[]): ErrorLike | undefined {
13
15
  if (!errors.length) return undefined
14
- return new ApolloError({
15
- errorMessage: 'Composed submit error',
16
- networkError: errors.find((error) => error.networkError)?.networkError,
17
- graphQLErrors: errors.map((error) => error.graphQLErrors ?? []).flat(1),
18
- })
16
+
17
+ // Collect all GraphQL errors from CombinedGraphQLErrors instances
18
+ const graphQLErrors = errors.flatMap((error) =>
19
+ CombinedGraphQLErrors.is(error) ? error.errors : [],
20
+ )
21
+
22
+ // Collect non-GraphQL errors (network errors, etc.)
23
+ const nonGraphQLErrors = errors.filter((error) => !CombinedGraphQLErrors.is(error))
24
+
25
+ // If we have GraphQL errors, return a CombinedGraphQLErrors
26
+ // Include non-GraphQL error messages as additional GraphQL errors to avoid losing them
27
+ if (graphQLErrors.length > 0) {
28
+ const allErrors = [
29
+ ...graphQLErrors,
30
+ ...nonGraphQLErrors.map((error) => ({ message: error.message })),
31
+ ]
32
+ return new CombinedGraphQLErrors({ errors: allErrors })
33
+ }
34
+
35
+ // If we only have non-GraphQL errors, return the first one
36
+ return nonGraphQLErrors[0]
19
37
  }
20
38
 
21
39
  export function ComposedSubmit(props: ComposedSubmitProps) {
@@ -118,7 +136,7 @@ export function ComposedSubmit(props: ComposedSubmitProps) {
118
136
  }
119
137
  }
120
138
 
121
- const errors: ApolloError[] = []
139
+ const errors: ErrorLike[] = []
122
140
 
123
141
  formEntries.forEach(([, { form }]) => {
124
142
  if (form && isFormGqlOperation(form) && form.error) errors.push(form.error)
@@ -1,4 +1,4 @@
1
- import type { ApolloError } from '@apollo/client'
1
+ import type { ErrorLike } from '@apollo/client'
2
2
  import type { FieldValues, FormState, UseFormHandleSubmit, UseFormTrigger } from 'react-hook-form'
3
3
  import type { SetOptional } from 'type-fest'
4
4
 
@@ -40,7 +40,7 @@ export type ButtonState = {
40
40
  export type ComposedSubmitRenderComponentProps = {
41
41
  submit: () => Promise<void>
42
42
  buttonState: ButtonState
43
- error?: ApolloError
43
+ error?: ErrorLike
44
44
  }
45
45
 
46
46
  export type ComposedFormState = {
@@ -51,7 +51,7 @@ export type ComposedFormState = {
51
51
  buttonState: ButtonState
52
52
  formState: FormStateAll
53
53
  submitted: boolean
54
- error?: ApolloError
54
+ error?: ErrorLike
55
55
  }
56
56
 
57
57
  /** Register a new form with the useFormCompose hook */
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable react/no-unused-prop-types */
2
2
  // eslint-disable-next-line import/no-extraneous-dependencies
3
3
  import { useMemoObject } from '@graphcommerce/next-ui/hooks/useMemoObject'
4
- import { cloneDeep } from '@apollo/client/utilities'
4
+ import { cloneDeep } from '@apollo/client/utilities/internal'
5
5
  // eslint-disable-next-line import/no-extraneous-dependencies
6
6
  import { debounce } from '@mui/material'
7
7
  import React, { useCallback, useEffect, useRef, useState } from 'react'
@@ -143,12 +143,19 @@ function useAutoSubmitBase<TFieldValues extends FieldValues = FieldValues>(
143
143
  submit,
144
144
  parallel,
145
145
  noValidate,
146
- name = [],
146
+ name,
147
147
  ...watchOptions
148
148
  } = props
149
149
 
150
150
  // We create a stable object from the values, so that we can compare them later
151
- const values = useMemoObject(cloneDeep(useWatch({ ...watchOptions, name })))
151
+ const values = useMemoObject(
152
+ cloneDeep(
153
+ useWatch({
154
+ ...watchOptions,
155
+ name: name as Path<TFieldValues>[],
156
+ }),
157
+ ),
158
+ )
152
159
  const oldValues = useRef<PathValue<TFieldValues, Path<TFieldValues>>[]>(values)
153
160
  const { isValidating, isSubmitting, isValid } = useFormState(watchOptions)
154
161
 
@@ -1,14 +1,7 @@
1
- import type {
2
- FetchResult,
3
- LazyQueryHookOptions,
4
- LazyQueryResultTuple,
5
- MaybeMasked,
6
- MutationHookOptions,
7
- MutationTuple,
8
- TypedDocumentNode,
9
- } from '@apollo/client'
10
- import { ApolloError, isApolloError } from '@apollo/client'
11
- import { getOperationName } from '@apollo/client/utilities'
1
+ import { getOperationName } from '@graphcommerce/graphql/apollo'
2
+ import type { ApolloLink, ErrorLike, MaybeMasked, TypedDocumentNode } from '@apollo/client'
3
+ import { CombinedGraphQLErrors } from '@apollo/client/errors'
4
+ import type { useLazyQuery, useMutation } from '@apollo/client/react'
12
5
  import useEventCallback from '@mui/utils/useEventCallback'
13
6
  import { useEffect, useRef } from 'react'
14
7
  import type { DefaultValues, FieldValues, UseFormProps, UseFormReturn } from 'react-hook-form'
@@ -23,16 +16,16 @@ type UseFormGraphQLCallbacks<Q, V extends FieldValues> = {
23
16
  * Mutation.
24
17
  *
25
18
  * When returning false, it will SKIP the submission. When an Error is thrown, it will be set as
26
- * an ApolloError.
19
+ * an error.
27
20
  */
28
21
  onBeforeSubmit?: (variables: V, form?: UseFormReturn<V>) => V | false | Promise<V | false>
29
22
  /**
30
23
  * Called after the mutation has been executed. Allows you to handle the result of the mutation.
31
24
  *
32
- * When an error is thrown, it will be set as an ApolloError
25
+ * When an error is thrown, it will be set as an error
33
26
  */
34
27
  onComplete?: (
35
- result: FetchResult<MaybeMasked<Q>>,
28
+ result: ApolloLink.Result<MaybeMasked<Q>>,
36
29
  variables: V,
37
30
  form?: UseFormReturn<V>,
38
31
  ) => void | Promise<void>
@@ -60,7 +53,7 @@ type UseFormGraphQLCallbacks<Q, V extends FieldValues> = {
60
53
  * const result = mutate() // executes the mutation and automatically sets generic errors with setError('root')
61
54
  * // onComplete: now simply use the result after the form, to for example reset the form, or do other things.
62
55
  * })
63
- * ```
56
+ * ```
64
57
  */
65
58
  experimental_useV2?: boolean
66
59
  /**
@@ -82,14 +75,17 @@ type UseFormGraphQLCallbacks<Q, V extends FieldValues> = {
82
75
  export type UseFormGraphQlOptions<Q, V extends FieldValues> = UseFormProps<V> &
83
76
  UseFormGraphQLCallbacks<Q, V>
84
77
 
78
+ export const UseFormGqlSymbol = Symbol('UseFormGql')
79
+
85
80
  export type UseFormGqlMethods<Q, V extends FieldValues> = Omit<
86
81
  UseGqlDocumentHandler<V>,
87
82
  'encode' | 'type'
88
83
  > &
89
84
  Pick<UseFormReturn<V>, 'handleSubmit'> & {
90
85
  data?: MaybeMasked<Q> | null
91
- error?: ApolloError | null
86
+ error?: ErrorLike | null
92
87
  submittedVariables?: V | null
88
+ [UseFormGqlSymbol]: true
93
89
  }
94
90
 
95
91
  /**
@@ -104,10 +100,12 @@ export function useFormGql<Q, V extends FieldValues>(
104
100
  options: {
105
101
  document: TypedDocumentNode<Q, V>
106
102
  form: UseFormReturn<V>
107
- tuple: MutationTuple<Q, V> | LazyQueryResultTuple<Q, V>
103
+ tuple:
104
+ | useMutation.ResultTuple<Q, V>
105
+ | useLazyQuery.ResultTuple<Q, V, 'streaming' | 'complete' | 'empty'>
108
106
  operationOptions?:
109
- | Omit<MutationHookOptions<Q, V>, 'fetchPolicy' | 'variables'>
110
- | Omit<LazyQueryHookOptions<Q, V>, 'fetchPolicy' | 'variables'>
107
+ | Omit<useMutation.Options<Q, V>, 'fetchPolicy' | 'variables'>
108
+ | Omit<useLazyQuery.Options<Q, V>, 'fetchPolicy' | 'variables'>
111
109
  defaultValues?: UseFormProps<V>['defaultValues']
112
110
  skipUnchanged?: boolean
113
111
  } & UseFormGraphQLCallbacks<Q, V>,
@@ -127,7 +125,7 @@ export function useFormGql<Q, V extends FieldValues>(
127
125
  const [execute, { data, error, loading }] = tuple
128
126
 
129
127
  const submittedVariables = useRef<V | null>(null)
130
- const returnedError = useRef<ApolloError | null>(null)
128
+ const returnedError = useRef<ErrorLike | null>(null)
131
129
 
132
130
  // automatically updates the default values
133
131
  const initital = useRef(true)
@@ -175,16 +173,17 @@ export function useFormGql<Q, V extends FieldValues>(
175
173
  // Wait for the onBeforeSubmit to complete
176
174
  const [onBeforeSubmitResult, onBeforeSubmitError] = await beforeSubmit(variables, form)
177
175
  if (onBeforeSubmitError) {
178
- if (isApolloError(onBeforeSubmitError)) {
176
+ // Check if it's a GraphQL error or a regular error
177
+ if (CombinedGraphQLErrors.is(onBeforeSubmitError)) {
179
178
  returnedError.current = onBeforeSubmitError
180
179
  form.setError('root', { message: onBeforeSubmitError.message })
181
180
  } else {
182
181
  const message =
183
182
  process.env.NODE_ENV === 'development'
184
- ? `A non ApolloError was thrown during the onBeforeSubmit handler: ${onBeforeSubmitError.message}`
183
+ ? `An error was thrown during the onBeforeSubmit handler: ${onBeforeSubmitError.message}`
185
184
  : 'An unexpected error occurred, please contact the store owner'
186
185
  form.setError('root', { message })
187
- returnedError.current = new ApolloError({ graphQLErrors: [{ message }] })
186
+ returnedError.current = new CombinedGraphQLErrors({ errors: [{ message }] })
188
187
  }
189
188
  return
190
189
  }
@@ -201,32 +200,39 @@ export function useFormGql<Q, V extends FieldValues>(
201
200
  ...operationOptions,
202
201
  variables,
203
202
  context: {
204
- ...operationOptions?.context,
203
+ ...(operationOptions as { context?: Record<string, unknown> } | undefined)?.context,
205
204
  fetchOptions: {
206
- ...operationOptions?.context?.fetchOptions,
205
+ ...(
206
+ operationOptions as
207
+ | { context?: { fetchOptions?: Record<string, unknown> } }
208
+ | undefined
209
+ )?.context?.fetchOptions,
207
210
  signal: controllerRef.current.signal,
208
211
  },
209
212
  },
210
213
  })
211
214
 
212
215
  // If there are submission errors, set the error and return
213
- if (result.errors && result.errors.length > 0) {
214
- form.setError('root', { message: result.errors.map((e) => e.message).join(', ') })
216
+ if (result.error) {
217
+ const errorMessage = CombinedGraphQLErrors.is(result.error)
218
+ ? result.error.errors.map((e) => e.message).join(', ')
219
+ : result.error.message
220
+ form.setError('root', { message: errorMessage })
215
221
  return
216
222
  }
217
223
 
218
224
  const [, onCompleteError] = await complete(result, variables, form)
219
225
  if (onCompleteError) {
220
- if (isApolloError(onCompleteError)) {
226
+ if (CombinedGraphQLErrors.is(onCompleteError)) {
221
227
  returnedError.current = onCompleteError
222
228
  form.setError('root', { message: onCompleteError.message })
223
229
  } else {
224
230
  const message =
225
231
  process.env.NODE_ENV === 'development'
226
- ? `A non ApolloError was thrown during the onComplete handler: ${onCompleteError.message}`
232
+ ? `An error was thrown during the onComplete handler: ${onCompleteError.message}`
227
233
  : 'An unexpected error occurred, please contact the store owner'
228
234
  form.setError('root', { message })
229
- returnedError.current = new ApolloError({ graphQLErrors: [{ message }] })
235
+ returnedError.current = new CombinedGraphQLErrors({ errors: [{ message }] })
230
236
  }
231
237
  return
232
238
  }
@@ -244,5 +250,6 @@ export function useFormGql<Q, V extends FieldValues>(
244
250
  data,
245
251
  error: returnedError.current ?? error,
246
252
  submittedVariables: submittedVariables.current,
253
+ [UseFormGqlSymbol]: true,
247
254
  }
248
255
  }
@@ -1,52 +1,42 @@
1
- import type { MutationHookOptions, TypedDocumentNode } from '@apollo/client'
2
- import { useMutation } from '@apollo/client'
1
+ import type { TypedDocumentNode } from '@apollo/client'
2
+ import type { useMutation } from '@apollo/client/react'
3
+ import { useMutation as useMutationHook } from '@apollo/client/react'
3
4
  import type { FieldValues, UseFormReturn } from 'react-hook-form'
4
5
  import { useForm } from 'react-hook-form'
5
6
  import type { UseFormGqlMethods, UseFormGraphQlOptions } from './useFormGql'
6
- import { useFormGql } from './useFormGql'
7
- import type { UseMuiFormRegister } from './useFormMuiRegister'
8
- import { useFormMuiRegister } from './useFormMuiRegister'
9
- import type { UseFormValidReturn } from './useFormValidFields'
7
+ import { useFormGql, UseFormGqlSymbol } from './useFormGql'
10
8
 
11
9
  export type UseFormGqlMutationReturn<
12
10
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
11
  Q extends Record<string, any> = Record<string, any>,
14
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
12
  V extends FieldValues = FieldValues,
16
- > = UseFormGqlMethods<Q, V> &
17
- UseFormReturn<V> & {
18
- /** @deprecated Please use TextFieldElement */
19
- muiRegister: UseMuiFormRegister<V>
20
- /** @deprecated Please use TextFieldElement showValid */
21
- valid: UseFormValidReturn<V>
22
- }
13
+ > = Omit<UseFormReturn<V>, 'handleSubmit'> & UseFormGqlMethods<Q, V>
23
14
 
24
15
  export function isFormGqlOperation<
25
16
  V extends FieldValues,
26
17
  Q extends Record<string, unknown> = Record<string, unknown>,
27
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-redundant-type-constituents
28
19
  >(form: any): form is UseFormGqlMutationReturn<Q, V> {
29
- return typeof (form as UseFormGqlMutationReturn<Q, V>).submittedVariables !== 'undefined'
20
+ return (form as UseFormGqlMutationReturn<Q, V>)[UseFormGqlSymbol] === true
30
21
  }
31
22
 
32
23
  export function assertFormGqlOperation<
33
24
  V extends FieldValues,
34
25
  Q extends Record<string, unknown> = Record<string, unknown>,
35
26
  >(form: UseFormReturn<V>): asserts form is UseFormGqlMutationReturn<Q, V> {
36
- if (typeof (form as UseFormGqlMutationReturn<Q, V>).muiRegister !== 'function') {
27
+ if (!isFormGqlOperation(form))
37
28
  throw Error("form must be one of 'useFromGqlMutation' or 'useFormGqlQuery'")
38
- }
39
29
  }
40
30
 
41
31
  /** Bindings between react-hook-form's useForm and Apollo Client's useMutation hook. */
42
32
  export function useFormGqlMutation<Q extends Record<string, unknown>, V extends FieldValues>(
43
33
  document: TypedDocumentNode<Q, V>,
44
34
  options: NoInfer<UseFormGraphQlOptions<Q, V>> = {},
45
- operationOptions?: MutationHookOptions<Q, V>,
35
+ operationOptions?: useMutation.Options<NoInfer<Q>, NoInfer<V>>,
46
36
  ): UseFormGqlMutationReturn<Q, V> {
47
37
  const form = useForm<V>(options)
48
- const tuple = useMutation(document, operationOptions)
38
+ const tuple = useMutationHook<Q, V>(document, operationOptions as useMutation.Options<Q, V>)
49
39
  const operation = useFormGql({ document, form, tuple, operationOptions, ...options })
50
- const muiRegister = useFormMuiRegister(form)
51
- return { ...form, ...operation, muiRegister, valid: {} }
40
+ // operation.handleSubmit overrides form.handleSubmit
41
+ return { ...form, ...operation } as unknown as UseFormGqlMutationReturn<Q, V>
52
42
  }
@@ -1,11 +1,11 @@
1
- import type { LazyQueryHookOptions, TypedDocumentNode } from '@apollo/client'
2
- import { useLazyQuery } from '@apollo/client'
1
+ import type { TypedDocumentNode } from '@apollo/client'
2
+ import type { useLazyQuery } from '@apollo/client/react'
3
+ import { useLazyQuery as useLazyQueryHook } from '@apollo/client/react'
3
4
  import type { FieldValues } from 'react-hook-form'
4
5
  import { useForm } from 'react-hook-form'
5
6
  import type { UseFormGraphQlOptions } from './useFormGql'
6
7
  import { useFormGql } from './useFormGql'
7
- import type { UseFormGqlMutationReturn } from './useFormGqlMutation'
8
- import { useFormMuiRegister } from './useFormMuiRegister'
8
+ import { type UseFormGqlMutationReturn } from './useFormGqlMutation'
9
9
 
10
10
  export type UseFormGqlQueryReturn<
11
11
  Q extends Record<string, unknown>,
@@ -15,12 +15,10 @@ export type UseFormGqlQueryReturn<
15
15
  export function useFormGqlQuery<Q extends Record<string, unknown>, V extends FieldValues>(
16
16
  document: TypedDocumentNode<Q, V>,
17
17
  options: UseFormGraphQlOptions<Q, V> = {},
18
- operationOptions?: LazyQueryHookOptions<Q, V>,
18
+ operationOptions?: useLazyQuery.Options<Q, V>,
19
19
  ): UseFormGqlQueryReturn<Q, V> {
20
20
  const form = useForm<V>(options)
21
- const tuple = useLazyQuery(document, operationOptions)
21
+ const tuple = useLazyQueryHook(document, { ...operationOptions })
22
22
  const operation = useFormGql({ document, form, tuple, operationOptions, ...options })
23
- const muiRegister = useFormMuiRegister(form)
24
-
25
- return { ...form, ...operation, valid: {}, muiRegister }
23
+ return { ...form, ...operation }
26
24
  }
@@ -1,25 +0,0 @@
1
- import type {
2
- FieldPath,
3
- FieldValues,
4
- RegisterOptions,
5
- UseFormRegisterReturn,
6
- UseFormReturn,
7
- } from 'react-hook-form'
8
-
9
- export type UseMuiFormRegister<TFieldValues extends FieldValues> = <
10
- TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
11
- >(
12
- name: TFieldName,
13
- options?: RegisterOptions<TFieldValues, TFieldName>,
14
- ) => Omit<UseFormRegisterReturn, 'ref'> & { inputRef: UseFormRegisterReturn['ref'] }
15
-
16
- /** @deprecated Please use use TextFieldElement, etc. */
17
- export function useFormMuiRegister<V extends FieldValues>({
18
- register,
19
- }: Pick<UseFormReturn<V>, 'register'>) {
20
- const muiRegister: UseMuiFormRegister<V> = (name, opts) => {
21
- const { ref: inputRef, ...fields } = register(name, opts)
22
- return { ...fields, inputRef }
23
- }
24
- return muiRegister
25
- }
@@ -1,28 +0,0 @@
1
- import type { FieldPath, FieldValues, UseFormReturn } from 'react-hook-form'
2
- import type { IsRequired } from './useGqlDocumentHandler'
3
-
4
- export type UseFormValidReturn<TFieldValues extends FieldValues> = Partial<
5
- Record<FieldPath<TFieldValues>, boolean>
6
- >
7
-
8
- /**
9
- * ### useFormValidFields
10
- *
11
- * Record field names as key and boolean as value indicating whether the field is valid
12
- *
13
- * @deprecated Please use TextInputElement, SelectElement, etc. with the showValid prop
14
- * @public
15
- */
16
- export function useFormValidFields<TFieldValues extends FieldValues>(
17
- form: Pick<UseFormReturn<TFieldValues>, 'watch' | 'formState'>,
18
- required: IsRequired<TFieldValues>,
19
- ): UseFormValidReturn<TFieldValues> {
20
- const { watch, formState } = form
21
- const fields: Partial<Record<FieldPath<TFieldValues>, boolean>> = {}
22
-
23
- Object.keys(required).forEach((key) => {
24
- fields[key] = !formState.errors[key] && watch(key as FieldPath<TFieldValues>)
25
- })
26
-
27
- return fields
28
- }