Support replying and editing messages directly from room search

There's two parts to making this work mainly:
1. Use getEvent instead of findInTimeline so the related event is
actually found.
2. Close the dialog once a reply relation is found, so you can easily
reply in the chat bar.
This commit is contained in:
Joshua Goins
2026-01-15 16:54:52 -05:00
parent dc935e09b7
commit d5260376d2
4 changed files with 28 additions and 10 deletions

View File

@@ -150,9 +150,9 @@ Quotient::RoomMember ChatBarCache::relationAuthor() const
if (m_relationId.isEmpty()) {
return room->member(QString());
}
const auto evtIt = room->findInTimeline(m_relationId);
if (evtIt != room->messageEvents().rend()) {
return room->member((*evtIt)->senderId());
const auto [event, _] = room->getEvent(m_relationId);
if (event != nullptr) {
return room->member(event->senderId());
}
qWarning() << "Failed to find relation" << m_relationId << "in timeline?";
return room->member(QString());
@@ -178,8 +178,8 @@ QString ChatBarCache::relationMessage() const
return {};
}
if (auto event = room->findInTimeline(m_relationId); event != room->historyEdge()) {
return EventHandler::markdownBody(&**event);
if (auto [event, _] = room->getEvent(m_relationId); event != nullptr) {
return EventHandler::markdownBody(event);
}
return {};
}
@@ -285,11 +285,6 @@ void ChatBarCache::postMessage()
return;
}
const auto replyIt = room->findInTimeline(replyId());
if (replyIt == room->historyEdge()) {
isReply = false;
}
auto content = std::make_unique<Quotient::EventContent::TextContent>(sendText, u"text/html"_s);
room->post<Quotient::RoomMessageEvent>(text(), *std::get<std::optional<Quotient::RoomMessageEvent::MsgType>>(result), std::move(content), relatesTo);

View File

@@ -3,6 +3,8 @@
import QtQuick
import org.kde.kirigami as Kirigami
import org.kde.neochat.libneochat
import org.kde.neochat.timeline
@@ -45,4 +47,15 @@ SearchPage {
noResultPlaceholderMessage: i18n("No messages found")
listVerticalLayoutDirection: ListView.BottomToTop
Connections {
target: root.room.mainCache
function onRelationIdChanged(oldEventId: string, newEventId: string): void {
// If we start replying/editing an event, we need to close the search dialog so the user can type.
if (newEventId.length > 0) {
root.Kirigami.PageStack.closeDialog();
}
}
}
}

View File

@@ -227,6 +227,7 @@ MessageDelegateBase {
quickActionComponent: QuickActions {
room: root.room
eventId: root.eventId
author: root.author
}
QtObject {

View File

@@ -22,6 +22,15 @@ RowLayout {
*/
required property string eventId
/**
* @brief The message author.
*
* A Quotient::RoomMember object.
*
* @sa Quotient::RoomMember
*/
required property var author
property real availableWidth: 0.0
property bool reacting: false