fix memory leak

This commit is contained in:
Michael Fatemi 2021-07-16 17:11:16 -04:00
parent e27f62701c
commit dadb6e9bb3

View File

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