diff --git a/gerbil-manager-web/src/hooks/useScrollRestoration.ts b/gerbil-manager-web/src/hooks/useScrollRestoration.ts index cc8d5d4..26b677f 100644 --- a/gerbil-manager-web/src/hooks/useScrollRestoration.ts +++ b/gerbil-manager-web/src/hooks/useScrollRestoration.ts @@ -15,7 +15,9 @@ import { useCallback, useEffect, useRef } from 'react' import { useLocation, useNavigationType } from 'react-router-dom' const PREFIX = 'scroll:' -const RESTORE_DEADLINE_MS = 2500 +// Etwas großzügig, damit auch langsam (kalt) nachladende Listen + Dev-HMR-Updates die Position +// noch erreichen, während der Inhalt in die Höhe wächst. +const RESTORE_DEADLINE_MS = 4000 export function useScrollRestoration() { const { pathname } = useLocation() @@ -126,4 +128,23 @@ export function useScrollRestoration() { if (rafSaveRef.current != null) cancelAnimationFrame(rafSaveRef.current) } }, [persist, restore]) + + // NUR Dev (Vite-HMR / React Fast Refresh): bei einem Hot-Update wird die Seite kurz neu + // gerendert (Liste kollabiert → Sprung nach oben), ohne dass eine Navigation oder ein + // pagehide/pageshow feuert. Daher hier explizit vor dem Update sichern und danach + // wiederherstellen. In der Produktion ist import.meta.hot undefiniert → No-Op. + useEffect(() => { + const hot = import.meta.hot + if (!hot) return + const before = () => persist() + const after = () => restore(pathRef.current, false) + hot.on('vite:beforeUpdate', before) + hot.on('vite:afterUpdate', after) + hot.on('vite:beforeFullReload', before) + return () => { + hot.off?.('vite:beforeUpdate', before) + hot.off?.('vite:afterUpdate', after) + hot.off?.('vite:beforeFullReload', before) + } + }, [persist, restore]) }