Skip to content
This repository has been archived by the owner on Jun 29, 2024. It is now read-only.

Commit

Permalink
update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
wsekta committed Jan 3, 2024
1 parent f32ed28 commit b7bbf33
Show file tree
Hide file tree
Showing 12 changed files with 303 additions and 7 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ vcpkg_installed
.cache
lib
CMakeLists.txt.user
coverage.txt
8 changes: 8 additions & 0 deletions apps/client/gui/controllers/MessagesController.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "MessagesController.h"

#include <loguru.hpp>
#include <ranges>

namespace client::gui
Expand Down Expand Up @@ -57,4 +58,11 @@ void MessagesController::setMessageStorage(const std::shared_ptr<storage::Messag

emit scrollDown();
}

void MessagesController::requestMoreMessages()
{
LOG_S(INFO) << "Requesting more messages";

emit getMoreMessages();
}
}
2 changes: 2 additions & 0 deletions apps/client/gui/controllers/MessagesController.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@ class MessagesController : public QObject
void newMessageToSend(const QString& messageText);
void messagesUpdated();
void scrollDown();
void getMoreMessages();

public slots:
void handleMessageUpdate(bool shouldScrollDown = false);
void setMessageStorage(const std::shared_ptr<storage::MessageStorage>& messageStorage);
void requestMoreMessages();

private:
std::shared_ptr<api::Session> session;
Expand Down
45 changes: 42 additions & 3 deletions apps/client/gui/qml/components/messages/MessageView.qml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import "../../common/settings.js" as Settings
Rectangle {
id: messagesView
color: Settings.backgroundColor
property bool requestedMoreMessages: false
property int previousMessagesCount: 0
property var previousScrollBarPosition: 0

function setTextPlaceholder(text: string) {
messageInput.placeholderText = text;
Expand Down Expand Up @@ -35,6 +38,21 @@ Rectangle {
messageData: modelData
width: messagesView.width
}
onContentYChanged: {
console.log(`scrollbar position: ${messagesScrollView.ScrollBar.vertical.position}`);
if (messagesScrollView.ScrollBar.vertical.position > 0.01) {
messagesView.previousScrollBarPosition = messagesScrollView.ScrollBar.vertical.position;
}
if (messagesScrollView.ScrollBar.vertical.position > 0.4) {
messagesView.requestedMoreMessages = false;
}
if (messagesScrollView.contentHeight > messagesScrollView.height
&& messagesScrollView.ScrollBar.vertical.position < 0.3
&& messagesView.requestedMoreMessages === false) {
messagesView.requestedMoreMessages = true;
messagesController.requestMoreMessages();
}
}
}
}

Expand All @@ -58,9 +76,9 @@ Rectangle {
Keys.onReturnPressed: (event) => {
if (event.modifiers & Qt.ShiftModifier) {
text += "\n"
messageInput.cursorPosition = messageInput.length
messageInput.cursorPosition = messageInput.length;
} else {
sendMessage()
sendMessage();
}
}
background: Rectangle {
Expand All @@ -75,7 +93,28 @@ Rectangle {
target: messagesController

function onScrollDown() {
messagesScrollView.ScrollBar.vertical.position = messagesScrollView.contentHeight
messagesScrollView.ScrollBar.vertical.position = 1 - messagesScrollView.ScrollBar.vertical.size;
}

function onMessagesChanged() {
if (messagesView.previousMessagesCount !== 0 && messagesController.messages.length !== messagesView.previousMessagesCount) {
let maxScrollPosition = 1 - messagesScrollView.ScrollBar.vertical.size;

let newScrollPosition = (1 - messagesView.previousMessagesCount / messagesController.messages.length)
+ messagesView.previousScrollBarPosition * messagesView.previousMessagesCount / messagesController.messages.length;
console.log(`scrollbar position: ${messagesView.previousScrollBarPosition} `
+ `new scroll position: ${newScrollPosition} `
+ `previous messages count: ${messagesView.previousMessagesCount} `
+ `previous scrollbar position: ${messagesView.previousScrollBarPosition} `
+ `messages count: ${messagesController.messages.length}`
+ `scrollbar size: ${messagesScrollView.ScrollBar.vertical.size}`);
messagesScrollView.ScrollBar.vertical.position = newScrollPosition * maxScrollPosition;
}
messagesView.previousMessagesCount = messagesController.messages.length;

if (messagesScrollView.ScrollBar.vertical.position > 0.4) {
messagesView.requestedMoreMessages = false;
}
}
}
}
16 changes: 12 additions & 4 deletions apps/client/gui/states/channel/ChannelController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,13 @@ void ChannelController::goToChannel(const QString& channelName, const QString& c

if (not isActivated or currentChannelId != channelId.toStdString())
{
if (conversationStorage->hasConversation(currentChannelId))
if (conversationStorage->hasConversation(channelId.toStdString()))
{
messageStorage = conversationStorage->getConversation(currentChannelId);
messageStorage = conversationStorage->getConversation(channelId.toStdString());
}
else
{
messageStorage = conversationStorage->createConversation(currentChannelId);
messageStorage = conversationStorage->createConversation(channelId.toStdString());
}

emit setMessageStorage(messageStorage);
Expand Down Expand Up @@ -294,7 +294,7 @@ void ChannelController::handleGetChannelMessagesResponse(const common::messages:

if (responseJson.at("data").at("messages").empty())
{
emit messagesUpdated(true);
emit messagesUpdated(false);

return;
}
Expand All @@ -310,4 +310,12 @@ void ChannelController::handleGetChannelMessagesResponse(const common::messages:
LOG_S(ERROR) << "Response without messages";
}
}

void ChannelController::getMoreMessages()
{
auto offset = messageStorage->getMessages().size();

session->sendMessage(common::messages::MessageId::GetChannelMessages,
nlohmann::json{{"channelId", currentChannelId}, {"offset", offset}, {"limit", 50}});
}
}
1 change: 1 addition & 0 deletions apps/client/gui/states/channel/ChannelController.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public slots:
void goToChannel(const QString& channelName, const QString& channelId, bool isOwner);
void goToPrivateMessages();
void sendChannelMessage(const QString& messageText);
void getMoreMessages();

private:
void handleLeftChannelResponse(const common::messages::Message& message);
Expand Down
6 changes: 6 additions & 0 deletions apps/client/gui/states/channel/ChannelState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ void ChannelState::activate()
QObject::connect(channelController.get(), &ChannelController::setMessageStorage, messagesController.get(),
&MessagesController::setMessageStorage);

QObject::connect(messagesController.get(), &MessagesController::getMoreMessages, channelController.get(),
&ChannelController::getMoreMessages);

loaderController->getEngine()->rootContext()->setContextProperty(leftColumnController->getName(),
leftColumnController.get());

Expand Down Expand Up @@ -73,6 +76,9 @@ void ChannelState::deactivate()
QObject::disconnect(channelController.get(), &ChannelController::setMessageStorage, messagesController.get(),
&MessagesController::setMessageStorage);

QObject::disconnect(messagesController.get(), &MessagesController::getMoreMessages, channelController.get(),
&ChannelController::getMoreMessages);

loaderController->getEngine()->rootContext()->setContextProperty(leftColumnController->getName(), nullptr);

loaderController->getEngine()->rootContext()->setContextProperty(channelController->getName(), nullptr);
Expand Down
2 changes: 2 additions & 0 deletions apps/server/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ set(SOURCES
api/messageHandlers/friend/removeFromFriendsMessageHandler/RemoveFromFriendsMessageHandler.cpp
api/messageHandlers/messages/sendMessageToChannelMessageHandler/SendMessageToChannelMessageHandler.cpp
api/messageHandlers/messages/getMessagesFromChannelMessageHandler/GetMessagesFromChannelMessageHandler.cpp
api/messageHandlers/messages/getMessagesFromGroupMessageHandler/GetMessagesFromGroupMessageHandler.cpp

domain/entities/message/Message.cpp
infrastructure/repositories/messageRepository/MessageRepositoryImpl.cpp
Expand Down Expand Up @@ -184,6 +185,7 @@ set(UT_SOURCES
api/messageHandlers/friend/removeFromFriendsMessageHandler/RemoveFromFriendsMessageHandlerTest.cpp
api/messageHandlers/messages/sendMessageToChannelMessageHandler/SendMessageToChannelMessageHandlerTest.cpp
api/messageHandlers/messages/getMessagesFromChannelMessageHandler/GetMessagesFromChannelMessageHandlerTest.cpp
api/messageHandlers/messages/getMessagesFromGroupMessageHandler/GetMessagesFromGroupMessageHandlerTest.cpp
)

set(IT_SOURCES
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#include "GetMessagesFromGroupMessageHandler.h"

#include "nlohmann/json.hpp"

namespace server::api
{
GetMessagesFromGroupMessageHandler::GetMessagesFromGroupMessageHandler(
std::shared_ptr<application::TokenService> tokenServiceInit,
std::unique_ptr<application::FindGroupMessagesQueryHandler> findGroupMessagesQueryHandlerInit)
: tokenService{std::move(tokenServiceInit)}, findGroupMessagesQueryHandler{std::move(findGroupMessagesQueryHandler)}
{
}

common::messages::Message
GetMessagesFromGroupMessageHandler::handleMessage(const common::messages::Message& message) const
{
try
{
auto payloadJson = nlohmann::json::parse(static_cast<std::string>(message.payload));

auto token = payloadJson["token"].get<std::string>();
auto groupId = payloadJson["data"]["groupId"].get<std::string>();
auto limit = payloadJson["data"]["limit"].get<unsigned>();
auto offset = payloadJson["data"]["offset"].get<unsigned>();

tokenService->verifyToken(token);

auto [messages, totalCount] =
findGroupMessagesQueryHandler->execute({.groupId = groupId, .offset = offset, .limit = limit});

nlohmann::json responsePayload;

responsePayload["data"]["messages"] = nlohmann::json::array();
responsePayload["data"]["totalCount"] = totalCount;

for (const auto& message : messages)
{
responsePayload["data"]["messages"].push_back({
{"id", message.getId()},
{"text", message.getContent()},
{"senderName", message.getSender()->getNickname()},
{"sentAt", message.getCreatedAt()},
});
}

return {common::messages::MessageId::GetPrivateMessagesResponse, common::bytes::Bytes{responsePayload.dump()}};
}
catch (const std::exception& e)
{
nlohmann::json responsePayload{{"error", e.what()}};

return {common::messages::MessageId::GetChannelMessagesResponse, common::bytes::Bytes{responsePayload.dump()}};
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

#include <memory>

#include "../../MessageHandler.h"
#include "server/application/queryHandlers/message/findGroupMessagesQueryHandler/FindGroupMessagesQueryHandler.h"
#include "server/application/services/tokenService/TokenService.h"

namespace server::api
{
class GetMessagesFromGroupMessageHandler : public MessageHandler
{
public:
GetMessagesFromGroupMessageHandler(
std::shared_ptr<application::TokenService> tokenService,
std::unique_ptr<application::FindGroupMessagesQueryHandler> findGroupMessagesQueryHandler);

common::messages::Message handleMessage(const common::messages::Message& message) const override;

private:
std::shared_ptr<application::TokenService> tokenService;
std::unique_ptr<application::FindGroupMessagesQueryHandler> findGroupMessagesQueryHandler;
};
}
Loading

0 comments on commit b7bbf33

Please sign in to comment.