refactor list scroll persistence to use store instead of browser state

This commit is contained in:
jeffvli
2026-02-09 20:18:56 -08:00
parent 86f158ee5f
commit b41a91c178
3 changed files with 29 additions and 9 deletions
@@ -1,26 +1,29 @@
import { useCallback, useMemo } from 'react';
import { useSearchParams } from 'react-router';
import { useLocation, useNavigationType } from 'react-router';
import { parseIntParam, setSearchParam } from '/@/renderer/utils/query-params';
import { useScrollStore } from '/@/renderer/store/scroll.store';
interface UseItemListScrollPersistProps {
enabled: boolean;
}
export const useItemListScrollPersist = ({ enabled }: UseItemListScrollPersistProps) => {
const [searchParams, setSearchParams] = useSearchParams();
const location = useLocation();
const navigationType = useNavigationType();
const setOffset = useScrollStore((s) => s.setOffset);
const getOffset = useScrollStore((s) => s.getOffset);
const scrollOffset = useMemo(() => parseIntParam(searchParams, 'scrollOffset'), [searchParams]);
const scrollOffset = useMemo(() => {
if (navigationType !== 'POP') return undefined;
return getOffset(location.key);
}, [getOffset, location.key, navigationType]);
const handleOnScrollEnd = useCallback(
(offset: number) => {
if (!enabled) return;
setSearchParams((prev) => setSearchParam(prev, 'scrollOffset', offset), {
replace: true,
});
setOffset(location.key, offset);
},
[enabled, setSearchParams],
[enabled, location.key, setOffset],
);
return { handleOnScrollEnd, scrollOffset };
+1
View File
@@ -2,5 +2,6 @@ export * from './app.store';
export * from './auth.store';
export * from './full-screen-player.store';
export * from './player.store';
export * from './scroll.store';
export * from './settings.store';
export * from './timestamp.store';
+16
View File
@@ -0,0 +1,16 @@
import { create } from 'zustand';
type ScrollState = {
getOffset: (key: string) => number | undefined;
offsets: Record<string, number>;
setOffset: (key: string, offset: number) => void;
};
export const useScrollStore = create<ScrollState>((set, get) => ({
getOffset: (key) => get().offsets[key],
offsets: {},
setOffset: (key, offset) =>
set((s) => ({
offsets: { ...s.offsets, [key]: offset },
})),
}));