1
- import { FormDataConvertible , Method , Progress , router , VisitOptions } from '@inertiajs/core'
2
- import isEqual from 'lodash.isequal '
1
+ import { FormDataConvertible , FormDataKeys , Method , Progress , router , VisitOptions } from '@inertiajs/core'
2
+ import { cloneDeep , get , has , isEqual , set } from 'lodash'
3
3
import { useCallback , useEffect , useRef , useState } from 'react'
4
4
import useRemember from './useRemember'
5
5
6
6
type setDataByObject < TForm > = ( data : TForm ) => void
7
7
type setDataByMethod < TForm > = ( data : ( previousData : TForm ) => TForm ) => void
8
- type setDataByKeyValuePair < TForm > = < K extends keyof TForm > ( key : K , value : TForm [ K ] ) => void
8
+ type setDataByKeyValuePair < TForm > = ( key : FormDataKeys < TForm > , value : any ) => void
9
9
type FormDataType = Record < string , FormDataConvertible >
10
10
type FormOptions = Omit < VisitOptions , 'data' >
11
11
12
12
export interface InertiaFormProps < TForm extends FormDataType > {
13
13
data : TForm
14
14
isDirty : boolean
15
- errors : Partial < Record < keyof TForm , string > >
15
+ errors : Partial < Record < FormDataKeys < TForm > , string > >
16
16
hasErrors : boolean
17
17
processing : boolean
18
18
progress : Progress | null
@@ -21,12 +21,12 @@ export interface InertiaFormProps<TForm extends FormDataType> {
21
21
setData : setDataByObject < TForm > & setDataByMethod < TForm > & setDataByKeyValuePair < TForm >
22
22
transform : ( callback : ( data : TForm ) => object ) => void
23
23
setDefaults ( ) : void
24
- setDefaults ( field : keyof TForm , value : FormDataConvertible ) : void
24
+ setDefaults ( field : FormDataKeys < TForm > , value : FormDataConvertible ) : void
25
25
setDefaults ( fields : Partial < TForm > ) : void
26
- reset : ( ...fields : ( keyof TForm ) [ ] ) => void
27
- clearErrors : ( ...fields : ( keyof TForm ) [ ] ) => void
28
- setError ( field : keyof TForm , value : string ) : void
29
- setError ( errors : Record < keyof TForm , string > ) : void
26
+ reset : ( ...fields : FormDataKeys < TForm > [ ] ) => void
27
+ clearErrors : ( ...fields : FormDataKeys < TForm > [ ] ) => void
28
+ setError ( field : FormDataKeys < TForm > , value : string ) : void
29
+ setError ( errors : Record < FormDataKeys < TForm > , string > ) : void
30
30
submit : ( method : Method , url : string , options ?: FormOptions ) => void
31
31
get : ( url : string , options ?: FormOptions ) => void
32
32
patch : ( url : string , options ?: FormOptions ) => void
@@ -53,8 +53,8 @@ export default function useForm<TForm extends FormDataType>(
53
53
const recentlySuccessfulTimeoutId = useRef ( null )
54
54
const [ data , setData ] = rememberKey ? useRemember ( defaults , `${ rememberKey } :data` ) : useState ( defaults )
55
55
const [ errors , setErrors ] = rememberKey
56
- ? useRemember ( { } as Partial < Record < keyof TForm , string > > , `${ rememberKey } :errors` )
57
- : useState ( { } as Partial < Record < keyof TForm , string > > )
56
+ ? useRemember ( { } as Partial < Record < FormDataKeys < TForm > , string > > , `${ rememberKey } :errors` )
57
+ : useState ( { } as Partial < Record < FormDataKeys < TForm > , string > > )
58
58
const [ hasErrors , setHasErrors ] = useState ( false )
59
59
const [ processing , setProcessing ] = useState ( false )
60
60
const [ progress , setProgress ] = useState ( null )
@@ -168,9 +168,9 @@ export default function useForm<TForm extends FormDataType>(
168
168
)
169
169
170
170
const setDataFunction = useCallback (
171
- ( keyOrData : keyof TForm | Function | TForm , maybeValue ?: TForm [ keyof TForm ] ) => {
171
+ ( keyOrData : FormDataKeys < TForm > | Function | TForm , maybeValue ?: any ) => {
172
172
if ( typeof keyOrData === 'string' ) {
173
- setData ( ( data ) => ( { ... data , [ keyOrData ] : maybeValue } ) )
173
+ setData ( ( data ) => set ( cloneDeep ( data ) , keyOrData , maybeValue ) )
174
174
} else if ( typeof keyOrData === 'function' ) {
175
175
setData ( ( data ) => keyOrData ( data ) )
176
176
} else {
@@ -181,14 +181,15 @@ export default function useForm<TForm extends FormDataType>(
181
181
)
182
182
183
183
const setDefaultsFunction = useCallback (
184
- ( fieldOrFields ?: keyof TForm | Partial < TForm > , maybeValue ?: FormDataConvertible ) => {
184
+ ( fieldOrFields ?: FormDataKeys < TForm > | Partial < TForm > , maybeValue ?: FormDataConvertible ) => {
185
185
if ( typeof fieldOrFields === 'undefined' ) {
186
186
setDefaults ( ( ) => data )
187
187
} else {
188
- setDefaults ( ( defaults ) => ( {
189
- ...defaults ,
190
- ...( typeof fieldOrFields === 'string' ? { [ fieldOrFields ] : maybeValue } : ( fieldOrFields as TForm ) ) ,
191
- } ) )
188
+ setDefaults ( ( defaults ) => {
189
+ return typeof fieldOrFields === 'string'
190
+ ? set ( cloneDeep ( defaults ) , fieldOrFields , maybeValue )
191
+ : Object . assign ( cloneDeep ( defaults ) , fieldOrFields )
192
+ } )
192
193
}
193
194
} ,
194
195
[ data , setDefaults ] ,
@@ -200,14 +201,13 @@ export default function useForm<TForm extends FormDataType>(
200
201
setData ( defaults )
201
202
} else {
202
203
setData ( ( data ) =>
203
- ( Object . keys ( defaults ) as Array < keyof TForm > )
204
- . filter ( ( key ) => fields . includes ( key ) )
204
+ ( fields as Array < FormDataKeys < TForm > > )
205
+ . filter ( ( key ) => has ( defaults , key ) )
205
206
. reduce (
206
207
( carry , key ) => {
207
- carry [ key ] = defaults [ key ]
208
- return carry
208
+ return set ( carry , key , get ( defaults , key ) )
209
209
} ,
210
- { ...data } ,
210
+ { ...data } as TForm ,
211
211
) ,
212
212
)
213
213
}
@@ -216,13 +216,13 @@ export default function useForm<TForm extends FormDataType>(
216
216
)
217
217
218
218
const setError = useCallback (
219
- ( fieldOrFields : keyof TForm | Record < keyof TForm , string > , maybeValue ?: string ) => {
219
+ ( fieldOrFields : FormDataKeys < TForm > | Record < FormDataKeys < TForm > , string > , maybeValue ?: string ) => {
220
220
setErrors ( ( errors ) => {
221
221
const newErrors = {
222
222
...errors ,
223
223
...( typeof fieldOrFields === 'string'
224
224
? { [ fieldOrFields ] : maybeValue }
225
- : ( fieldOrFields as Record < keyof TForm , string > ) ) ,
225
+ : ( fieldOrFields as Record < FormDataKeys < TForm > , string > ) ) ,
226
226
}
227
227
setHasErrors ( Object . keys ( newErrors ) . length > 0 )
228
228
return newErrors
@@ -234,7 +234,7 @@ export default function useForm<TForm extends FormDataType>(
234
234
const clearErrors = useCallback (
235
235
( ...fields ) => {
236
236
setErrors ( ( errors ) => {
237
- const newErrors = ( Object . keys ( errors ) as Array < keyof TForm > ) . reduce (
237
+ const newErrors = ( Object . keys ( errors ) as Array < FormDataKeys < TForm > > ) . reduce (
238
238
( carry , field ) => ( {
239
239
...carry ,
240
240
...( fields . length > 0 && ! fields . includes ( field ) ? { [ field ] : errors [ field ] } : { } ) ,
@@ -251,7 +251,7 @@ export default function useForm<TForm extends FormDataType>(
251
251
const createSubmitMethod = ( method ) => ( url , options ) => {
252
252
submit ( method , url , options )
253
253
}
254
- const get = useCallback ( createSubmitMethod ( 'get' ) , [ submit ] )
254
+ const getMethod = useCallback ( createSubmitMethod ( 'get' ) , [ submit ] )
255
255
const post = useCallback ( createSubmitMethod ( 'post' ) , [ submit ] )
256
256
const put = useCallback ( createSubmitMethod ( 'put' ) , [ submit ] )
257
257
const patch = useCallback ( createSubmitMethod ( 'patch' ) , [ submit ] )
@@ -283,7 +283,7 @@ export default function useForm<TForm extends FormDataType>(
283
283
setError,
284
284
clearErrors,
285
285
submit,
286
- get,
286
+ get : getMethod ,
287
287
post,
288
288
put,
289
289
patch,
0 commit comments