Page MenuHomePhorge

D296.1781649635.diff
No OneTemporary

Size
11 KB
Referenced Files
None
Subscribers
None

D296.1781649635.diff

diff --git a/src/client/room/local-draft.hpp b/src/client/room/local-draft.hpp
new file mode 100644
--- /dev/null
+++ b/src/client/room/local-draft.hpp
@@ -0,0 +1,61 @@
+/*
+ * This file is part of libkazv.
+ * SPDX-FileCopyrightText: 2026 nannanko <nannankokazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+#pragma once
+#include <libkazv-config.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/version.hpp>
+
+namespace Kazv
+{
+ /**
+ * Local draft.
+ */
+ struct LocalDraft
+ {
+ std::string text;
+ std::string relType;
+ std::string relatedEventId;
+ friend bool operator==(const LocalDraft &a, const LocalDraft &b) = default;
+ friend bool operator!=(const LocalDraft &a, const LocalDraft &b) = default;
+ };
+}
+
+namespace boost::serialization
+{
+ template<class Archive>
+ void save(Archive &ar, const Kazv::LocalDraft &l, std::uint32_t const version)
+ {
+ using namespace Kazv;
+ ar
+ & l.text
+ & l.relType
+ & l.relatedEventId;
+ }
+
+ template<class Archive>
+ void load(Archive &ar, Kazv::LocalDraft &l, std::uint32_t const version)
+ {
+ using namespace Kazv;
+ ar
+ & l.text
+ & l.relType
+ & l.relatedEventId;
+ }
+
+ template<class Archive>
+ void serialize(Archive &ar, Kazv::LocalDraft &l, std::uint32_t const version)
+ {
+ using boost::serialization::split_free;
+ split_free(ar, l, version);
+ }
+}
+
+BOOST_CLASS_VERSION(Kazv::LocalDraft, 10)
diff --git a/src/client/room/room-model.hpp b/src/client/room/room-model.hpp
--- a/src/client/room/room-model.hpp
+++ b/src/client/room/room-model.hpp
@@ -27,6 +27,7 @@
#include "push-rules-desc.hpp"
#include "local-echo.hpp"
#include "clientutil.hpp"
+#include "local-draft.hpp"
namespace Kazv
{
@@ -115,11 +116,35 @@
EventList events;
};
- struct SetLocalDraftAction
+ struct SetLocalDraftTextAction
{
std::string localDraft;
};
+ struct SetLocalDraftRelAction
+ {
+ std::string relType;
+ std::string relatedEventId;
+ };
+
+ struct SetLocalDraftAction
+ {
+ std::string text;
+ std::string relType;
+ std::string relatedEventId;
+ };
+
+ struct PushLocalDraftAction
+ {
+ std::string text;
+ std::string relType;
+ std::string relatedEventId;
+ };
+
+ struct PopLocalDraftAction
+ {
+ };
+
struct SetRoomEncryptionAction
{
};
@@ -256,7 +281,9 @@
immer::map<std::string, Event> ephemeral;
- std::string localDraft;
+ immer::flex_vector<LocalDraft> localDrafts{
+ Kazv::LocalDraft{"", "", ""}
+ };
bool encrypted{false};
/// a marker to indicate whether we need to rotate
@@ -376,7 +403,11 @@
ChangeMembershipAction,
ChangeInviteStateAction,
AddEphemeralAction,
+ SetLocalDraftTextAction,
+ SetLocalDraftRelAction,
SetLocalDraftAction,
+ PushLocalDraftAction,
+ PopLocalDraftAction,
SetRoomEncryptionAction,
MarkMembersFullyLoadedAction,
SetHeroIdsAction,
@@ -441,8 +472,6 @@
& r.timelineGaps
& r.ephemeral
- & r.localDraft
-
& r.encrypted
& r.shouldRotateSessionKey
@@ -491,6 +520,9 @@
if (version >= 9) {
ar & r.nonTimelineEvents;
}
+ if (version >= 10) {
+ ar & r.localDrafts;
+ }
}
template<class Archive>
@@ -502,5 +534,5 @@
BOOST_CLASS_VERSION(Kazv::PendingRoomKeyEvent, 1)
BOOST_CLASS_VERSION(Kazv::ReadReceipt, 0)
-BOOST_CLASS_VERSION(Kazv::RoomModel, 9)
+BOOST_CLASS_VERSION(Kazv::RoomModel, 10)
BOOST_CLASS_VERSION(Kazv::RoomListModel, 0)
diff --git a/src/client/room/room-model.cpp b/src/client/room/room-model.cpp
--- a/src/client/room/room-model.cpp
+++ b/src/client/room/room-model.cpp
@@ -276,8 +276,43 @@
r.ephemeral = merge(std::move(r.ephemeral), a.events, keyOfEphemeral);
return r;
},
+ [&](SetLocalDraftTextAction a) {
+ r.localDrafts = r.localDrafts.update(0,
+ [&a](auto localDraft) {
+ localDraft.text = a.localDraft;
+ return localDraft;
+ });
+ return r;
+ },
+ [&](SetLocalDraftRelAction a) {
+ r.localDrafts = r.localDrafts.update(0,
+ [&a](auto localDraft) {
+ localDraft.relType = a.relType;
+ localDraft.relatedEventId = a.relatedEventId;
+ return localDraft;
+ });
+ return r;
+ },
[&](SetLocalDraftAction a) {
- r.localDraft = a.localDraft;
+ r.localDrafts = r.localDrafts.update(0,
+ [&a](auto localDraft) {
+ localDraft.text = a.text;
+ localDraft.relType = a.relType;
+ localDraft.relatedEventId = a.relatedEventId;
+ return localDraft;
+ });
+ return r;
+ },
+ [&](PushLocalDraftAction a) {
+ r.localDrafts = r.localDrafts.push_front({
+ a.text,
+ a.relType,
+ a.relatedEventId
+ });
+ return r;
+ },
+ [&](PopLocalDraftAction) {
+ r.localDrafts = r.localDrafts.drop(1);
return r;
},
[&](SetRoomEncryptionAction) {
diff --git a/src/client/room/room.hpp b/src/client/room/room.hpp
--- a/src/client/room/room.hpp
+++ b/src/client/room/room.hpp
@@ -335,8 +335,8 @@
KAZV_WRAP_ATTR(RoomModel, roomCursor(), roomId);
/*lager::reader<RoomMembership>*/
KAZV_WRAP_ATTR(RoomModel, roomCursor(), membership);
- /*lager::reader<std::string>*/
- KAZV_WRAP_ATTR(RoomModel, roomCursor(), localDraft);
+ /*lager::reader<immer::flex_vector<Kazv::LocalDraft>>*/
+ KAZV_WRAP_ATTR(RoomModel, roomCursor(), localDrafts);
/* lager::reader<bool> */
KAZV_WRAP_ATTR(RoomModel, roomCursor(), membersFullyLoaded);
@@ -375,13 +375,68 @@
* Set local draft for this room.
*
* After the returned Promise is resolved,
- * @c localDraft() will contain @c localDraft .
+ * @c localDrafts() will contain @c localDrafts.
*
* @param localDraft The local draft to send.
* @return A Promise that resolves when the local draft
* has been set, or when there is an error.
*/
- PromiseT setLocalDraft(std::string localDraft) const;
+ PromiseT setLocalDraftText(std::string localDraft) const;
+
+ /**
+ * Set event related to local draft for this room.
+ *
+ * After the returned Promise is resolved,
+ * @c localDrafts() will contain @c localDrafts.
+ *
+ * @param draftRelType The relate type, one of ["m.replace", "m.reply"]
+ * @param relatedEventId The eventId related to the local draft.
+ * @return A Promise that resolves when the event
+ * has been set, or when there is an error.
+ */
+ PromiseT setLocalDraftRel(std::string draftRelType,
+ std::string relatedEventId) const;
+
+ /**
+ * Set current local draft and related event for this room.
+ *
+ * After the returned Promise is resolved,
+ * @c localDrafts() will contain @c localDrafts.
+ *
+ * @param text The local draft to send.
+ * @param relType One of ["m.replace", "m.reply"].
+ * @param relatedEventId The eventId related to the local draft.
+ * @return A Promise that resolves when the local draft
+ * has been set, or when there is an error.
+ */
+ PromiseT setLocalDraft(std::string text,
+ std::string relType, std::string relatedEventId) const;
+
+ /**
+ * Push a local draft and related event for this room.
+ *
+ * After the returned Promise is resolved,
+ * @c localDrafts() will contain @c localDrafts.
+ *
+ * @param text The local draft to send.
+ * @param relType One of ["m.replace", "m.reply"].
+ * @param relatedEventId The eventId related to the local draft.
+ * @return A Promise that resolves when the local draft
+ * has been set, or when there is an error.
+ */
+ PromiseT pushLocalDraft(std::string text,
+ std::string relType, std::string relatedEventId) const;
+
+ /**
+ * Pop a Kazv::LocalDraft in RoomModel::localDrafts.
+ *
+ * After the returned Promise is resolved,
+ * @c localDrafts() will contain @c localDrafts.
+ *
+ * @return A Promise that resolves when the local drafts
+ * has been popped, or when there is an error.
+ */
+ PromiseT popLocalDraft() const;
/**
* Send an event to this room.
diff --git a/src/client/room/room.cpp b/src/client/room/room.cpp
--- a/src/client/room/room.cpp
+++ b/src/client/room/room.cpp
@@ -11,6 +11,7 @@
#include <debug.hpp>
#include "room.hpp"
+#include "sdk-model-cursor-tag.hpp"
namespace Kazv
{
@@ -316,11 +317,43 @@
});
}
- auto Room::setLocalDraft(std::string localDraft) const
+ auto Room::setLocalDraftText(std::string localDraft) const
-> PromiseT
{
using namespace CursorOp;
- return m_ctx.dispatch(UpdateRoomAction{+roomId(), SetLocalDraftAction{localDraft}});
+ return m_ctx.dispatch(UpdateRoomAction{
+ +roomId(), SetLocalDraftTextAction{localDraft}});
+ }
+
+ auto Room::setLocalDraftRel(std::string draftRelType,
+ std::string relatedEventId) const -> PromiseT
+ {
+ using namespace CursorOp;
+ return m_ctx.dispatch(UpdateRoomAction(
+ +roomId(), SetLocalDraftRelAction{draftRelType, relatedEventId}));
+ }
+
+ auto Room::setLocalDraft(std::string text,
+ std::string relType, std::string relatedEventId) const -> PromiseT
+ {
+ using namespace CursorOp;
+ return m_ctx.dispatch(UpdateRoomAction(
+ +roomId(), SetLocalDraftAction{text, relType, relatedEventId}
+ ));
+ }
+
+ auto Room::pushLocalDraft(std::string text,
+ std::string relType, std::string relatedEventId) const -> PromiseT
+ {
+ using namespace CursorOp;
+ return m_ctx.dispatch(UpdateRoomAction{+roomId(), PushLocalDraftAction{
+ text, relType, relatedEventId}});
+ }
+
+ auto Room::popLocalDraft() const -> PromiseT
+ {
+ using namespace CursorOp;
+ return m_ctx.dispatch(UpdateRoomAction{+roomId(), PopLocalDraftAction {}});
}
auto Room::sendMessage(Event msg) const

File Metadata

Mime Type
text/plain
Expires
Tue, Jun 16, 3:40 PM (18 h, 38 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1596770
Default Alt Text
D296.1781649635.diff (11 KB)

Event Timeline