From dd69e02f6bb3e183d156b5b4405ba4d08b3a2ca3 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 25 Oct 2025 11:44:08 +0200 Subject: [PATCH] add memo cache, smaller toaster windows --- interface/src/App.tsx | 65 ++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/interface/src/App.tsx b/interface/src/App.tsx index 7b4115c2c..496f2e3eb 100644 --- a/interface/src/App.tsx +++ b/interface/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { memo, useCallback, useEffect, useMemo, useState } from 'react'; import { ToastContainer, Zoom } from 'react-toastify'; import AppRouting from 'AppRouting'; @@ -8,7 +8,8 @@ import type { Locales } from 'i18n/i18n-types'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; import { detectLocale, navigatorDetector } from 'typesafe-i18n/detectors'; -const availableLocales = [ +// Memoize available locales to prevent recreation on every render +const AVAILABLE_LOCALES = [ 'de', 'en', 'it', @@ -20,47 +21,59 @@ const availableLocales = [ 'sv', 'tr', 'cz' -]; +] as Locales[]; -const App = () => { +const App = memo(() => { const [wasLoaded, setWasLoaded] = useState(false); const [locale, setLocale] = useState('en'); - useEffect(() => { - // determine locale, take from session if set other default to browser language - const browserLocale = detectLocale('en', availableLocales, navigatorDetector); + // Memoize locale initialization to prevent unnecessary re-runs + const initializeLocale = useCallback(async () => { + const browserLocale = detectLocale('en', AVAILABLE_LOCALES, navigatorDetector); const newLocale = (localStorage.getItem('lang') || browserLocale) as Locales; localStorage.setItem('lang', newLocale); setLocale(newLocale); - void loadLocaleAsync(newLocale).then(() => setWasLoaded(true)); + await loadLocaleAsync(newLocale); + setWasLoaded(true); }, []); + useEffect(() => { + void initializeLocale(); + }, [initializeLocale]); + + // Memoize toast container props to prevent recreation + const toastContainerProps = useMemo( + () => ({ + position: 'bottom-left' as const, + autoClose: 3000, + hideProgressBar: false, + newestOnTop: false, + closeOnClick: true, + rtl: false, + pauseOnFocusLoss: true, + draggable: false, + pauseOnHover: false, + transition: Zoom, + closeButton: false, + theme: 'dark' as const, + toastStyle: { + border: '1px solid #177ac9', + width: 'fit-content' + } + }), + [] + ); + if (!wasLoaded) return null; return ( - + ); -}; +}); export default App;