woocommerce/plugins/woocommerce-blocks/assets/js/data/utils/update-state.ts

34 lines
771 B
TypeScript
Raw Normal View History

2023-04-28 10:29:45 +00:00
/**
* External dependencies
*/
import { klona } from 'klona/json';
/**
* Utility for updating state and only cloning objects in the path that changed.
*/
export default function updateState< Type extends Record< string, unknown > >(
// The state being updated
state: Type,
// The path being updated
path: Array< keyof Type >,
// The value to update for the path
value: unknown
): Type {
const newState = klona( state ) as Type;
let current: Record< string, unknown > = newState;
for ( let i = 0; i < path.length; i++ ) {
const key = path[ i ] as string;
if ( i === path.length - 1 ) {
current[ key ] = value;
} else {
current[ key ] = current[ key ] || {};
}
current = current[ key ] as Record< string, unknown >;
}
return newState;
}