From dadb6e9bb3c5e08ddf7a4423cb7f4f1bec4f0e92 Mon Sep 17 00:00:00 2001 From: Michael Fatemi <myfatemi04@gmail.com> Date: Fri, 16 Jul 2021 17:11:16 -0400 Subject: [PATCH] fix memory leak --- src/components/useImmutable.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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<T extends PlainJSObject>( value: T, setValue: Dispatch<SetStateAction<T>> ): T { + // @ts-ignore + const edges: Record<keyof T, any> = {}; + return new Proxy(value, { set: (target, property, value) => { setValue((v) => ({ ...v, [property]: value })); @@ -22,13 +25,20 @@ function createEdgeForObject<T extends PlainJSObject>( }, // @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<typeof keyValue>) => { 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<T extends PlainJS>( const edge = useMemo(() => createEdge(value, setValue), [value]); + console.log('rerendered useImmutable'); + return [edge, setValue]; }