Page MenuHomePhorge

D245.1778597365.diff
No OneTemporary

Size
23 KB
Referenced Files
None
Subscribers
None

D245.1778597365.diff

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -188,6 +188,7 @@
AddStickerPopup.qml
StickerPackNameProvider.qml
ConfirmationOverlay.qml
+ TribleButtonOverlay.qml
VerificationsPage.qml
SasCodes.qml
event-types/Simple.qml
diff --git a/src/contents/ui/Bubble.qml b/src/contents/ui/Bubble.qml
--- a/src/contents/ui/Bubble.qml
+++ b/src/contents/ui/Bubble.qml
@@ -75,8 +75,7 @@
objectName: 'editMenuItem'
text: l10n.get('event-edit-action')
onTriggered: {
- setDraftRelation('m.replace', currentEvent.eventId);
- replaceDraftRequested(Helpers.getEventBodyForEditing(event));
+ setDraftRelation('m.replace', currentEvent.eventId, Helpers.getEventBodyForEditing(event));
}
enabled: event && !event.redacted && !event.isLocalEcho && getIsEditable(event)
},
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
@@ -180,9 +180,8 @@
}
}
- function setDraftRelation(relType, eventId) {
- sendMessageBox.draftRelType = relType;
- sendMessageBox.draftRelatedTo = eventId;
+ function setDraftRelation(relType, eventId, newDraft) {
+ sendMessageBox.setDraftRelation(relType, eventId, newDraft);
}
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,88 @@
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 changeDraftRelTypes: ['m.replace']
+
+ property var confirmSaveDraftOverlay: Kazv.TribleButtonOverlay {
+ id: confirmSaveDraftOverlay
+ objectName: 'confirmSaveDraftOverlay'
+ parent: Overlay.overlay
+ title: l10n.get('save-draft-confirmation-title')
+ message: l10n.get('save-draft-confirmation')
+ leftButtonText: l10n.get('save-draft-confirm-action')
+ onLeftButtonClicked: function() {
+ pushLocalDraft.call();
+ }
+ middleButtonText: l10n.get('save-draft-discard-action')
+ onMiddleButtonClicked: function() {
+ confirmSaveDraftOverlay.setLocalDraft.call();
+ }
+ rightButtonText: l10n.get('save-draft-cancel-action')
+
+ property var relType
+ property var relTo
+ property var newDraft
+
+ property var pushLocalDraft: Kazv.AsyncHandler {
+ trigger: () => room.pushLocalDraft(
+ confirmSaveDraftOverlay.newDraft,
+ confirmSaveDraftOverlay.relType,
+ confirmSaveDraftOverlay.relTo)
+ onResolved: (success) => {
+ if (success) {
+ textArea.changeText(confirmSaveDraftOverlay.newDraft);
+ }
+ }
+ }
+ property var setLocalDraft: Kazv.AsyncHandler {
+ trigger: () => room.setLocalDraft(
+ confirmSaveDraftOverlay.newDraft,
+ confirmSaveDraftOverlay.relType,
+ confirmSaveDraftOverlay.relTo)
+ onResolved: (success) => {
+ if (success) {
+ textArea.changeText(confirmSaveDraftOverlay.newDraft);
+ }
+ }
+ }
+ }
+
+ property var confirmDiscardDraftOverlay: Kazv.TribleButtonOverlay {
+ id: confirmDiscardDraftOverlay
+ objectName: 'confirmDiscardDraftOverlay'
+ parent: Overlay.overlay
+ title: l10n.get('discard-draft-confirmation-title')
+ message: l10n.get('discard-draft-confirmation')
+ leftButtonText: l10n.get('discard-draft-confirm-action')
+ onLeftButtonClicked: function() {
+ sendMessageBox.popLocalDraft.prevDraft = sendMessageBox.room.prevDraft;
+ sendMessageBox.popLocalDraft.call();
+ }
+ middleButtonText: l10n.get('discard-draft-keep-action')
+ onMiddleButtonClicked: function() {
+ sendMessageBox.room.setLocalDraftRel("", "");
+ }
+ rightButtonText: l10n.get('discard-draft-cancel-action')
+ }
+
+ property var popLocalDraft: Kazv.AsyncHandler {
+ trigger: () => sendMessageBox.room.popLocalDraft()
+
+ property var prevDraft
+
+ onResolved: (success) => {
+ if (success) {
+ textArea.changeText(prevDraft);
+ }
+ prevDraft = "";
+ }
+ }
function getRelationPrompt(draftRelType) {
if (draftRelType === 'm.in_reply_to') {
@@ -42,6 +119,28 @@
textArea.changeText(newDraft, /* inhibitTyping = */ true);
}
+ function setDraftRelation(relType, eventId, newDraft) {
+ if (!changeDraftRelTypes.includes(relType)) {
+ room.setLocalDraftRel(relType, eventId);
+ return;
+ }
+ if (textArea.text === '') {
+ room.setLocalDraft(newDraft, relType, eventId);
+ textArea.changeText(newDraft);
+ return;
+ }
+
+ confirmSaveDraftOverlay.relType = relType;
+ confirmSaveDraftOverlay.relTo = eventId;
+ confirmSaveDraftOverlay.newDraft = newDraft;
+ confirmSaveDraftOverlay.open();
+ }
+
+ function resetDraftRelation() {
+ popLocalDraft.prevDraft = room.prevDraft;
+ popLocalDraft.call();
+ }
+
onRoomChanged: {
textArea.changeText(room.localDraft, true);
}
@@ -104,6 +203,7 @@
}
}
ToolButton {
+ objectName: 'removeRelatedToButton'
Layout.alignment: Qt.AlignTop
action: removeRelatedToAction
display: AbstractButton.IconOnly
@@ -129,7 +229,7 @@
wrapMode: TextEdit.Wrap
persistentSelection: true
onTextChanged: {
- room.setLocalDraft(text);
+ room.setLocalDraftText(text);
if (!inhibitTyping) {
room.setTyping(true);
}
@@ -316,8 +416,11 @@
icon.name: 'window-close-symbolic'
text: getCancelRelationPrompt(sendMessageBox.draftRelType)
onTriggered: {
- sendMessageBox.draftRelType = '';
- sendMessageBox.draftRelatedTo = '';
+ if (textArea.text) {
+ confirmDiscardDraftOverlay.open();
+ return;
+ }
+ sendMessageBox.resetDraftRelation();
}
}
@@ -329,8 +432,7 @@
room.setTyping(false);
room.sendTextMessage(textArea.text, draftRelType, draftRelatedTo);
textArea.changeText("", true);
- sendMessageBox.draftRelType = '';
- sendMessageBox.draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
}
enabled: textArea.text !== ''
}
@@ -364,8 +466,7 @@
room.roomId, sdkVars.roomList, room.encrypted,
draftRelType, draftRelatedTo
);
- sendMessageBox.draftRelType = '';
- sendMessageBox.draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
}
property var stickerPopup: Kirigami.OverlaySheet {
@@ -379,8 +480,7 @@
onSendMessageRequested: eventJson => {
console.log(JSON.stringify(eventJson));
room.sendMessage(eventJson, draftRelType, draftRelatedTo);
- draftRelType = '';
- draftRelatedTo = '';
+ sendMessageBox.resetDraftRelation();
stickerPopup.close();
}
}
diff --git a/src/contents/ui/TribleButtonOverlay.qml b/src/contents/ui/TribleButtonOverlay.qml
new file mode 100644
--- /dev/null
+++ b/src/contents/ui/TribleButtonOverlay.qml
@@ -0,0 +1,67 @@
+/*
+ * This file is part of kazv.
+ * SPDX-FileCopyrightText: 2026 nannanko <nannanko@kazv.moe>
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+
+import '.' as Kazv
+
+Kazv.SelfDestroyableOverlaySheet {
+ id: confirmationOverlay
+ property var message
+ property var leftButtonText
+ property var onLeftButtonClicked: () => {}
+ property var middleButtonText
+ property var onMiddleButtonClicked: () => {}
+ property var rightButtonText
+ property var onRightButtonClicked: () => {}
+
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ text: confirmationOverlay.message
+ wrapMode: Text.Wrap
+ }
+
+ ColumnLayout {
+ id: itemsLayout
+ }
+
+ RowLayout {
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter
+
+ Button {
+ objectName: 'leftButton'
+ text: confirmationOverlay.leftButtonText
+ onClicked: {
+ confirmationOverlay.onLeftButtonClicked();
+ confirmationOverlay.close();
+ }
+ }
+
+
+ Button {
+ objectName: 'middleButton'
+ text: confirmationOverlay.middleButtonText
+ onClicked: {
+ confirmationOverlay.onMiddleButtonClicked();
+ confirmationOverlay.close();
+ }
+ }
+
+ Button {
+ objectName: 'rightButton'
+ text: confirmationOverlay.rightButtonText
+ onClicked: {
+ confirmationOverlay.onRightButtonClicked();
+ confirmationOverlay.close();
+ }
+ }
+ }
+ }
+}
diff --git a/src/l10n/cmn-Hans/100-ui.ftl b/src/l10n/cmn-Hans/100-ui.ftl
--- a/src/l10n/cmn-Hans/100-ui.ftl
+++ b/src/l10n/cmn-Hans/100-ui.ftl
@@ -164,6 +164,18 @@
send-message-box-stickers = 发送贴纸...
send-message-box-stickers-popup-title = 发送贴纸
+save-draft-confirmation-title = 保存草稿
+save-draft-confirmation = 你有一个未发送的草稿,需要保存草稿以便在稍后恢复它吗?
+save-draft-confirm-action = 保存
+save-draft-discard-action = 丢弃
+save-draft-cancel-action = 维持现状
+
+discard-draft-confirmation-title = 丢弃草稿
+discard-draft-confirmation = 你有一个未发送的草稿,你的操作将会丢弃它。
+discard-draft-confirm-action = 丢弃
+discard-draft-keep-action = 保留
+discard-draft-cancel-action = 维持现状
+
sticker-picker-user-stickers = 我的贴纸
sticker-picker-room-sticker-pack-name = {$room} 中的 {$stateKey}
sticker-picker-room-default-sticker-pack-name = {$room} 中的默认包
diff --git a/src/l10n/en/100-ui.ftl b/src/l10n/en/100-ui.ftl
--- a/src/l10n/en/100-ui.ftl
+++ b/src/l10n/en/100-ui.ftl
@@ -168,6 +168,18 @@
send-message-box-stickers = Send a sticker...
send-message-box-stickers-popup-title = Send a sticker
+save-draft-confirmation-title = Save draft
+save-draft-confirmation = You have an unsent draft, do you want to save it to restore it later?
+save-draft-confirm-action = Save it
+save-draft-discard-action = Discard it
+save-draft-cancel-action = Do nothing
+
+discard-draft-confirmation-title = Discard draft
+discard-draft-confirmation = You have an unsent draft, your operation will dicard it.
+discard-draft-confirm-action = Discard it
+discard-draft-keep-action = Keep it
+discard-draft-cancel-action = Do nothing
+
sticker-picker-user-stickers = My stickers
sticker-picker-room-sticker-pack-name = {$stateKey} in {$room}
sticker-picker-room-default-sticker-pack-name = Default pack in {$room}
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, prevDraft);
+ LAGER_QT_READER(QString, draftRelType);
+ LAGER_QT_READER(QString, draftRelTo);
LAGER_QT_READER(bool, encrypted);
LAGER_QT_READER(bool, tombstoned);
@@ -120,9 +123,20 @@
Q_INVOKABLE void setTyping(bool typing);
- Q_INVOKABLE void setLocalDraft(QString localDraft);
+ Q_INVOKABLE void setLocalDraftText(QString localDraft);
- Q_INVOKABLE void updateLocalDraftNow();
+ Q_INVOKABLE void updateLocalDraftTextNow();
+
+ Q_INVOKABLE MatrixPromise *pushLocalDraft(const QString &localDraft,
+ const QString &draftRelType, const QString &draftRelTo);
+
+ Q_INVOKABLE MatrixPromise *popLocalDraft();
+
+ Q_INVOKABLE MatrixPromise *setLocalDraft(const QString &localDraft,
+ const QString &draftRelType, const QString &draftRelTo);
+
+ Q_INVOKABLE MatrixPromise *setLocalDraftRel(
+ const QString draftRelType, const QString draftRelTo);
Q_INVOKABLE MatrixPromise *addOrSetTag(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
@@ -73,7 +73,34 @@
return std::string();
})
.xform(strToQt))
- , LAGER_QT(localDraft)(m_room.localDraft().xform(strToQt))
+ , LAGER_QT(localDraft)(m_room.localDrafts().map(
+ [](immer::flex_vector<Kazv::LocalDraft> drafts) {
+ if (drafts.empty()) {
+ return std::string{""};
+ }
+ return drafts.front().text;
+ }).xform(strToQt))
+ , LAGER_QT(prevDraft)(m_room.localDrafts().map(
+ [](immer::flex_vector<Kazv::LocalDraft> drafts) {
+ if (drafts.size() <= 1) {
+ return std::string{""};
+ }
+ return drafts[1].text;
+ }).xform(strToQt))
+ , LAGER_QT(draftRelType)(m_room.localDrafts().map(
+ [](immer::flex_vector<Kazv::LocalDraft> drafts) {
+ if (drafts.empty()) {
+ return std::string{""};
+ }
+ return drafts.front().relType;
+ }).xform(strToQt))
+ , LAGER_QT(draftRelTo)(m_room.localDrafts().map(
+ [](immer::flex_vector<Kazv::LocalDraft> drafts) {
+ if (drafts.empty()) {
+ return std::string{""};
+ }
+ return drafts.front().relatedEventId;
+ }).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(); }))
@@ -96,7 +123,7 @@
}, typingDebounceMs))
, m_updateLocalDraftDebounced(QFunctionUtils::Debounce([self=QPointer<MatrixRoom>(this)]() {
if (self) {
- self->updateLocalDraftNow();
+ self->updateLocalDraftTextNow();
}
}, saveDraftDebounceMs))
, m_internalLocalDraft(std::nullopt)
@@ -107,7 +134,7 @@
}
MatrixRoom::~MatrixRoom() {
- updateLocalDraftNow();
+ updateLocalDraftTextNow();
}
MatrixRoomTimeline *MatrixRoom::timeline() const
@@ -468,7 +495,9 @@
m_room.setTyping(true, typingTimeoutMs);
}
-void MatrixRoom::setLocalDraft(QString localDraft)
+
+
+void MatrixRoom::setLocalDraftText(QString localDraft)
{
// To avoid heavy computations when updating the local draft again
// and again, we only set our internal state. **Assume only
@@ -479,7 +508,7 @@
m_updateLocalDraftDebounced();
}
-void MatrixRoom::updateLocalDraftNow()
+void MatrixRoom::updateLocalDraftTextNow()
{
if (m_internalLocalDraft.has_value()) {
m_room.setLocalDraft(m_internalLocalDraft.value().toStdString());
@@ -487,6 +516,33 @@
}
}
+MatrixPromise *MatrixRoom::pushLocalDraft(const QString &localDraft,
+ const QString &draftRelType, const QString &draftRelTo)
+{
+ updateLocalDraftTextNow();
+ return new MatrixPromise(m_room.pushLocalDraft(localDraft.toStdString(),
+ draftRelType.toStdString(), draftRelTo.toStdString()));
+}
+
+MatrixPromise *MatrixRoom::popLocalDraft()
+{
+ return new MatrixPromise(m_room.popLocalDraft());
+}
+
+MatrixPromise *MatrixRoom::setLocalDraft(const QString &localDraft,
+ const QString &draftRelType, const QString &draftRelTo)
+{
+ return new MatrixPromise(m_room.setLocalDraft(localDraft.toStdString(),
+ draftRelType.toStdString(), draftRelTo.toStdString()));
+}
+
+MatrixPromise *MatrixRoom::setLocalDraftRel(
+ const QString draftRelType, const QString draftRelTo)
+{
+ return new MatrixPromise(m_room.setLocalDraftRel(draftRelType.toStdString(),
+ draftRelTo.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
@@ -30,16 +30,31 @@
messageById () { return {}; },
member () { return {}; },
localDraft: '',
+ setLocalDraftText: mockHelper.noop(),
setLocalDraft: mockHelper.noop(),
+ setLocalDraftRel: mockHelper.noop(),
+ pushLocalDraft: mockHelper.promise(),
+ popLocalDraft: mockHelper.promise(),
updateLocalDraftNow: mockHelper.func(function () {
- this.localDraft = this.setLocalDraft.lastArgs()[0];
+ this.localDraft = this.setLocalDraftText.lastArgs()[0];
}),
+ draftRelType: '',
+ draftRelTo: '',
+ prevDraft: 'prevDraft',
};
}
property var room: makeRoom()
property var room2: makeRoom()
+ function makeRoomWithDraft() {
+ const room = makeRoom();
+ room.localDraft = 'some draft';
+ room.draftRelType = 'm.replace';
+ room.draftRelTo = '$eventid';
+ return room;
+ }
+
property var sendMessageBoxComp: Component {
id: comp
Kirigami.Page {
@@ -74,6 +89,42 @@
}
}
+ property var sendMessageBoxComp3: Component {
+ id: comp3
+ Kirigami.Page {
+ id: page
+ property var room: makeRoom()
+ Label {
+ text: 'room 3'
+ }
+ footer: Item {
+ height: childrenRect.height
+ width: parent.width
+ Kazv.SendMessageBox {
+ room: page.room
+ }
+ }
+ }
+ }
+
+ property var sendMessageBoxComp4: Component {
+ id: comp4
+ Kirigami.Page {
+ id: page
+ property var room: makeRoomWithDraft()
+ Label {
+ text: 'room 3'
+ }
+ footer: Item {
+ height: childrenRect.height
+ width: parent.width
+ Kazv.SendMessageBox {
+ room: page.room
+ }
+ }
+ }
+ }
+
property var mockMainPageComp: Component {
id: mockMainPageComp
Kirigami.Page {}
@@ -88,6 +139,14 @@
name: 'SendMessageBoxDraftsTest'
when: windowShown
+ function init() {
+ mockHelper.clearAll();
+ }
+
+ function cleanup() {
+ window.pageStack.clear();
+ }
+
function test_saveDraftsOnSwitching() {
// simulates the MainPage when starting up kazv
window.pageStack.push(mockMainPageComp);
@@ -100,7 +159,7 @@
textArea.text = 'foo';
// verify that the draft is saved internally but not propagated
verify(item.room.localDraft === '');
- verify(item.room.setLocalDraft.lastArgs()[0] === 'foo');
+ verify(item.room.setLocalDraftText.lastArgs()[0] === 'foo');
// go back to MainPage
window.pageStack.goBack();
@@ -114,5 +173,109 @@
tryVerify(() => item.room.localDraft === 'foo', 1000);
verify(item.room.updateLocalDraftNow.calledTimes() === 1);
}
+
+ function test_restoreDraftOnExitEditing() {
+ window.pageStack.push(comp3);
+ const room = window.pageStack.currentItem.room;
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ textArea.text = 'some draft';
+ sendMessageBox.setDraftRelation('m.replace', '$someevent', 'some new draft');
+
+ const confirmSaveDraftOverlay = findChild(window.pageStack, 'confirmSaveDraftOverlay');
+ verify(confirmSaveDraftOverlay.visible);
+ const confirmBtn = findChild(confirmSaveDraftOverlay, 'leftButton');
+ confirmBtn.click();
+
+ compare(room.pushLocalDraft.calledTimes(), 1);
+ // m.replace will change textArea
+ textArea.text = 'foo';
+ // Exit editing
+ sendMessageBox.resetDraftRelation();
+ // Old draft has been restored.
+ compare(room.popLocalDraft.calledTimes(), 1);
+ }
+
+ function test_confirmSaveDraftOverlayCancel() {
+ window.pageStack.push(comp3);
+ const room = window.pageStack.currentItem.room;
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ textArea.text = 'some draft';
+ sendMessageBox.setDraftRelation('m.replace', '$someevent', 'some new draft');
+ const confirmSaveDraftOverlay = findChild(window.pageStack, 'confirmSaveDraftOverlay');
+ verify(confirmSaveDraftOverlay);
+ const cancelBtn = findChild(confirmSaveDraftOverlay, 'rightButton');
+ cancelBtn.click();
+
+ compare(room.pushLocalDraft.calledTimes(), 0);
+ compare(room.setLocalDraft.calledTimes(), 0);
+ }
+
+ function test_confirmSaveDraftOverlayDiscard() {
+ window.pageStack.push(comp3);
+ const room = window.pageStack.currentItem.room;
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ textArea.text = 'some draft';
+ sendMessageBox.setDraftRelation('m.replace', '$someevent', 'some new draft');
+ const confirmSaveDraftOverlay = findChild(window.pageStack, 'confirmSaveDraftOverlay');
+ verify(confirmSaveDraftOverlay);
+ const discardBtn = findChild(confirmSaveDraftOverlay, 'middleButton');
+ discardBtn.click();
+
+ compare(room.setLocalDraft.calledTimes(), 1);
+ compare(room.setLocalDraft.lastArgs()[0], 'some new draft');
+ compare(room.setLocalDraft.lastArgs()[1], 'm.replace');
+ compare(room.setLocalDraft.lastArgs()[2], '$someevent');
+ }
+
+ function test_confirmDiscardDraftOverlayDiscard() {
+ window.pageStack.push(comp4);
+ const room = window.pageStack.currentItem.room;
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ const removeRelatedBtn = findChild(sendMessageBox, 'removeRelatedToButton');
+ removeRelatedBtn.click();
+ const confirmDiscardDraftOverlay = findChild(window.pageStack, 'confirmDiscardDraftOverlay');
+ verify(confirmDiscardDraftOverlay.visible);
+ const discardBtn = findChild(confirmDiscardDraftOverlay, 'leftButton');
+ discardBtn.click();
+
+ compare(room.popLocalDraft.calledTimes(), 1);
+ }
+
+ function test_confirmDiscardDraftOverlayCancel() {
+ window.pageStack.push(comp4);
+ const room = window.pageStack.currentItem.room;
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ const removeRelatedBtn = findChild(sendMessageBox, 'removeRelatedToButton');
+ removeRelatedBtn.click();
+ const confirmDiscardDraftOverlay = findChild(window.pageStack, 'confirmDiscardDraftOverlay');
+ verify(confirmDiscardDraftOverlay.visible);
+ const cancelBtn = findChild(confirmDiscardDraftOverlay, 'rightButton');
+ cancelBtn.click();
+
+ compare(room.popLocalDraft.calledTimes(), 0);
+ compare(room.setLocalDraftRel.calledTimes(), 0);
+ }
+
+ function test_confirmDiscardDraftOverlayKeep() {
+ window.pageStack.push(comp4);
+ const room = window.pageStack.currentItem.room;
+ const sendMessageBox = findChild(window.pageStack, 'sendMessageBox');
+ const textArea = findChild(window.pageStack, 'draftMessage');
+ const removeRelatedBtn = findChild(sendMessageBox, 'removeRelatedToButton');
+ removeRelatedBtn.click();
+ const confirmDiscardDraftOverlay = findChild(window.pageStack, 'confirmDiscardDraftOverlay');
+ verify(confirmDiscardDraftOverlay.visible);
+ const keepBtn = findChild(confirmDiscardDraftOverlay, 'middleButton');
+ keepBtn.click();
+
+ compare(room.setLocalDraftRel.calledTimes(), 1);
+ compare(room.setLocalDraftRel.lastArgs()[0], '');
+ compare(room.setLocalDraftRel.lastArgs()[1], '');
+ }
}
}

File Metadata

Mime Type
text/plain
Expires
Tue, May 12, 7:49 AM (5 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1461030
Default Alt Text
D245.1778597365.diff (23 KB)

Event Timeline