diff --git a/src/api/gateway/globalGatewayConnection.js b/src/api/gateway/globalGatewayConnection.js
index 5de06ec..b1e3f36 100644
--- a/src/api/gateway/globalGatewayConnection.js
+++ b/src/api/gateway/globalGatewayConnection.js
@@ -18,6 +18,7 @@ const wsCloseCodes = {
NOT_AUTHORIZED: [4006, "Not authorized"],
FLOODING: [4007, "Flooding"],
NO_PING: [4008, "No ping"],
+ UNSUPPORTED_ATTRIBUTE: [4009, "Unsupported attribute."],
};
const cancelReconnectionForCodes = [
wsCloseCodes.NOT_AUTHENTICATED[0],
@@ -25,6 +26,7 @@ const cancelReconnectionForCodes = [
wsCloseCodes.SERVER_DENIED_CONNECTION[0],
wsCloseCodes.TOO_MANY_SESSIONS[0],
wsCloseCodes.FLOODING[0],
+ wsCloseCodes.UNSUPPORTED_ATTRIBUTE[0],
];
globalGatewayConnection.onopen = (sessionData) => {
diff --git a/src/common/store.js b/src/common/store.js
index 0f33f6b..b5b304a 100644
--- a/src/common/store.js
+++ b/src/common/store.js
@@ -54,6 +54,19 @@ const reducer = (state = intitialState, payload) => {
};
}
+ case 'messagestore/addmessagesback': {
+ return {
+ ...state,
+ messages: {
+ ...state.messages,
+ [payload.channelId]: [
+ ...payload.messages,
+ ...state.messages[payload.channelId] || []
+ ]
+ }
+ };
+ }
+
case 'channels/selectchannel': {
return {
...state,
diff --git a/src/components/channel/ChannelMessageView.js b/src/components/channel/ChannelMessageView.js
index ba31574..8a8f3b2 100644
--- a/src/components/channel/ChannelMessageView.js
+++ b/src/components/channel/ChannelMessageView.js
@@ -1,22 +1,51 @@
-import { useRef, useEffect } from 'react';
+import { useRef, useEffect, useState } from 'react';
+import { useDispatch } from "react-redux";
+import { authenticated } from "../../api/request";
import Message from "../Message";
-export default function ChannelMessageView({messages}) {
+export default function ChannelMessageView({ messages, channelId }) {
const invisibleBottomMessageRef = useRef();
+ const [isLoading, setIsLoading] = useState(false);
+ const dispatch = useDispatch();
+ const scroller = useRef();
+
+ const loadOlderMessages = () => {
+ if (isLoading) return;
+ if (!channelId) return;
+ setIsLoading(true);
+
+ const request = messages[0] ? `/api/v1/content/channel/${channelId}/messages?before=${messages[0]._id}` : `/api/v1/content/channel/${channelId}/messages`;
+
+ authenticated(request)
+ .then((res) => {
+ if (res.json.channelMessages)
+ dispatch({
+ type: "messagestore/addmessagesback",
+ messages: res.json.channelMessages.reverse(),
+ channelId
+ })
+ })
+ .then(() => {
+ setIsLoading(false);
+ });
+ };
+
+ const onScroll = () => {
+ if (scroller.current.scrollTop === 0) {
+ loadOlderMessages();
+ }
+ };
+
+ useEffect(loadOlderMessages, [channelId, dispatch]);
+
useEffect(() => {
invisibleBottomMessageRef.current.scrollIntoView(true);
}, [messages]);
- let messagesView = messages.map((message) => (