38 lines
860 B
TypeScript
38 lines
860 B
TypeScript
/**
|
|
* Utility for updating nested state in the path that changed.
|
|
*/
|
|
function updateNested< T >( // The state being updated
|
|
state: T,
|
|
// The path being updated
|
|
path: string[],
|
|
// The value to update for the path
|
|
value: unknown,
|
|
// The current index in the path
|
|
index = 0
|
|
): T {
|
|
const key = path[ index ] as keyof T;
|
|
if ( index === path.length - 1 ) {
|
|
return { ...state, [ key ]: value };
|
|
}
|
|
|
|
const nextState = state[ key ] || {};
|
|
return {
|
|
...state,
|
|
[ key ]: updateNested( nextState, path, value, index + 1 ),
|
|
} as T;
|
|
}
|
|
|
|
/**
|
|
* Utility for updating state and only cloning objects in the path that changed.
|
|
*/
|
|
export default function updateState< T >(
|
|
// The state being updated
|
|
state: T,
|
|
// The path being updated
|
|
path: string[],
|
|
// The value to update for the path
|
|
value: unknown
|
|
): T {
|
|
return updateNested( state, path, value );
|
|
}
|