From b40ce941d985fc8435b2dc795233873632b0da5e Mon Sep 17 00:00:00 2001
From: Szymon Szlachtowicz <38212223+Szymx95@users.noreply.github.com>
Date: Wed, 6 Oct 2021 11:40:05 +0200
Subject: [PATCH] Load last day messages (#43)
---
packages/react-chat/src/components/Chat.tsx | 4 ++
.../src/components/Chat/ChatBody.tsx | 8 +++-
.../src/components/Chat/ChatMessages.tsx | 27 ++++++++++--
packages/react-chat/src/hooks/useMessenger.ts | 42 ++++++++++++++++++-
4 files changed, 75 insertions(+), 6 deletions(-)
diff --git a/packages/react-chat/src/components/Chat.tsx b/packages/react-chat/src/components/Chat.tsx
index 3d6ce7b..de04c01 100644
--- a/packages/react-chat/src/components/Chat.tsx
+++ b/packages/react-chat/src/components/Chat.tsx
@@ -29,6 +29,8 @@ export function Chat({ theme, community }: ChatProps) {
sendMessage,
notifications,
clearNotifications,
+ loadNextDay,
+ lastMessage,
} = useMessenger(
activeChannel.name,
channels.map((channel) => channel.name)
@@ -59,6 +61,8 @@ export function Chat({ theme, community }: ChatProps) {
showMembers={showMembers}
community={community}
showCommunity={!showChannels}
+ loadNextDay={() => loadNextDay(activeChannel.name)}
+ lastMessage={lastMessage}
/>
) : (
Connecting to waku
diff --git a/packages/react-chat/src/components/Chat/ChatBody.tsx b/packages/react-chat/src/components/Chat/ChatBody.tsx
index 1e8c7a8..4e4394b 100644
--- a/packages/react-chat/src/components/Chat/ChatBody.tsx
+++ b/packages/react-chat/src/components/Chat/ChatBody.tsx
@@ -28,6 +28,8 @@ interface ChatBodyProps {
notifications: { [id: string]: number };
setActiveChannel: (val: ChannelData) => void;
activeChannelId: number;
+ loadNextDay: () => void;
+ lastMessage: Date;
}
export function ChatBody({
@@ -42,6 +44,8 @@ export function ChatBody({
notifications,
setActiveChannel,
activeChannelId,
+ loadNextDay,
+ lastMessage,
}: ChatBodyProps) {
const narrow = useNarrow();
const [showChannelsList, setShowChannelsList] = useState(false);
@@ -90,7 +94,9 @@ export function ChatBody({
{!showChannelsList && !showMembersList && (
<>
- {" "}
+ {" "}
{messages.length > 0 ? (
) : (
diff --git a/packages/react-chat/src/components/Chat/ChatMessages.tsx b/packages/react-chat/src/components/Chat/ChatMessages.tsx
index fb3eac3..f4303fe 100644
--- a/packages/react-chat/src/components/Chat/ChatMessages.tsx
+++ b/packages/react-chat/src/components/Chat/ChatMessages.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useRef } from "react";
+import React, { useEffect, useMemo, useRef, useState } from "react";
import styled from "styled-components";
import { ChatMessage } from "../../models/ChatMessage";
@@ -14,13 +14,34 @@ type ChatMessagesProps = {
};
export function ChatMessages({ messages, theme }: ChatMessagesProps) {
+ const [scrollOnBot, setScrollOnBot] = useState(false);
const ref = useRef(null);
const today = useMemo(() => new Date().getDay(), []);
useEffect(() => {
- if (ref && ref.current) {
+ if (ref && ref.current && scrollOnBot) {
ref.current.scrollTop = ref.current.scrollHeight;
}
- }, [messages, messages.length]);
+ }, [messages, messages.length, scrollOnBot]);
+
+ useEffect(() => {
+ const setScroll = () => {
+ if (ref && ref.current) {
+ if (
+ ref.current.scrollTop + ref.current.clientHeight ==
+ ref.current.scrollHeight
+ ) {
+ setScrollOnBot(true);
+ } else {
+ if (scrollOnBot == true) {
+ setScrollOnBot(false);
+ }
+ }
+ }
+ };
+ ref.current?.addEventListener("scroll", setScroll);
+ return () => ref.current?.removeEventListener("scroll", setScroll);
+ }, [ref, scrollOnBot]);
+
return (
{messages.map((message, idx) => {
diff --git a/packages/react-chat/src/hooks/useMessenger.ts b/packages/react-chat/src/hooks/useMessenger.ts
index 82d4d08..f1204ad 100644
--- a/packages/react-chat/src/hooks/useMessenger.ts
+++ b/packages/react-chat/src/hooks/useMessenger.ts
@@ -37,6 +37,9 @@ export function useMessenger(chatId: string, chatIdList: string[]) {
const [notifications, setNotifications] = useState<{
[chatId: string]: number;
}>({});
+ const [lastLoadTime, setLastLoadTime] = useState<{
+ [chatId: string]: Date;
+ }>({});
const clearNotifications = useCallback((id: string) => {
setNotifications((prevNotifications) => {
@@ -111,10 +114,20 @@ export function useMessenger(chatId: string, chatIdList: string[]) {
Promise.all(
chatIdList.map(async (id) => {
+ const today = new Date();
+ const yesterday = new Date();
+ yesterday.setDate(today.getDate() - 1);
+ yesterday.setHours(0, 0, 0, 0);
+ setLastLoadTime((prev) => {
+ return {
+ ...prev,
+ [id]: yesterday,
+ };
+ });
await messenger.retrievePreviousMessages(
id,
- new Date(0),
- new Date(),
+ yesterday,
+ today,
(messages) => messages.forEach((msg) => addNewMessage(msg, id))
);
clearNotifications(id);
@@ -126,6 +139,29 @@ export function useMessenger(chatId: string, chatIdList: string[]) {
createMessenger();
}, []);
+ const loadNextDay = useCallback(
+ (id: string) => {
+ console.log(id);
+ if (messenger) {
+ const endTime = lastLoadTime[id];
+ const startTime = new Date();
+ startTime.setDate(endTime.getDate() - 1);
+ startTime.setHours(0, 0, 0, 0);
+
+ messenger.retrievePreviousMessages(id, startTime, endTime, (messages) =>
+ messages.forEach((msg) => addNewMessage(msg, id))
+ );
+ setLastLoadTime((prev) => {
+ return {
+ ...prev,
+ [id]: startTime,
+ };
+ });
+ }
+ },
+ [lastLoadTime, messenger]
+ );
+
const sendMessage = useCallback(
async (messageText: string) => {
await messenger?.sendMessage(messageText, chatId);
@@ -149,5 +185,7 @@ export function useMessenger(chatId: string, chatIdList: string[]) {
sendMessage,
notifications,
clearNotifications,
+ loadNextDay,
+ lastMessage: lastLoadTime[chatId],
};
}