Message List: Fix history scrolling on short list
This commit is contained in:
parent
15557c6dc7
commit
abde05413d
@ -93,6 +93,7 @@ const MessageListContent: FC<OwnProps> = ({
|
|||||||
} = useMessageObservers(type, containerRef, memoFirstUnreadIdRef, onPinnedIntersectionChange, chatId);
|
} = useMessageObservers(type, containerRef, memoFirstUnreadIdRef, onPinnedIntersectionChange, chatId);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
withHistoryTriggers,
|
||||||
backwardsTriggerRef,
|
backwardsTriggerRef,
|
||||||
forwardsTriggerRef,
|
forwardsTriggerRef,
|
||||||
fabTriggerRef,
|
fabTriggerRef,
|
||||||
@ -273,16 +274,18 @@ const MessageListContent: FC<OwnProps> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="messages-container" teactFastList>
|
<div className="messages-container" teactFastList>
|
||||||
<div ref={backwardsTriggerRef} key="backwards-trigger" className="backwards-trigger" />
|
{withHistoryTriggers && <div ref={backwardsTriggerRef} key="backwards-trigger" className="backwards-trigger" />}
|
||||||
{dateGroups.flat()}
|
{dateGroups.flat()}
|
||||||
{!isCurrentUserPremium && isViewportNewest && (
|
{!isCurrentUserPremium && isViewportNewest && (
|
||||||
<SponsoredMessage key={chatId} chatId={chatId} containerRef={containerRef} />
|
<SponsoredMessage key={chatId} chatId={chatId} containerRef={containerRef} />
|
||||||
)}
|
)}
|
||||||
<div
|
{withHistoryTriggers && (
|
||||||
ref={forwardsTriggerRef}
|
<div
|
||||||
key="forwards-trigger"
|
ref={forwardsTriggerRef}
|
||||||
className="forwards-trigger"
|
key="forwards-trigger"
|
||||||
/>
|
className="forwards-trigger"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<div
|
<div
|
||||||
ref={fabTriggerRef}
|
ref={fabTriggerRef}
|
||||||
key="fab-trigger"
|
key="fab-trigger"
|
||||||
|
|||||||
@ -14,7 +14,6 @@ import { isLocalMessageId } from '../../../global/helpers';
|
|||||||
import useLastCallback from '../../../hooks/useLastCallback';
|
import useLastCallback from '../../../hooks/useLastCallback';
|
||||||
import { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';
|
import { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';
|
||||||
import useSyncEffect from '../../../hooks/useSyncEffect';
|
import useSyncEffect from '../../../hooks/useSyncEffect';
|
||||||
import { useStateRef } from '../../../hooks/useStateRef';
|
|
||||||
import { useSignalEffect } from '../../../hooks/useSignalEffect';
|
import { useSignalEffect } from '../../../hooks/useSignalEffect';
|
||||||
import { useDebouncedSignal } from '../../../hooks/useAsyncResolvers';
|
import { useDebouncedSignal } from '../../../hooks/useAsyncResolvers';
|
||||||
|
|
||||||
@ -52,10 +51,10 @@ export default function useScrollHooks(
|
|||||||
// eslint-disable-next-line no-null/no-null
|
// eslint-disable-next-line no-null/no-null
|
||||||
const fabTriggerRef = useRef<HTMLDivElement>(null);
|
const fabTriggerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
function toggleScrollTools() {
|
const toggleScrollTools = useLastCallback(() => {
|
||||||
if (!isReady) return;
|
if (!isReady) return;
|
||||||
|
|
||||||
if (!messageIds || !messageIds.length) {
|
if (!messageIds?.length) {
|
||||||
onFabToggle(false);
|
onFabToggle(false);
|
||||||
onNotchToggle(false);
|
onNotchToggle(false);
|
||||||
return;
|
return;
|
||||||
@ -81,7 +80,7 @@ export default function useScrollHooks(
|
|||||||
|
|
||||||
onFabToggle(isUnread ? !isAtBottom : !isNearBottom);
|
onFabToggle(isUnread ? !isAtBottom : !isNearBottom);
|
||||||
onNotchToggle(!isAtBottom);
|
onNotchToggle(!isAtBottom);
|
||||||
}
|
});
|
||||||
|
|
||||||
const {
|
const {
|
||||||
observe: observeIntersection,
|
observe: observeIntersection,
|
||||||
@ -113,8 +112,10 @@ export default function useScrollHooks(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
useOnIntersect(backwardsTriggerRef, observeIntersection);
|
const withHistoryTriggers = messageIds && messageIds.length > 1;
|
||||||
useOnIntersect(forwardsTriggerRef, observeIntersection);
|
|
||||||
|
useOnIntersect(backwardsTriggerRef, withHistoryTriggers ? observeIntersection : undefined);
|
||||||
|
useOnIntersect(forwardsTriggerRef, withHistoryTriggers ? observeIntersection : undefined);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
observe: observeIntersectionForFab,
|
observe: observeIntersectionForFab,
|
||||||
@ -140,12 +141,11 @@ export default function useScrollHooks(
|
|||||||
|
|
||||||
useOnIntersect(fabTriggerRef, observeIntersectionForNotch);
|
useOnIntersect(fabTriggerRef, observeIntersectionForNotch);
|
||||||
|
|
||||||
const toggleScrollToolsRef = useStateRef(toggleScrollTools);
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isReady) {
|
if (isReady) {
|
||||||
toggleScrollToolsRef.current!();
|
toggleScrollTools();
|
||||||
}
|
}
|
||||||
}, [isReady, toggleScrollToolsRef]);
|
}, [isReady, toggleScrollTools]);
|
||||||
|
|
||||||
const freezeShortly = useLastCallback(() => {
|
const freezeShortly = useLastCallback(() => {
|
||||||
freezeForFab();
|
freezeForFab();
|
||||||
@ -164,5 +164,10 @@ export default function useScrollHooks(
|
|||||||
const getContainerHeightDebounced = useDebouncedSignal(getContainerHeight, CONTAINER_HEIGHT_DEBOUNCE);
|
const getContainerHeightDebounced = useDebouncedSignal(getContainerHeight, CONTAINER_HEIGHT_DEBOUNCE);
|
||||||
useSignalEffect(freezeShortly, [freezeShortly, getContainerHeightDebounced]);
|
useSignalEffect(freezeShortly, [freezeShortly, getContainerHeightDebounced]);
|
||||||
|
|
||||||
return { backwardsTriggerRef, forwardsTriggerRef, fabTriggerRef };
|
return {
|
||||||
|
withHistoryTriggers,
|
||||||
|
backwardsTriggerRef,
|
||||||
|
forwardsTriggerRef,
|
||||||
|
fabTriggerRef,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user