@@ -21,10 +21,11 @@ const uiStateReducer = (state, action) => {
21
21
switch ( action . type ) {
22
22
case 'addUIState' : {
23
23
const { source, uiState} = action ;
24
+ const newState = { ...state } ;
24
25
25
26
Object . entries ( uiState ) . forEach ( ( [ key , item ] ) => {
26
27
//Create the item object for this item if it doesn't exist
27
- if ( ! state . fields [ key ] ) state . fields [ key ] = { } ;
28
+ if ( ! newState . fields [ key ] ) newState . fields [ key ] = { } ;
28
29
29
30
validAttributes . forEach ( type => {
30
31
//Don't add uiTypes if they don't exist in the dispatched message
@@ -35,49 +36,62 @@ const uiStateReducer = (state, action) => {
35
36
const value = inversedType ? ! item [ type ] : item [ type ] ;
36
37
type = inversedType || type ;
37
38
38
- if ( ! state . fields [ key ] [ type ] ) {
39
+ if ( ! newState . fields [ key ] [ type ] ) {
39
40
//If this type doesn't exists for this item, we create a new array with only this source. No need to search fot the source
40
- state . fields [ key ] [ type ] = [ { source, value} ] ;
41
+ // newState.fields[key][type] = [{source, value}];
42
+ newState . fields [ key ] = { ...newState . fields [ key ] , [ type ] : [ { source, value} ] } ;
41
43
} else {
42
- const index = state . fields [ key ] [ type ] . findIndex ( item => item . source === source ) ;
44
+ newState . fields [ key ] = { ...newState . fields [ key ] } ;
45
+ const index = newState . fields [ key ] [ type ] . findIndex ( item => item . source === source ) ;
43
46
if ( index !== - 1 ) {
44
47
//If this type for this item from this source existed, update the state (value could change if condition went from "then" to "else")
45
- state . fields [ key ] [ type ] [ index ] . value = value ;
48
+ newState . fields [ key ] [ type ] = [ ...newState . fields [ key ] [ type ] ] ;
49
+ newState . fields [ key ] [ type ] [ index ] . value = value ;
46
50
} else {
47
51
//Otherwise, add the state from this source at the begining of the array (i.e. this will supress result from other sources)
48
- state . fields [ key ] [ type ] . unshift ( { source, value} ) ;
52
+ newState . fields [ key ] [ type ] = [ { source, value} , ... newState . fields [ key ] [ type ] ] ;
49
53
}
50
54
}
51
55
} ) ;
52
56
53
57
// Set-instructions are ephemeral and goes into a separate list which is emptied when processed
54
58
if ( item . set ) {
55
- state . setFieldValues = { ...state . setFieldValues , [ key ] : item . set } ;
59
+ newState . setFieldValues = { ...newState . setFieldValues , [ key ] : item . set } ;
56
60
}
57
61
} ) ;
58
- return { ...state } ;
62
+ return { ...newState } ;
59
63
}
60
64
61
65
case 'removeUIState' : {
62
66
const { source, uiState} = action ;
67
+ const newState = { ...state } ;
63
68
64
69
Object . entries ( uiState ) . forEach ( ( [ key , item ] ) => {
65
70
//If the field/section doesn't exist, we don't need to do anymore
66
- if ( ! state . fields [ key ] ) return ;
71
+ if ( ! newState . fields [ key ] ) return ;
67
72
68
73
Object . entries ( item ) . forEach ( ( [ type , value ] ) => {
69
- if ( ! state . fields [ key ] [ type ] ) return ;
74
+ if ( ! newState . fields [ key ] [ type ] ) return ;
70
75
71
- const index = state . fields [ key ] [ type ] . findIndex ( item => item . source === source ) ;
72
- if ( index !== - 1 ) state . fields [ key ] [ type ] . splice ( index , 1 ) ;
73
- if ( state . fields [ key ] [ type ] . length === 0 ) delete state . fields [ key ] [ type ] ;
76
+ const index = newState . fields [ key ] [ type ] . findIndex ( item => item . source === source ) ;
77
+ if ( index !== - 1 ) {
78
+ newState . fields [ key ] [ type ] = [ ...newState . fields [ key ] [ type ] ] ;
79
+ newState . fields [ key ] [ type ] . splice ( index , 1 ) ;
80
+ }
81
+ if ( newState . fields [ key ] [ type ] . length === 0 ) {
82
+ newState . fields [ key ] = { ...newState . fields [ key ] } ;
83
+ delete newState . fields [ key ] [ type ] ;
84
+ }
74
85
} ) ;
75
86
76
87
//If no more uiStateType keys exists for this field, remove the field
77
- if ( Object . keys ( state . fields [ key ] ) . length === 0 ) delete state . fields [ key ] ;
88
+ if ( Object . keys ( newState . fields [ key ] ) . length === 0 ) {
89
+ newState . fields = { ...newState . fields [ key ] } ;
90
+ delete newState . fields [ key ] ;
91
+ }
78
92
} ) ;
79
93
80
- return { ... state } ;
94
+ return newState ;
81
95
}
82
96
83
97
case 'fieldValuesUpdated' : {
0 commit comments