refactor: update auto scroll mechanism (#970)
This commit is contained in:
parent
1fd2302914
commit
45978c27a2
13 changed files with 250 additions and 52 deletions
49
hooks/use-scroll-to-bottom.tsx
Normal file
49
hooks/use-scroll-to-bottom.tsx
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import useSWR from 'swr';
|
||||
import { useRef, useEffect, useCallback } from 'react';
|
||||
|
||||
type ScrollFlag = ScrollBehavior | false;
|
||||
|
||||
export function useScrollToBottom() {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const endRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const { data: isAtBottom = false, mutate: setIsAtBottom } = useSWR(
|
||||
'messages:is-at-bottom',
|
||||
null,
|
||||
{ fallbackData: false },
|
||||
);
|
||||
|
||||
const { data: scrollBehavior = false, mutate: setScrollBehavior } =
|
||||
useSWR<ScrollFlag>('messages:should-scroll', null, { fallbackData: false });
|
||||
|
||||
useEffect(() => {
|
||||
if (scrollBehavior) {
|
||||
endRef.current?.scrollIntoView({ behavior: scrollBehavior });
|
||||
setScrollBehavior(false);
|
||||
}
|
||||
}, [setScrollBehavior, scrollBehavior]);
|
||||
|
||||
const scrollToBottom = useCallback(
|
||||
(scrollBehavior: ScrollBehavior = 'smooth') => {
|
||||
setScrollBehavior(scrollBehavior);
|
||||
},
|
||||
[setScrollBehavior],
|
||||
);
|
||||
|
||||
function onViewportEnter() {
|
||||
setIsAtBottom(true);
|
||||
}
|
||||
|
||||
function onViewportLeave() {
|
||||
setIsAtBottom(false);
|
||||
}
|
||||
|
||||
return {
|
||||
containerRef,
|
||||
endRef,
|
||||
isAtBottom,
|
||||
scrollToBottom,
|
||||
onViewportEnter,
|
||||
onViewportLeave,
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue