diff --git a/src/libneochat/enums/messagecomponenttype.h b/src/libneochat/enums/messagecomponenttype.h index 138de5f66..ca41c164c 100644 --- a/src/libneochat/enums/messagecomponenttype.h +++ b/src/libneochat/enums/messagecomponenttype.h @@ -70,9 +70,11 @@ public: * * @param event the event to return a type for. * + * @param isInReply whether this event is to be treated like a replied-to event (i.e., a basic text fallback should be shown if no other type is used) + * * @sa Type */ - static Type typeForEvent(const Quotient::RoomEvent &event) + static Type typeForEvent(const Quotient::RoomEvent &event, bool isInReply = false) { using namespace Quotient; @@ -103,7 +105,8 @@ public: if (event.matrixType() == u"org.matrix.msc3672.beacon_info"_s) { return MessageComponentType::LiveLocation; } - return MessageComponentType::Other; + // In the (unlikely) case that this is a reply to a state event, we do want to show something + return isInReply ? MessageComponentType::Text : MessageComponentType::Other; } if (is(event)) { return MessageComponentType::Encrypted; @@ -116,7 +119,8 @@ public: return MessageComponentType::Poll; } - return MessageComponentType::Other; + // In the (unlikely) case that this is a reply to an unusual event, we do want to show something + return isInReply ? MessageComponentType::Text : MessageComponentType::Other; } /** diff --git a/src/libneochat/eventhandler.cpp b/src/libneochat/eventhandler.cpp index 250102fed..dedb62559 100644 --- a/src/libneochat/eventhandler.cpp +++ b/src/libneochat/eventhandler.cpp @@ -451,6 +451,9 @@ QString EventHandler::getBody(const NeoChatRoom *room, const Quotient::RoomEvent [](const EncryptedEvent &) { return i18nc("@info In room list", "Encrypted event"); }, + [](const ReactionEvent &e) { + return i18nc("[user] reacted with ", "reacted with %1", e.key()); + }, i18n("Unknown event")); } diff --git a/src/libneochat/texthandler.cpp b/src/libneochat/texthandler.cpp index 90ec94d35..cc98bf3d5 100644 --- a/src/libneochat/texthandler.cpp +++ b/src/libneochat/texthandler.cpp @@ -590,7 +590,7 @@ TextHandler::textComponents(QString string, Qt::TextFormat inputFormat, const Ne string = string.trimmed(); if (event != nullptr && room != nullptr) { - if (auto e = eventCast(event); e->msgtype() == Quotient::MessageEventType::Emote && components.size() == 1) { + if (auto e = eventCast(event); e && e->msgtype() == Quotient::MessageEventType::Emote && components.size() == 1) { if (components[0].type == MessageComponentType::Text) { components[0].content = emoteString(room, event) + components[0].content; } else { diff --git a/src/messagecontent/models/messagecontentmodel.cpp b/src/messagecontent/models/messagecontentmodel.cpp index 3f74ffd20..0eb5fc7ad 100644 --- a/src/messagecontent/models/messagecontentmodel.cpp +++ b/src/messagecontent/models/messagecontentmodel.cpp @@ -512,7 +512,7 @@ QList MessageContentModel::messageContentComponents(bool isEdi if (isEditing) { newComponents += MessageComponent{MessageComponentType::ChatBar, QString(), {}}; } else { - newComponents.append(componentsForType(MessageComponentType::typeForEvent(*event.first))); + newComponents.append(componentsForType(MessageComponentType::typeForEvent(*event.first, m_isReply))); } if (m_room->urlPreviewEnabled()) { @@ -598,20 +598,23 @@ QList MessageContentModel::componentsForType(MessageComponentT switch (type) { case MessageComponentType::Text: { - const auto roomMessageEvent = eventCast(event.first); - auto body = EventHandler::rawMessageBody(*roomMessageEvent); - if (body.trimmed().isEmpty()) { - return TextHandler().textComponents(i18n("This event does not have any content."), - Qt::TextFormat::RichText, - m_room, - roomMessageEvent, - roomMessageEvent->isReplaced()); + if (const auto roomMessageEvent = eventCast(event.first)) { + auto body = EventHandler::rawMessageBody(*roomMessageEvent); + if (body.trimmed().isEmpty()) { + return TextHandler().textComponents(i18n("This event does not have any content."), + Qt::TextFormat::RichText, + m_room, + roomMessageEvent, + roomMessageEvent->isReplaced()); + } else { + return TextHandler().textComponents(body, + EventHandler::messageBodyInputFormat(*roomMessageEvent), + m_room, + roomMessageEvent, + roomMessageEvent->isReplaced()); + } } else { - return TextHandler().textComponents(body, - EventHandler::messageBodyInputFormat(*roomMessageEvent), - m_room, - roomMessageEvent, - roomMessageEvent->isReplaced()); + return TextHandler().textComponents(EventHandler::plainBody(m_room, event.first), Qt::TextFormat::PlainText, m_room, event.first, false); } } case MessageComponentType::File: {