From 67a249f508bbd7731e639f469f2bdd12f7e9fb55 Mon Sep 17 00:00:00 2001 From: Alex Anderson Date: Wed, 2 Dec 2020 15:16:47 -0500 Subject: [PATCH] fix(DMX): Fixes a memory leak that causes the DMX system to slow down and crash after several minutes of use. Closes #3042 --- server/processes/clientPing.js | 2 +- src/helpers/hooks/useLocalStorage.js | 38 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/server/processes/clientPing.js b/server/processes/clientPing.js index 412f2135c..e48ff0973 100644 --- a/server/processes/clientPing.js +++ b/server/processes/clientPing.js @@ -15,6 +15,6 @@ const clientPing = () => { pubsub.publish("clientPing", c); } }); - setTimeout(clientPing, 5000); + setTimeout(clientPing, 1000 * 60); }; clientPing(); diff --git a/src/helpers/hooks/useLocalStorage.js b/src/helpers/hooks/useLocalStorage.js index fd67225dc..5fb3647e9 100644 --- a/src/helpers/hooks/useLocalStorage.js +++ b/src/helpers/hooks/useLocalStorage.js @@ -16,20 +16,30 @@ export default function useLocalStorage(key, initialValue) { // Return a wrapped version of useState's setter function that ... // ... persists the new value to localStorage. - const setValue = value => { - try { - // Allow value to be a function so we have same API as useState - const valueToStore = - value instanceof Function ? value(storedValue) : value; - // Save state - setStoredValue(valueToStore); - // Save to local storage - window.localStorage.setItem(key, JSON.stringify(valueToStore)); - } catch (error) { - // A more advanced implementation would handle the error case - console.error(error); - } - }; + const setValue = React.useCallback( + value => { + try { + // Allow value to be a function so we have same API as useState + // Save state + setStoredValue(storedValue => { + try { + const valueToStore = + value instanceof Function ? value(storedValue) : value; + + window.localStorage.setItem(key, JSON.stringify(valueToStore)); + return valueToStore; + } catch { + return storedValue; + } + }); + // Save to local storage + } catch (error) { + // A more advanced implementation would handle the error case + console.error(error); + } + }, + [key], + ); return [storedValue, setValue]; }