Page MenuHomePhorge

D245.1775135582.diff
No OneTemporary

Size
7 KB
Referenced Files
None
Subscribers
None

D245.1775135582.diff

diff --git a/src/contents/ui/RoomPage.qml b/src/contents/ui/RoomPage.qml
--- a/src/contents/ui/RoomPage.qml
+++ b/src/contents/ui/RoomPage.qml
@@ -181,8 +181,7 @@
}
function setDraftRelation(relType, eventId) {
- sendMessageBox.draftRelType = relType;
- sendMessageBox.draftRelatedTo = eventId;
+ sendMessageBox.setDraftRelation(relType, eventId);
}
property var joinRoomHandler: Kazv.AsyncHandler {
diff --git a/src/contents/ui/SendMessageBox.qml b/src/contents/ui/SendMessageBox.qml
--- a/src/contents/ui/SendMessageBox.qml
+++ b/src/contents/ui/SendMessageBox.qml
@@ -16,11 +16,14 @@
ColumnLayout {
id: sendMessageBox
+ objectName: 'sendMessageBox'
property var room
- property var draftRelType: ''
- property var draftRelatedTo: ''
+ property var draftRelType: room.draftRelType
+ property var draftRelatedTo: room.draftRelTo
property var timeline: room.timeline()
property var members: room.members()
+ property var oldDraft: room.oldDraft
+ property var changeDraftRelTypes: ['m.replace']
function getRelationPrompt(draftRelType) {
if (draftRelType === 'm.in_reply_to') {
@@ -42,6 +45,28 @@
textArea.changeText(newDraft, /* inhibitTyping = */ true);
}
+ // Some relation type will replace user's draft, this function will save the draft and restore it.
+ function setDraftRelation(relType, eventId) {
+ if (!sendMessageBox.changeDraftRelTypes.includes(sendMessageBox.draftRelType)
+ && sendMessageBox.changeDraftRelTypes.includes(relType)) {
+ oldDraft = textArea.text;
+ }
+ if (!sendMessageBox.changeDraftRelTypes.includes(relType)
+ && sendMessageBox.changeDraftRelTypes.includes(sendMessageBox.draftRelType)) {
+ replaceDraft(oldDraft);
+ oldDraft = '';
+ }
+ sendMessageBox.draftRelType = relType;
+ sendMessageBox.draftRelatedTo = eventId;
+ room.setDraftRel(
+ sendMessageBox.draftRelType, sendMessageBox.draftRelatedTo,
+ sendMessageBox.oldDraft);
+ }
+
+ function resetDraftRelation() {
+ sendMessageBox.setDraftRelation('', '');
+ }
+
onRoomChanged: {
textArea.changeText(room.localDraft, true);
}
@@ -316,8 +341,7 @@
icon.name: 'window-close-symbolic'
text: getCancelRelationPrompt(sendMessageBox.draftRelType)
onTriggered: {
- sendMessageBox.draftRelType = '';
- sendMessageBox.draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
}
}
@@ -329,8 +353,7 @@
room.setTyping(false);
room.sendTextMessage(textArea.text, draftRelType, draftRelatedTo);
textArea.changeText("", true);
- sendMessageBox.draftRelType = '';
- sendMessageBox.draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
}
enabled: textArea.text !== ''
}
@@ -364,8 +387,7 @@
room.roomId, sdkVars.roomList, room.encrypted,
draftRelType, draftRelatedTo
);
- sendMessageBox.draftRelType = '';
- sendMessageBox.draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
}
property var stickerPopup: Kirigami.OverlaySheet {
@@ -379,8 +401,7 @@
onSendMessageRequested: eventJson => {
console.log(JSON.stringify(eventJson));
room.sendMessage(eventJson, draftRelType, draftRelatedTo);
- draftRelType = '';
- draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
stickerPopup.close();
}
}
diff --git a/src/matrix-room.hpp b/src/matrix-room.hpp
--- a/src/matrix-room.hpp
+++ b/src/matrix-room.hpp
@@ -62,6 +62,9 @@
LAGER_QT_READER(QString, avatarMxcUri);
LAGER_QT_READER(QString, roomOrHeroAvatarMxcUri);
LAGER_QT_READER(QString, localDraft);
+ LAGER_QT_READER(QString, oldDraft);
+ LAGER_QT_READER(QString, draftRelType);
+ LAGER_QT_READER(QString, draftRelTo);
LAGER_QT_READER(bool, encrypted);
LAGER_QT_READER(bool, tombstoned);
@@ -124,6 +127,9 @@
Q_INVOKABLE void updateLocalDraftNow();
+ Q_INVOKABLE void setDraftRel(const QString &draftRelType,
+ const QString &draftRelTo, const QString &oldDraft);
+
Q_INVOKABLE MatrixPromise *addOrSetTag(QString tagId) const;
Q_INVOKABLE MatrixPromise *removeTag(QString tagId) const;
diff --git a/src/matrix-room.cpp b/src/matrix-room.cpp
--- a/src/matrix-room.cpp
+++ b/src/matrix-room.cpp
@@ -74,6 +74,9 @@
})
.xform(strToQt))
, LAGER_QT(localDraft)(m_room.localDraft().xform(strToQt))
+ , LAGER_QT(oldDraft)(m_room.oldDraft().xform(strToQt))
+ , LAGER_QT(draftRelType)(m_room.draftRelType().xform(strToQt))
+ , LAGER_QT(draftRelTo)(m_room.draftRelTo().xform(strToQt))
, LAGER_QT(encrypted)(m_room.encrypted())
, LAGER_QT(tombstoned)(m_room.stateOpt({"m.room.tombstone"s, ""s}).map(
[](auto c) { return c.has_value(); }))
@@ -487,6 +490,13 @@
}
}
+void MatrixRoom::setDraftRel(const QString &draftRelType,
+ const QString &draftRelTo, const QString &oldDraft)
+{
+ m_room.setDraftRel(draftRelType.toStdString(),
+ draftRelTo.toStdString(), oldDraft.toStdString());
+}
+
MatrixRoomMemberListModel *MatrixRoom::members() const
{
return new MatrixRoomMemberListModel(
diff --git a/src/tests/quick-tests/tst_SendMessageBoxDrafts.qml b/src/tests/quick-tests/tst_SendMessageBoxDrafts.qml
--- a/src/tests/quick-tests/tst_SendMessageBoxDrafts.qml
+++ b/src/tests/quick-tests/tst_SendMessageBoxDrafts.qml
@@ -39,6 +39,7 @@
property var room: makeRoom()
property var room2: makeRoom()
+ property var room3: makeRoom()
property var sendMessageBoxComp: Component {
id: comp
@@ -74,6 +75,23 @@
}
}
+ property var sendMessageBoxComp3: Component {
+ id: comp3
+ Kirigami.Page {
+ id: page
+ Label {
+ text: 'room 3'
+ }
+ footer: Item {
+ height: childrenRect.height
+ width: parent.width
+ Kazv.SendMessageBox {
+ room: item.room3
+ }
+ }
+ }
+ }
+
property var mockMainPageComp: Component {
id: mockMainPageComp
Kirigami.Page {}
@@ -88,6 +106,11 @@
name: 'SendMessageBoxDraftsTest'
when: windowShown
+ function init() {
+ window.pageStack.clear();
+ mockHelper.clearAll();
+ }
+
function test_saveDraftsOnSwitching() {
// simulates the MainPage when starting up kazv
window.pageStack.push(mockMainPageComp);
@@ -114,5 +137,23 @@
tryVerify(() => item.room.localDraft === 'foo', 1000);
verify(item.room.updateLocalDraftNow.calledTimes() === 1);
}
+
+ function test_restoreDraftOnExitEditing() {
+ window.pageStack.push(comp3);
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ textArea.text = 'some draft';
+ sendMessageBox.setDraftRelation('m.replace', '$someevent');
+ // m.replace will change textArea
+ textArea.text = 'foo';
+ // Old draft has been saved.
+ compare(sendMessageBox.oldDraft, 'some draft');
+ // Exit editing
+ sendMessageBox.resetDraftRelation();
+ // Old draft has been restored.
+ compare(textArea.text, 'some draft');
+
+ window.pageStack.clear();
+ }
}
}

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 2, 6:13 AM (4 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1275286
Default Alt Text
D245.1775135582.diff (7 KB)

Event Timeline