Chat List: Fix part of chats missing until scroll
This commit is contained in:
parent
1951dacd2d
commit
b73c61889c
@ -1111,7 +1111,7 @@ function getViewportSlice(
|
|||||||
let areAllLocal;
|
let areAllLocal;
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case LoadMoreDirection.Backwards:
|
case LoadMoreDirection.Backwards:
|
||||||
areSomeLocal = indexForDirection > 0;
|
areSomeLocal = indexForDirection >= 0;
|
||||||
areAllLocal = from >= 0;
|
areAllLocal = from >= 0;
|
||||||
break;
|
break;
|
||||||
case LoadMoreDirection.Forwards:
|
case LoadMoreDirection.Forwards:
|
||||||
|
|||||||
@ -16,14 +16,14 @@ const useInfiniteScroll = <ListId extends string | number>(
|
|||||||
isDisabled = false,
|
isDisabled = false,
|
||||||
listSlice = DEFAULT_LIST_SLICE,
|
listSlice = DEFAULT_LIST_SLICE,
|
||||||
): [ListId[]?, GetMore?] => {
|
): [ListId[]?, GetMore?] => {
|
||||||
const lastParamsRef = useRef<{
|
const requestParamsRef = useRef<{
|
||||||
direction?: LoadMoreDirection;
|
direction?: LoadMoreDirection;
|
||||||
offsetId?: ListId;
|
offsetId?: ListId;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const viewportIdsRef = useRef<ListId[] | undefined>((() => {
|
const viewportIdsRef = useRef<ListId[] | undefined>((() => {
|
||||||
// Only run once to initialize
|
// Only run once to initialize
|
||||||
if (!listIds || lastParamsRef.current) {
|
if (!listIds || requestParamsRef.current) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,16 +34,22 @@ const useInfiniteScroll = <ListId extends string | number>(
|
|||||||
const forceUpdate = useForceUpdate();
|
const forceUpdate = useForceUpdate();
|
||||||
|
|
||||||
if (isDisabled) {
|
if (isDisabled) {
|
||||||
lastParamsRef.current = {};
|
requestParamsRef.current = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
const prevListIds = usePrevious(listIds);
|
const prevListIds = usePrevious(listIds);
|
||||||
const prevIsDisabled = usePrevious(isDisabled);
|
const prevIsDisabled = usePrevious(isDisabled);
|
||||||
if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {
|
if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {
|
||||||
const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};
|
const viewportIds = viewportIdsRef.current;
|
||||||
|
const isOnTop = viewportIds && viewportIds[0] === listIds[0];
|
||||||
|
const currentMiddleId = !isOnTop && viewportIds ? 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 } = getViewportSlice(listIds, direction, listSlice, offsetId);
|
||||||
|
|
||||||
if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {
|
requestParamsRef.current = {};
|
||||||
|
|
||||||
|
if (!viewportIds || !areSortedArraysEqual(viewportIds, newViewportIds)) {
|
||||||
viewportIdsRef.current = newViewportIds;
|
viewportIdsRef.current = newViewportIds;
|
||||||
}
|
}
|
||||||
} else if (!listIds) {
|
} else if (!listIds) {
|
||||||
@ -68,10 +74,6 @@ const useInfiniteScroll = <ListId extends string | number>(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!noScroll) {
|
|
||||||
lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };
|
|
||||||
}
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
newViewportIds, areSomeLocal, areAllLocal,
|
newViewportIds, areSomeLocal, areAllLocal,
|
||||||
} = getViewportSlice(listIds, direction, listSlice, offsetId);
|
} = getViewportSlice(listIds, direction, listSlice, offsetId);
|
||||||
@ -82,6 +84,10 @@ const useInfiniteScroll = <ListId extends string | number>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!areAllLocal && loadMoreBackwards) {
|
if (!areAllLocal && loadMoreBackwards) {
|
||||||
|
if (!noScroll) {
|
||||||
|
requestParamsRef.current = { ...requestParamsRef.current, direction, offsetId };
|
||||||
|
}
|
||||||
|
|
||||||
loadMoreBackwards({ offsetId });
|
loadMoreBackwards({ offsetId });
|
||||||
}
|
}
|
||||||
}, [listIds, listSlice, loadMoreBackwards, forceUpdate]);
|
}, [listIds, listSlice, loadMoreBackwards, forceUpdate]);
|
||||||
@ -107,7 +113,7 @@ function getViewportSlice<ListId extends string | number>(
|
|||||||
let areAllLocal;
|
let areAllLocal;
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case LoadMoreDirection.Forwards:
|
case LoadMoreDirection.Forwards:
|
||||||
areSomeLocal = indexForDirection > 0;
|
areSomeLocal = indexForDirection >= 0;
|
||||||
areAllLocal = from >= 0;
|
areAllLocal = from >= 0;
|
||||||
break;
|
break;
|
||||||
case LoadMoreDirection.Backwards:
|
case LoadMoreDirection.Backwards:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user