From 1727475336792722d428ad2db41af643c7474083 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun <cheeaun@gmail.com> Date: Tue, 10 Jan 2023 01:31:38 +0800 Subject: [PATCH] Reduce more code for scrolling logic - Move from sessionStorage to in-memory for statuses cache - Remove userInitiated, it's getting hard to differentiate between user-initiated and non-user-initiated. Probably better done from the route side instead of only stuck to this component's state --- src/pages/status.jsx | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/pages/status.jsx b/src/pages/status.jsx index b4841445..abfd9a4c 100644 --- a/src/pages/status.jsx +++ b/src/pages/status.jsx @@ -14,7 +14,7 @@ import RelativeTime from '../components/relative-time'; import Status from '../components/status'; import htmlContentLength from '../utils/html-content-length'; import shortenNumber from '../utils/shorten-number'; -import states from '../utils/states'; +import states, { saveStatus } from '../utils/states'; import store from '../utils/store'; import useDebouncedCallback from '../utils/useDebouncedCallback'; import useTitle from '../utils/useTitle'; @@ -25,7 +25,6 @@ function StatusPage({ id }) { const snapStates = useSnapshot(states); const [statuses, setStatuses] = useState([]); const [uiState, setUIState] = useState('default'); - const userInitiated = useRef(true); // Initial open is user-initiated const heroStatusRef = useRef(); const scrollableRef = useRef(); @@ -49,12 +48,13 @@ function StatusPage({ id }) { }, [id]); const scrollOffsets = useRef(); + const cachedStatusesMap = useRef({}); const initContext = () => { console.debug('initContext', id); setUIState('loading'); let heroTimer; - const cachedStatuses = store.session.getJSON('statuses-' + id); + const cachedStatuses = cachedStatusesMap.current[id]; if (cachedStatuses) { // Case 1: It's cached, let's restore them to make it snappy const reallyCachedStatuses = cachedStatuses.filter( @@ -85,7 +85,11 @@ function StatusPage({ id }) { } else { try { heroStatus = await heroFetch(); - states.statuses[id] = heroStatus; + saveStatus(heroStatus); + // Give time for context to appear + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); } catch (e) { console.error(e); setUIState('error'); @@ -153,7 +157,7 @@ function StatusPage({ id }) { }; console.log({ allStatuses }); setStatuses(allStatuses); - store.session.setJSON('statuses-' + id, allStatuses); + cachedStatusesMap.current[id] = allStatuses; } catch (e) { console.error(e); setUIState('error'); @@ -168,11 +172,11 @@ function StatusPage({ id }) { useEffect(initContext, [id]); useEffect(() => { if (!statuses.length) return; + console.debug('STATUSES', statuses); const scrollPosition = states.scrollPositions[id]; console.debug('scrollPosition', scrollPosition); - if (!userInitiated.current && !!scrollPosition) { + if (!!scrollPosition) { console.debug('Case 1', { - userInitiated: userInitiated.current, scrollPosition, }); scrollableRef.current.scrollTop = scrollPosition; @@ -184,7 +188,6 @@ function StatusPage({ id }) { const newScrollTop = newScrollOffsets.offsetTop - scrollOffsets.current.offsetTop; console.debug('Case 2', { - userInitiated: userInitiated.current, scrollOffsets: scrollOffsets.current, newScrollOffsets, newScrollTop, @@ -193,9 +196,10 @@ function StatusPage({ id }) { scrollableRef.current.scrollTop = newScrollTop; } - // Reset - userInitiated.current = false; + // RESET + // This will probably fail when user "forward" back to open the Status page again, but gosh, too many use-cases to mimic what the browser does scrollOffsets.current = null; + cachedStatusesMap.current = {}; }, [statuses]); useEffect(() => { @@ -384,9 +388,6 @@ function StatusPage({ id }) { status-link " href={`#/s/${statusID}`} - onClick={() => { - userInitiated.current = true; - }} > <Status statusID={statusID} @@ -409,9 +410,6 @@ function StatusPage({ id }) { <SubComments hasManyStatuses={hasManyStatuses} replies={replies} - onStatusLinkClick={() => { - userInitiated.current = true; - }} /> )} {uiState === 'loading' &&