From 7ab5d3bc1784d435891afb3dafa0b4aa28f1280e Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sun, 18 Jun 2023 12:04:08 +0200 Subject: [PATCH] Chat List: Fix missing chats on page load --- src/hooks/useInfiniteScroll.ts | 43 ++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/src/hooks/useInfiniteScroll.ts b/src/hooks/useInfiniteScroll.ts index b874350e9..746829688 100644 --- a/src/hooks/useInfiniteScroll.ts +++ b/src/hooks/useInfiniteScroll.ts @@ -23,15 +23,14 @@ const useInfiniteScroll = ( offsetId?: ListId; }>(); - const viewportIdsRef = useRef((() => { - // Only run once to initialize - if (!listIds || requestParamsRef.current) { - return undefined; - } - - const { newViewportIds } = getViewportSlice(listIds, LoadMoreDirection.Forwards, listSlice, listIds[0]); - return newViewportIds; - })()); + const currentStateRef = useRef<{ viewportIds: ListId[]; isOnTop: boolean } | undefined>(); + if (!currentStateRef.current && listIds && !isDisabled) { + const { + newViewportIds, + newIsOnTop, + } = getViewportSlice(listIds, LoadMoreDirection.Forwards, listSlice, listIds[0]); + currentStateRef.current = { viewportIds: newViewportIds, isOnTop: newIsOnTop }; + } const forceUpdate = useForceUpdate(); @@ -42,27 +41,26 @@ const useInfiniteScroll = ( const prevListIds = usePrevious(listIds); const prevIsDisabled = usePrevious(isDisabled); if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) { - const viewportIds = viewportIdsRef.current; - const isOnTop = viewportIds && viewportIds[0] === listIds[0]; - const currentMiddleId = !isOnTop && viewportIds ? viewportIds[Math.round(viewportIds.length / 2)] : undefined; + const { viewportIds, isOnTop } = currentStateRef.current || {}; + const currentMiddleId = viewportIds && !isOnTop ? viewportIds[Math.round(viewportIds.length / 2)] : undefined; const defaultOffsetId = currentMiddleId && listIds.includes(currentMiddleId) ? currentMiddleId : listIds[0]; const { offsetId = defaultOffsetId, direction = LoadMoreDirection.Forwards } = requestParamsRef.current || {}; - const { newViewportIds } = getViewportSlice(listIds, direction, listSlice, offsetId); + const { newViewportIds, newIsOnTop } = getViewportSlice(listIds, direction, listSlice, offsetId); requestParamsRef.current = {}; if (!viewportIds || !areSortedArraysEqual(viewportIds, newViewportIds)) { - viewportIdsRef.current = newViewportIds; + currentStateRef.current = { viewportIds: newViewportIds, isOnTop: newIsOnTop }; } } else if (!listIds) { - viewportIdsRef.current = undefined; + currentStateRef.current = undefined; } const getMore: GetMore = useLastCallback(({ direction, noScroll, }: { direction: LoadMoreDirection; noScroll?: boolean }) => { - const viewportIds = viewportIdsRef.current; + const { viewportIds } = currentStateRef.current || {}; const offsetId = viewportIds ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0] @@ -77,11 +75,11 @@ const useInfiniteScroll = ( } const { - newViewportIds, areSomeLocal, areAllLocal, + newViewportIds, areSomeLocal, areAllLocal, newIsOnTop, } = getViewportSlice(listIds, direction, listSlice, offsetId); if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) { - viewportIdsRef.current = newViewportIds; + currentStateRef.current = { viewportIds: newViewportIds, isOnTop: newIsOnTop }; forceUpdate(); } @@ -94,7 +92,7 @@ const useInfiniteScroll = ( } }); - return isDisabled ? [listIds] : [viewportIdsRef.current, getMore]; + return isDisabled ? [listIds] : [currentStateRef.current?.viewportIds, getMore]; }; function getViewportSlice( @@ -124,7 +122,12 @@ function getViewportSlice( break; } - return { newViewportIds, areSomeLocal, areAllLocal }; + return { + newViewportIds, + areSomeLocal, + areAllLocal, + newIsOnTop: newViewportIds[0] === sourceIds[0], + }; } export default useInfiniteScroll;