retain virtuoso scroll position

This commit is contained in:
plebeius.eth
2023-07-14 14:37:12 +02:00
parent 80edd688da
commit e08c7a6b13
3 changed files with 65 additions and 4 deletions
+21 -2
View File
@@ -43,6 +43,7 @@ import useAnonModeStore from '../../hooks/stores/useAnonModeStore';
import useGeneralStore from '../../hooks/stores/useGeneralStore';
import packageJson from '../../../package.json'
const {version} = packageJson
let lastVirtuosoStates = {};
const Board = () => {
@@ -103,6 +104,7 @@ const Board = () => {
const quoteRefsMobile = useRef({});
const postOnHoverRef = useRef(null);
const selectedThreadCidRef = useRef(null);
const virtuosoRef = useRef();
const { feed, hasMore, loadMore } = useFeed({subplebbitAddresses: [`${selectedAddress}`], sortType: 'active'});
const subplebbit = useSubplebbit({subplebbitAddress: selectedAddress});
@@ -648,7 +650,21 @@ const Board = () => {
};
useEffect(() => {
const setLastVirtuosoState = () => {
virtuosoRef.current?.getState((snapshot) => {
if (snapshot?.ranges?.length) {
lastVirtuosoStates[selectedAddress] = snapshot;
}
});
};
window.addEventListener('scroll', setLastVirtuosoState);
return () => window.removeEventListener('scroll', setLastVirtuosoState);
}, [selectedAddress]);
const lastVirtuosoState = lastVirtuosoStates[selectedAddress];
return (
<>
@@ -1267,7 +1283,7 @@ const Board = () => {
</>
: null}
<Virtuoso
increaseViewportBy={2000}
increaseViewportBy={{bottom: 600, top: 600}}
data={selectedFeed}
itemContent={(index, thread) => {
const { displayedReplies, omittedCount } = filteredRepliesByThread[thread.cid] || {};
@@ -2825,6 +2841,9 @@ const Board = () => {
</Fragment>
);
}}
ref={virtuosoRef}
restoreStateFrom={lastVirtuosoState}
initialScrollTop={lastVirtuosoState?.scrollTop}
endReached={tryLoadMore}
useWindowScroll={true}
components={{ Footer: hasMore && feed.length > 0 ? () => <PostLoader /> : null }}