chunking messages is working :)

This commit is contained in:
slawk0
2024-11-10 15:25:56 +01:00
parent 8907650fc0
commit b80e193bbd
5 changed files with 39 additions and 37 deletions

View File

@@ -54,7 +54,7 @@ export async function getMessages(
cursor: number | null = 0,
limit: number = 50,
): Promise<{ messages: MessagesProps[]; nextCursor: number | null }> {
if (contact == null) {
if (contact === null || cursor === null) {
return { messages: [], nextCursor: null };
}
try {

View File

@@ -31,7 +31,6 @@ function ContactsList({
setCurrentContact,
updateContactStatus,
setMessages,
currentContact,
}: ContactsListProps) {
function contactHandler(contactsList: ContactsProps) {
setContactsList((prevContacts) => {
@@ -50,7 +49,6 @@ function ContactsList({
const fetchContacts = async () => {
const contacts: ContactsProps[] = await getContactsList();
console.log('Fetching contacts list');
console.log(contacts);
contacts.forEach(contactHandler);
};
@@ -60,11 +58,9 @@ function ContactsList({
return;
}
if (!currentContact === null) {
fetchContacts().catch((e) =>
console.error('Failed to fetch contacts: ', e),
);
}
fetchContacts().catch((e) =>
console.error('Failed to fetch contacts: ', e),
);
return () => {
if (!socket) {

View File

@@ -1,8 +1,8 @@
import { useEffect, useRef, useState } from 'react';
import { useEffect, useRef } from 'react';
import { socket } from '../../socket/socket.tsx';
import { useOutletContext } from 'react-router-dom';
import { UsernameType } from '../../utils/ProtectedRoutes.tsx';
import { sendContact, setContactStatus } from '../../api/contactsApi.tsx';
import { sendContact } from '../../api/contactsApi.tsx';
type ChatMessages = {
sender: string;
@@ -31,44 +31,34 @@ type MessagesAreaProps = {
cursor: number | null;
messageHandler: (msg: ChatMessages) => void;
setContactsList: React.Dispatch<React.SetStateAction<ContactsProps[]>>;
fetchPreviousMessages: (contact: string | null) => Promise<void>;
};
function MessagesArea({
messages,
setMessages,
currentContact,
updateContactStatus,
setCursor,
cursor,
setContactsList,
messageHandler,
fetchPreviousMessages,
}: MessagesAreaProps) {
const messagesEndRef = useRef<HTMLDivElement>(null);
const containerRef = useRef<HTMLDivElement>(null);
const { username }: UsernameType = useOutletContext();
let scrollPosition = 0;
function messageHandler(msg: ChatMessages) {
setMessages((prevMessages) => {
if (!prevMessages.some((m) => m.message_id === msg.message_id)) {
return [...prevMessages, msg];
}
return prevMessages;
});
}
const handleScroll = () => {
const container = containerRef.current;
if (container && container.scrollTop < 30) {
scrollPosition = container.scrollTop;
fetchPreviousMessages(currentContact).catch((e) =>
console.error('Failed to fetch messages: ', e),
);
}
};
useEffect(() => {
if (!socket) {
console.error('Socket not initialized');
return;
}
const handleScroll = () => {
const container = containerRef.current;
if (container) {
if (container.scrollTop === 0) {
console.log('Scrolled to top!');
}
}
};
if (!socket) return;
const currentContainer = containerRef.current;
if (currentContainer) {
@@ -106,7 +96,7 @@ function MessagesArea({
console.error('Socket not initialized');
return;
}
// Clean up event listeners
if (currentContainer) {
currentContainer.removeEventListener('scroll', handleScroll);
}
@@ -121,7 +111,7 @@ function MessagesArea({
const messageList = messages.map((msg: ChatMessages) => (
<li className="ml-2 rounded p-1 hover:bg-gray-800" key={msg.message_id}>
{msg.sender}: {msg.message}
{msg.message_id} {msg.sender}: {msg.message}
</li>
));

View File

@@ -66,6 +66,21 @@ function Chat() {
console.log('Fetching messages for: ', currentContact);
messages.messages.forEach(messageHandler);
};
const fetchPreviousMessages = async (contact: string | null) => {
const messages = await getMessages(contact, cursor, 50);
console.log('Fetching messages for: ', contact);
setCursor(messages.nextCursor);
messages.messages.forEach((msg) => {
setMessages((prevMessages) => {
if (!prevMessages.some((m) => m.message_id === msg.message_id)) {
return [msg, ...prevMessages];
}
return prevMessages;
});
});
};
function messageHandler(msg: ChatMessages) {
setMessages((prevMessages) => {
// Check if the message already exists in the state
@@ -129,6 +144,7 @@ function Chat() {
cursor={cursor}
messageHandler={messageHandler}
setContactsList={setContactsList}
fetchPreviousMessages={fetchPreviousMessages}
/>
</div>
<div className="flex-shrink-0 mb-2 mt-0">

View File

@@ -149,7 +149,7 @@ async function getMessages(username, recipient, limit = 50, cursor = 0) {
const messages = results.rows;
const nextCursor =
messages.length > limit ? messages[limit - 1].message_id : null;
messages.length > limit ? messages[limit - 2].message_id : null;
return { messages: messages.reverse(), nextCursor: nextCursor };
} catch (e) {