1
- import { FormDataConvertible , Method , Progress , router , VisitOptions } from '@inertiajs/core'
2
- import { isEqual , cloneDeep } from 'es-toolkit'
1
+ import {
2
+ FormDataConvertible ,
3
+ FormDataKeys ,
4
+ FormDataValues ,
5
+ Method ,
6
+ Progress ,
7
+ router ,
8
+ VisitOptions ,
9
+ } from '@inertiajs/core'
10
+ import { cloneDeep , isEqual } from 'es-toolkit'
11
+ import { get , has , set } from 'es-toolkit/compat'
3
12
import { useCallback , useEffect , useRef , useState } from 'react'
4
13
import useRemember from './useRemember'
5
14
6
- type setDataByObject < TForm > = ( data : TForm ) => void
7
- type setDataByMethod < TForm > = ( data : ( previousData : TForm ) => TForm ) => void
8
- type setDataByKeyValuePair < TForm > = < K extends keyof TForm > ( key : K , value : TForm [ K ] ) => void
15
+ type SetDataByObject < TForm > = ( data : TForm ) => void
16
+ type SetDataByMethod < TForm > = ( data : ( previousData : TForm ) => TForm ) => void
17
+ type SetDataByKeyValuePair < TForm > = < K extends FormDataKeys < TForm > > ( key : K , value : FormDataValues < TForm , K > ) => void
9
18
type FormDataType = Record < string , FormDataConvertible >
10
19
type FormOptions = Omit < VisitOptions , 'data' >
11
20
12
21
export interface InertiaFormProps < TForm extends FormDataType > {
13
22
data : TForm
14
23
isDirty : boolean
15
- errors : Partial < Record < keyof TForm , string > >
24
+ errors : Partial < Record < FormDataKeys < TForm > , string > >
16
25
hasErrors : boolean
17
26
processing : boolean
18
27
progress : Progress | null
19
28
wasSuccessful : boolean
20
29
recentlySuccessful : boolean
21
- setData : setDataByObject < TForm > & setDataByMethod < TForm > & setDataByKeyValuePair < TForm >
30
+ setData : SetDataByObject < TForm > & SetDataByMethod < TForm > & SetDataByKeyValuePair < TForm >
22
31
transform : ( callback : ( data : TForm ) => object ) => void
23
32
setDefaults ( ) : void
24
- setDefaults ( field : keyof TForm , value : FormDataConvertible ) : void
33
+ setDefaults ( field : FormDataKeys < TForm > , value : FormDataConvertible ) : void
25
34
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
35
+ reset : ( ...fields : FormDataKeys < TForm > [ ] ) => void
36
+ clearErrors : ( ...fields : FormDataKeys < TForm > [ ] ) => void
37
+ setError ( field : FormDataKeys < TForm > , value : string ) : void
38
+ setError ( errors : Record < FormDataKeys < TForm > , string > ) : void
30
39
submit : ( ...args : [ Method , string , FormOptions ?] | [ { url : string ; method : Method } , FormOptions ?] ) => void
31
40
get : ( url : string , options ?: FormOptions ) => void
32
41
patch : ( url : string , options ?: FormOptions ) => void
@@ -53,8 +62,8 @@ export default function useForm<TForm extends FormDataType>(
53
62
const recentlySuccessfulTimeoutId = useRef ( null )
54
63
const [ data , setData ] = rememberKey ? useRemember ( defaults , `${ rememberKey } :data` ) : useState ( defaults )
55
64
const [ errors , setErrors ] = rememberKey
56
- ? useRemember ( { } as Partial < Record < keyof TForm , string > > , `${ rememberKey } :errors` )
57
- : useState ( { } as Partial < Record < keyof TForm , string > > )
65
+ ? useRemember ( { } as Partial < Record < FormDataKeys < TForm > , string > > , `${ rememberKey } :errors` )
66
+ : useState ( { } as Partial < Record < FormDataKeys < TForm > , string > > )
58
67
const [ hasErrors , setHasErrors ] = useState ( false )
59
68
const [ processing , setProcessing ] = useState ( false )
60
69
const [ progress , setProgress ] = useState ( null )
@@ -175,9 +184,9 @@ export default function useForm<TForm extends FormDataType>(
175
184
)
176
185
177
186
const setDataFunction = useCallback (
178
- ( keyOrData : keyof TForm | Function | TForm , maybeValue ?: TForm [ keyof TForm ] ) => {
187
+ ( keyOrData : FormDataKeys < TForm > | Function | TForm , maybeValue ?: any ) => {
179
188
if ( typeof keyOrData === 'string' ) {
180
- setData ( ( data ) => ( { ... data , [ keyOrData ] : maybeValue } ) )
189
+ setData ( ( data ) => set ( cloneDeep ( data ) , keyOrData , maybeValue ) )
181
190
} else if ( typeof keyOrData === 'function' ) {
182
191
setData ( ( data ) => keyOrData ( data ) )
183
192
} else {
@@ -188,14 +197,15 @@ export default function useForm<TForm extends FormDataType>(
188
197
)
189
198
190
199
const setDefaultsFunction = useCallback (
191
- ( fieldOrFields ?: keyof TForm | Partial < TForm > , maybeValue ?: FormDataConvertible ) => {
200
+ ( fieldOrFields ?: FormDataKeys < TForm > | Partial < TForm > , maybeValue ?: FormDataConvertible ) => {
192
201
if ( typeof fieldOrFields === 'undefined' ) {
193
202
setDefaults ( ( ) => data )
194
203
} else {
195
- setDefaults ( ( defaults ) => ( {
196
- ...defaults ,
197
- ...( typeof fieldOrFields === 'string' ? { [ fieldOrFields ] : maybeValue } : ( fieldOrFields as TForm ) ) ,
198
- } ) )
204
+ setDefaults ( ( defaults ) => {
205
+ return typeof fieldOrFields === 'string'
206
+ ? set ( cloneDeep ( defaults ) , fieldOrFields , maybeValue )
207
+ : Object . assign ( cloneDeep ( defaults ) , fieldOrFields )
208
+ } )
199
209
}
200
210
} ,
201
211
[ data , setDefaults ] ,
@@ -207,14 +217,13 @@ export default function useForm<TForm extends FormDataType>(
207
217
setData ( defaults )
208
218
} else {
209
219
setData ( ( data ) =>
210
- ( Object . keys ( defaults ) as Array < keyof TForm > )
211
- . filter ( ( key ) => fields . includes ( key ) )
220
+ ( fields as Array < FormDataKeys < TForm > > )
221
+ . filter ( ( key ) => has ( defaults , key ) )
212
222
. reduce (
213
223
( carry , key ) => {
214
- carry [ key ] = defaults [ key ]
215
- return carry
224
+ return set ( carry , key , get ( defaults , key ) )
216
225
} ,
217
- { ...data } ,
226
+ { ...data } as TForm ,
218
227
) ,
219
228
)
220
229
}
@@ -223,13 +232,13 @@ export default function useForm<TForm extends FormDataType>(
223
232
)
224
233
225
234
const setError = useCallback (
226
- ( fieldOrFields : keyof TForm | Record < keyof TForm , string > , maybeValue ?: string ) => {
235
+ ( fieldOrFields : FormDataKeys < TForm > | Record < FormDataKeys < TForm > , string > , maybeValue ?: string ) => {
227
236
setErrors ( ( errors ) => {
228
237
const newErrors = {
229
238
...errors ,
230
239
...( typeof fieldOrFields === 'string'
231
240
? { [ fieldOrFields ] : maybeValue }
232
- : ( fieldOrFields as Record < keyof TForm , string > ) ) ,
241
+ : ( fieldOrFields as Record < FormDataKeys < TForm > , string > ) ) ,
233
242
}
234
243
setHasErrors ( Object . keys ( newErrors ) . length > 0 )
235
244
return newErrors
@@ -241,7 +250,7 @@ export default function useForm<TForm extends FormDataType>(
241
250
const clearErrors = useCallback (
242
251
( ...fields ) => {
243
252
setErrors ( ( errors ) => {
244
- const newErrors = ( Object . keys ( errors ) as Array < keyof TForm > ) . reduce (
253
+ const newErrors = ( Object . keys ( errors ) as Array < FormDataKeys < TForm > > ) . reduce (
245
254
( carry , field ) => ( {
246
255
...carry ,
247
256
...( fields . length > 0 && ! fields . includes ( field ) ? { [ field ] : errors [ field ] } : { } ) ,
@@ -258,7 +267,7 @@ export default function useForm<TForm extends FormDataType>(
258
267
const createSubmitMethod = ( method ) => ( url , options ) => {
259
268
submit ( method , url , options )
260
269
}
261
- const get = useCallback ( createSubmitMethod ( 'get' ) , [ submit ] )
270
+ const getMethod = useCallback ( createSubmitMethod ( 'get' ) , [ submit ] )
262
271
const post = useCallback ( createSubmitMethod ( 'post' ) , [ submit ] )
263
272
const put = useCallback ( createSubmitMethod ( 'put' ) , [ submit ] )
264
273
const patch = useCallback ( createSubmitMethod ( 'patch' ) , [ submit ] )
@@ -290,7 +299,7 @@ export default function useForm<TForm extends FormDataType>(
290
299
setError,
291
300
clearErrors,
292
301
submit,
293
- get,
302
+ get : getMethod ,
294
303
post,
295
304
put,
296
305
patch,
0 commit comments