|
|
|
@ -390,7 +390,6 @@ function useScrollToBottom() {
|
|
|
|
|
|
|
|
|
|
// auto scroll
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
console.log("auto scroll", autoScroll);
|
|
|
|
|
if (autoScroll) {
|
|
|
|
|
scrollDomToBottom();
|
|
|
|
|
}
|
|
|
|
@ -919,9 +918,15 @@ function _Chat() {
|
|
|
|
|
userInput,
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const [msgRenderIndex, setMsgRenderIndex] = useState(
|
|
|
|
|
renderMessages.length - CHAT_PAGE_SIZE,
|
|
|
|
|
const [msgRenderIndex, _setMsgRenderIndex] = useState(
|
|
|
|
|
Math.max(0, renderMessages.length - CHAT_PAGE_SIZE),
|
|
|
|
|
);
|
|
|
|
|
function setMsgRenderIndex(newIndex: number) {
|
|
|
|
|
newIndex = Math.min(renderMessages.length - CHAT_PAGE_SIZE, newIndex);
|
|
|
|
|
newIndex = Math.max(0, newIndex);
|
|
|
|
|
_setMsgRenderIndex(newIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const messages = useMemo(() => {
|
|
|
|
|
const endRenderIndex = Math.min(
|
|
|
|
|
msgRenderIndex + 3 * CHAT_PAGE_SIZE,
|
|
|
|
@ -931,21 +936,20 @@ function _Chat() {
|
|
|
|
|
}, [msgRenderIndex, renderMessages]);
|
|
|
|
|
|
|
|
|
|
const onChatBodyScroll = (e: HTMLElement) => {
|
|
|
|
|
const EDGE_THRESHOLD = 100;
|
|
|
|
|
const bottomHeight = e.scrollTop + e.clientHeight;
|
|
|
|
|
const isTouchTopEdge = e.scrollTop <= EDGE_THRESHOLD;
|
|
|
|
|
const isTouchBottomEdge = bottomHeight >= e.scrollHeight - EDGE_THRESHOLD;
|
|
|
|
|
const edgeThreshold = e.clientHeight;
|
|
|
|
|
|
|
|
|
|
const isTouchTopEdge = e.scrollTop <= edgeThreshold;
|
|
|
|
|
const isTouchBottomEdge = bottomHeight >= e.scrollHeight - edgeThreshold;
|
|
|
|
|
const isHitBottom = bottomHeight >= e.scrollHeight - 10;
|
|
|
|
|
|
|
|
|
|
const prevPageMsgIndex = msgRenderIndex - CHAT_PAGE_SIZE;
|
|
|
|
|
const nextPageMsgIndex = msgRenderIndex + CHAT_PAGE_SIZE;
|
|
|
|
|
|
|
|
|
|
if (isTouchTopEdge) {
|
|
|
|
|
setMsgRenderIndex(Math.max(0, msgRenderIndex - CHAT_PAGE_SIZE));
|
|
|
|
|
setMsgRenderIndex(prevPageMsgIndex);
|
|
|
|
|
} else if (isTouchBottomEdge) {
|
|
|
|
|
setMsgRenderIndex(
|
|
|
|
|
Math.min(
|
|
|
|
|
msgRenderIndex + CHAT_PAGE_SIZE,
|
|
|
|
|
renderMessages.length - CHAT_PAGE_SIZE,
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
setMsgRenderIndex(nextPageMsgIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setHitBottom(isHitBottom);
|
|
|
|
|