2024-08-03 19:14:38 +02:00
|
|
|
import React from 'react';
|
|
|
|
|
import { InView } from 'react-intersection-observer';
|
|
|
|
|
import { Message } from '@/components/messages/message';
|
2024-09-10 08:11:29 +02:00
|
|
|
import { useMessagesQuery } from '@/queries/use-messages-query';
|
2024-08-03 19:14:38 +02:00
|
|
|
|
|
|
|
|
interface MessageListProps {
|
2024-08-06 21:45:12 +02:00
|
|
|
conversationId: string;
|
2024-08-30 13:43:22 +02:00
|
|
|
onLastMessageIdChange: (id: string) => void;
|
2024-08-03 19:14:38 +02:00
|
|
|
}
|
|
|
|
|
|
2024-08-30 13:43:22 +02:00
|
|
|
export const MessageList = ({
|
|
|
|
|
conversationId,
|
|
|
|
|
onLastMessageIdChange,
|
|
|
|
|
}: MessageListProps) => {
|
|
|
|
|
const lastMessageId = React.useRef<string | null>(null);
|
2024-08-03 19:14:38 +02:00
|
|
|
|
2024-08-30 13:43:22 +02:00
|
|
|
const { data, isPending, isFetchingNextPage, fetchNextPage, hasNextPage } =
|
2024-09-10 08:11:29 +02:00
|
|
|
useMessagesQuery(conversationId);
|
2024-08-03 19:14:38 +02:00
|
|
|
|
2024-08-30 13:43:22 +02:00
|
|
|
React.useEffect(() => {
|
2024-09-10 08:11:29 +02:00
|
|
|
if (data?.length > 0) {
|
|
|
|
|
const lastMessage = data[data.length - 1];
|
2024-08-30 13:43:22 +02:00
|
|
|
if (lastMessage.id !== lastMessageId.current) {
|
|
|
|
|
lastMessageId.current = lastMessage.id;
|
|
|
|
|
onLastMessageIdChange(lastMessageId.current);
|
|
|
|
|
}
|
2024-08-03 19:14:38 +02:00
|
|
|
}
|
2024-09-10 08:11:29 +02:00
|
|
|
}, [data]);
|
2024-08-30 13:43:22 +02:00
|
|
|
|
|
|
|
|
if (isPending) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2024-08-03 19:14:38 +02:00
|
|
|
|
|
|
|
|
return (
|
2024-08-30 13:43:22 +02:00
|
|
|
<React.Fragment>
|
2024-08-03 19:14:38 +02:00
|
|
|
<InView
|
|
|
|
|
rootMargin="200px"
|
|
|
|
|
onChange={(inView) => {
|
2024-08-30 13:43:22 +02:00
|
|
|
if (inView && hasNextPage && !isFetchingNextPage) {
|
|
|
|
|
fetchNextPage();
|
|
|
|
|
}
|
2024-08-03 19:14:38 +02:00
|
|
|
}}
|
2024-08-30 13:43:22 +02:00
|
|
|
></InView>
|
2024-09-10 08:11:29 +02:00
|
|
|
{data.map((message, index) => {
|
|
|
|
|
const previousMessage = index > 0 ? data[index - 1] : null;
|
2024-08-03 19:14:38 +02:00
|
|
|
|
2024-08-30 13:43:22 +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
|
|
|
|
2024-08-30 13:43:22 +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
|
|
|
);
|
|
|
|
|
};
|