diff --git a/src/components/useImmutable.ts b/src/components/useImmutable.ts index 6972020..a076c3d 100644 --- a/src/components/useImmutable.ts +++ b/src/components/useImmutable.ts @@ -14,6 +14,9 @@ function createEdgeForObject( value: T, setValue: Dispatch> ): T { + // @ts-ignore + const edges: Record = {}; + return new Proxy(value, { set: (target, property, value) => { setValue((v) => ({ ...v, [property]: value })); @@ -22,13 +25,20 @@ function createEdgeForObject( }, // @ts-expect-error get: (target, property: keyof T) => { + if (property in edges) { + // @ts-ignore + return edges[property]; + } + const keyValue = target[property]; const set = (next: SetStateAction) => { const v = typeof next === 'function' ? next(keyValue) : next; setValue((value) => ({ ...value, [property]: v })); }; - return createEdge(keyValue, set); + const edge = createEdge(keyValue, set); + edges[property] = edge; + return edge; }, deleteProperty: (target, property) => { setValue((v) => { @@ -123,5 +133,7 @@ export default function useImmutable( const edge = useMemo(() => createEdge(value, setValue), [value]); + console.log('rerendered useImmutable'); + return [edge, setValue]; }