@@ -2,19 +2,42 @@ import i from 'icepick';
2
2
import get from './get' ;
3
3
import mapValues from './map-values' ;
4
4
import { createInitialState } from '../reducers/form-reducer' ;
5
+ import { updateFieldState } from './create-field' ;
6
+ import identity from './identity' ;
5
7
import invariant from 'invariant' ;
6
8
7
- function assocIn ( state , path , value , fn ) {
8
- if ( ! path . length ) return i . assign ( state , value ) ;
9
- if ( ! fn ) return i . assocIn ( state , path , value ) ;
9
+ function objClone ( obj ) {
10
+ const keys = Object . keys ( obj ) ;
11
+ const length = keys . length ;
12
+ const result = { } ;
13
+ let index = 0 ;
14
+ let key ;
15
+
16
+ for ( ; index < length ; index += 1 ) {
17
+ key = keys [ index ] ;
18
+ result [ key ] = obj [ key ] ;
19
+ }
20
+ return result ;
21
+ }
22
+
23
+ function assoc ( state , key , value ) {
24
+ const newState = objClone ( state ) ;
25
+
26
+ newState [ key ] = value ;
27
+
28
+ return newState ;
29
+ }
30
+
31
+ function assocIn ( state , path , value , fn = identity ) {
32
+ if ( ! path . length ) return value ;
10
33
11
34
const key0 = path [ 0 ] ;
12
35
13
36
if ( path . length === 1 ) {
14
- return fn ( i . assoc ( state , key0 , value ) ) ;
37
+ return fn ( assoc ( state , key0 , value ) ) ;
15
38
}
16
39
17
- return fn ( i . assoc ( state , key0 , assocIn ( state [ key0 ] || { } , path . slice ( 1 ) , value , fn ) ) ) ;
40
+ return fn ( assoc ( state , key0 , assocIn ( state [ key0 ] || { } , path . slice ( 1 ) , value , fn ) ) ) ;
18
41
}
19
42
20
43
function tempInitialState ( path , initialValue = null ) {
@@ -53,7 +76,7 @@ export default function updateField(state, path, newState, newSubState, updater)
53
76
54
77
const isForm = field . hasOwnProperty ( '$form' ) ;
55
78
const fieldPath = isForm
56
- ? i . push ( path , '$form' )
79
+ ? [ ... path , '$form' ]
57
80
: path ;
58
81
59
82
const fieldState = isForm
@@ -67,24 +90,22 @@ export default function updateField(state, path, newState, newSubState, updater)
67
90
if ( isForm && newSubState ) {
68
91
const formState = mapValues ( field , ( subState , key ) => {
69
92
if ( key === '$form' ) {
70
- return i . assign (
71
- fieldState ,
72
- updatedFieldState ) ;
93
+ return updateFieldState ( fieldState , updatedFieldState ) ;
73
94
}
74
95
75
96
const updatedSubState = typeof newSubState === 'function'
76
97
? newSubState ( subState , updatedFieldState )
77
98
: newSubState ;
78
99
79
- return i . assign ( subState , updatedSubState ) ;
100
+ return updateFieldState ( subState , updatedSubState ) ;
80
101
} ) ;
81
102
82
103
if ( ! path . length ) return formState ;
83
104
84
105
return assocIn ( fullState , path , formState , updater ) ;
85
106
}
86
107
87
- return assocIn ( fullState , fieldPath , i . assign (
108
+ return assocIn ( fullState , fieldPath , updateFieldState (
88
109
fieldState ,
89
110
updatedFieldState ) , updater ) ;
90
111
}
0 commit comments