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];
 }