From 85932c1dd2cba3825a02809f03a489b73ffd1322 Mon Sep 17 00:00:00 2001 From: Szymon Szlachtowicz <38212223+Szymx95@users.noreply.github.com> Date: Wed, 13 Oct 2021 14:02:32 +0200 Subject: [PATCH] Improve loading previous messages (#68) --- packages/react-chat/src/components/Chat.tsx | 2 ++ .../react-chat/src/components/Chat/ChatBody.tsx | 3 +++ .../src/components/Chat/ChatMessages.tsx | 16 +++++++++++++--- packages/react-chat/src/hooks/useMessenger.ts | 9 ++++++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/react-chat/src/components/Chat.tsx b/packages/react-chat/src/components/Chat.tsx index fbea869c..fe9fd7ef 100644 --- a/packages/react-chat/src/components/Chat.tsx +++ b/packages/react-chat/src/components/Chat.tsx @@ -32,6 +32,7 @@ export function Chat({ theme, community, fetchMetadata }: ChatProps) { notifications, clearNotifications, loadNextDay, + loadingMessages, } = useMessenger( activeChannel.name, channels.map((channel) => channel.name) @@ -68,6 +69,7 @@ export function Chat({ theme, community, fetchMetadata }: ChatProps) { loadNextDay={() => loadNextDay(activeChannel.name)} onCommunityClick={showModal} fetchMetadata={fetchMetadata} + loadingMessages={loadingMessages} /> {showMembers && !narrow && ( diff --git a/packages/react-chat/src/components/Chat/ChatBody.tsx b/packages/react-chat/src/components/Chat/ChatBody.tsx index fb72dd83..950c722f 100644 --- a/packages/react-chat/src/components/Chat/ChatBody.tsx +++ b/packages/react-chat/src/components/Chat/ChatBody.tsx @@ -35,6 +35,7 @@ interface ChatBodyProps { loadNextDay: () => void; onCommunityClick: () => void; fetchMetadata?: (url: string) => Promise; + loadingMessages: boolean; } export function ChatBody({ @@ -53,6 +54,7 @@ export function ChatBody({ loadNextDay, onCommunityClick, fetchMetadata, + loadingMessages, }: ChatBodyProps) { const narrow = useNarrow(); const [showChannelsList, setShowChannelsList] = useState(false); @@ -112,6 +114,7 @@ export function ChatBody({ messages={messages} loadNextDay={loadNextDay} fetchMetadata={fetchMetadata} + loadingMessages={loadingMessages} /> ) : ( diff --git a/packages/react-chat/src/components/Chat/ChatMessages.tsx b/packages/react-chat/src/components/Chat/ChatMessages.tsx index 0650df27..4bf04e05 100644 --- a/packages/react-chat/src/components/Chat/ChatMessages.tsx +++ b/packages/react-chat/src/components/Chat/ChatMessages.tsx @@ -15,12 +15,14 @@ type ChatMessagesProps = { messages: ChatMessage[]; loadNextDay: () => void; fetchMetadata?: (url: string) => Promise; + loadingMessages: boolean; }; export function ChatMessages({ messages, loadNextDay, fetchMetadata, + loadingMessages, }: ChatMessagesProps) { const [scrollOnBot, setScrollOnBot] = useState(true); const ref = useRef(null); @@ -31,6 +33,12 @@ export function ChatMessages({ } }, [messages, messages.length, scrollOnBot]); + useEffect(() => { + if ((ref?.current?.clientHeight ?? 0) < (ref?.current?.scrollHeight ?? 0)) { + loadNextDay(); + } + }, [messages, messages.length]); + useEffect(() => { const setScroll = () => { if (ref && ref.current) { @@ -63,9 +71,11 @@ export function ChatMessages({ image={image} /> setLink("")} link={link} /> - - - + {loadingMessages && ( + + + + )} {messages.map((message, idx) => { return ( diff --git a/packages/react-chat/src/hooks/useMessenger.ts b/packages/react-chat/src/hooks/useMessenger.ts index fd432463..9932da63 100644 --- a/packages/react-chat/src/hooks/useMessenger.ts +++ b/packages/react-chat/src/hooks/useMessenger.ts @@ -46,6 +46,7 @@ export function useMessenger(chatId: string, chatIdList: string[]) { [chatId: string]: Date; }>({}); const [lastMessage, setLastMessage] = useState(new Date()); + const [loadingMessages, setLoadingMessages] = useState(false); useEffect(() => { if (lastLoadTime.current?.[chatId]) { @@ -112,6 +113,7 @@ export function useMessenger(chatId: string, chatIdList: string[]) { if (timeDiff < 30) { if (!loadingPreviousMessages.current[id]) { loadingPreviousMessages.current[id] = true; + setLoadingMessages(true); const amountOfMessages = await messenger.retrievePreviousMessages( id, startTime, @@ -122,6 +124,7 @@ export function useMessenger(chatId: string, chatIdList: string[]) { setLastMessage(startTime); } loadingPreviousMessages.current[id] = false; + setLoadingMessages(false); if (amountOfMessages === 0) { loadNextDay(id); } @@ -186,7 +189,6 @@ export function useMessenger(chatId: string, chatIdList: string[]) { const sendMessage = useCallback( async (messageText?: string, image?: Uint8Array) => { - // TODO: A message can either contain text or media, not both. if (messageText) { await messenger?.sendMessage(chatId, { text: messageText, @@ -209,6 +211,10 @@ export function useMessenger(chatId: string, chatIdList: string[]) { [messages, chatId] ); + useEffect(() => { + setLoadingMessages(loadingPreviousMessages.current[chatId]); + }, [chatId]); + return { messenger, messages: activeMessages, @@ -217,5 +223,6 @@ export function useMessenger(chatId: string, chatIdList: string[]) { clearNotifications, loadNextDay, lastMessage, + loadingMessages, }; }