Files
colanode/desktop/src/components/messages/message-list.tsx

73 lines
2.2 KiB
TypeScript
Raw Normal View History

2024-08-03 19:14:38 +02:00
import React from 'react';
import { InView } from 'react-intersection-observer';
import { Message } from '@/components/messages/message';
import { useMessagesQuery } from '@/queries/use-messages-query';
2024-08-03 19:14:38 +02:00
interface MessageListProps {
conversationId: string;
onLastMessageIdChange: (id: string) => void;
2024-08-03 19:14:38 +02:00
}
export const MessageList = ({
conversationId,
onLastMessageIdChange,
}: MessageListProps) => {
const lastMessageId = React.useRef<string | null>(null);
2024-08-03 19:14:38 +02:00
const { data, isPending, isFetchingNextPage, fetchNextPage, hasNextPage } =
useMessagesQuery(conversationId);
2024-08-03 19:14:38 +02:00
React.useEffect(() => {
if (data?.length > 0) {
const lastMessage = data[data.length - 1];
if (lastMessage.id !== lastMessageId.current) {
lastMessageId.current = lastMessage.id;
onLastMessageIdChange(lastMessageId.current);
}
2024-08-03 19:14:38 +02:00
}
}, [data]);
if (isPending) {
return null;
}
2024-08-03 19:14:38 +02:00
return (
<React.Fragment>
2024-08-03 19:14:38 +02:00
<InView
rootMargin="200px"
onChange={(inView) => {
if (inView && hasNextPage && !isFetchingNextPage) {
fetchNextPage();
}
2024-08-03 19:14:38 +02:00
}}
></InView>
{data.map((message, index) => {
const previousMessage = index > 0 ? data[index - 1] : null;
2024-08-03 19:14:38 +02:00
const currentMessageDate = new Date(message.createdAt);
const previousMessageDate = previousMessage
? new Date(previousMessage.createdAt)
: null;
const showDate =
!previousMessageDate ||
currentMessageDate.getDate() !== previousMessageDate.getDate();
2024-08-03 19:14:38 +02:00
return (
<React.Fragment key={message.id}>
{showDate && (
<div className="relative flex items-center py-1">
<div className="flex-grow border-t border-gray-100" />
<span className="mx-4 flex-shrink text-xs text-muted-foreground">
{currentMessageDate.toDateString()}
</span>
<div className="flex-grow border-t border-gray-100" />
</div>
)}
<Message message={message} previousMessage={previousMessage} />
</React.Fragment>
);
})}
</React.Fragment>
2024-08-03 19:14:38 +02:00
);
};