fix: removed overly complex scrolling logic in channel chat (#612)
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
import { MessageItem } from "@components/PageComponents/Messages/MessageItem.tsx";
|
import { MessageItem } from "@components/PageComponents/Messages/MessageItem.tsx";
|
||||||
import { InboxIcon } from "lucide-react";
|
import { InboxIcon } from "lucide-react";
|
||||||
import { useCallback, useEffect, useRef } from "react";
|
|
||||||
import { Message } from "@core/stores/messageStore/types.ts";
|
import { Message } from "@core/stores/messageStore/types.ts";
|
||||||
|
|
||||||
export interface ChannelChatProps {
|
export interface ChannelChatProps {
|
||||||
@@ -15,69 +14,22 @@ const EmptyState = () => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
export const ChannelChat = ({ messages = [] }: ChannelChatProps) => {
|
export const ChannelChat = ({ messages = [] }: ChannelChatProps) => {
|
||||||
const messagesEndRef = useRef<HTMLDivElement>(null);
|
|
||||||
const scrollContainerRef = useRef<HTMLUListElement>(null);
|
|
||||||
const userScrolledUpRef = useRef(false);
|
|
||||||
|
|
||||||
const scrollToBottom = useCallback((behavior: ScrollBehavior = "smooth") => {
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
messagesEndRef.current?.scrollIntoView({ behavior });
|
|
||||||
});
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const scrollContainer = scrollContainerRef.current;
|
|
||||||
if (!scrollContainer) return;
|
|
||||||
const isScrolledToBottom =
|
|
||||||
scrollContainer.scrollHeight - scrollContainer.scrollTop -
|
|
||||||
scrollContainer.clientHeight <= 10;
|
|
||||||
|
|
||||||
if (isScrolledToBottom || !userScrolledUpRef.current) {
|
|
||||||
scrollToBottom("smooth");
|
|
||||||
}
|
|
||||||
}, [messages, scrollToBottom]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const scrollContainer = scrollContainerRef.current;
|
|
||||||
const handleScroll = () => {
|
|
||||||
if (!scrollContainer) return;
|
|
||||||
const isAtBottom =
|
|
||||||
scrollContainer.scrollHeight - scrollContainer.scrollTop -
|
|
||||||
scrollContainer.clientHeight <= 10;
|
|
||||||
userScrolledUpRef.current = !isAtBottom;
|
|
||||||
};
|
|
||||||
scrollContainer?.addEventListener("scroll", handleScroll, {
|
|
||||||
passive: true,
|
|
||||||
});
|
|
||||||
return () => {
|
|
||||||
scrollContainer?.removeEventListener("scroll", handleScroll);
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
if (!messages?.length) {
|
if (!messages?.length) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-1 flex-col items-center justify-center">
|
<div className="flex flex-1 flex-col items-center justify-center">
|
||||||
<EmptyState />
|
<EmptyState />
|
||||||
<div ref={messagesEndRef} />
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ul
|
<ul className="flex flex-col-reverse flex-grow overflow-y-auto px-3 py-2 ">
|
||||||
ref={scrollContainerRef}
|
|
||||||
className="flex flex-col flex-grow overflow-y-auto px-3 py-2"
|
|
||||||
>
|
|
||||||
<div className="flex-grow" />
|
|
||||||
|
|
||||||
{messages?.map((message) => (
|
{messages?.map((message) => (
|
||||||
<MessageItem
|
<MessageItem
|
||||||
key={message.messageId ?? `${message.from}-${message.date}`}
|
key={message.messageId ?? `${message.from}-${message.date}`}
|
||||||
message={message}
|
message={message}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
<div ref={messagesEndRef} className="h-px" />
|
|
||||||
</ul>
|
</ul>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -81,8 +81,6 @@ export const subscribeAll = (
|
|||||||
|
|
||||||
connection.events.onMessagePacket.subscribe((messagePacket) => {
|
connection.events.onMessagePacket.subscribe((messagePacket) => {
|
||||||
// incoming and outgoing messages are handled by this event listener
|
// incoming and outgoing messages are handled by this event listener
|
||||||
console.log("Message Packet", messagePacket);
|
|
||||||
|
|
||||||
const dto = new PacketToMessageDTO(messagePacket, myNodeNum);
|
const dto = new PacketToMessageDTO(messagePacket, myNodeNum);
|
||||||
const message = dto.toMessage();
|
const message = dto.toMessage();
|
||||||
messageStore.saveMessage(message);
|
messageStore.saveMessage(message);
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ export const MessagesPage = () => {
|
|||||||
messages={getMessages({
|
messages={getMessages({
|
||||||
type: MessageType.Broadcast,
|
type: MessageType.Broadcast,
|
||||||
channelId: activeChat ?? 0,
|
channelId: activeChat ?? 0,
|
||||||
})}
|
}).reverse()}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case MessageType.Direct:
|
case MessageType.Direct:
|
||||||
@@ -153,7 +153,7 @@ export const MessagesPage = () => {
|
|||||||
type: MessageType.Direct,
|
type: MessageType.Direct,
|
||||||
nodeA: getMyNodeNum(),
|
nodeA: getMyNodeNum(),
|
||||||
nodeB: activeChat,
|
nodeB: activeChat,
|
||||||
})}
|
}).reverse()}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user