feat: add clear deleted messages action for chats

This commit is contained in:
Ireina
2026-03-30 21:50:29 +08:00
committed by AlexeyZavar
parent c4b761cce0
commit fc5bfeaee1
6 changed files with 78 additions and 0 deletions
@@ -348,6 +348,19 @@ bool hasDeletedMessages(ID userId, ID dialogId, ID topicId) {
}
}
void clearDeletedMessages(ID userId, ID dialogId, ID topicId) {
try {
storage.remove_all<DeletedMessage>(
where(
column<DeletedMessage>(&DeletedMessage::userId) == userId and
column<DeletedMessage>(&DeletedMessage::dialogId) == dialogId and
(column<DeletedMessage>(&DeletedMessage::topicId) == topicId or topicId == 0)
)
);
} catch (std::exception &) {
}
}
template<typename T>
std::vector<T> getAllT() {
try {
@@ -28,6 +28,7 @@ bool hasRevisions(ID userId, ID dialogId, ID messageId);
void addDeletedMessage(const DeletedMessage &message);
std::vector<DeletedMessage> getDeletedMessages(ID userId, ID dialogId, ID topicId, ID minId, ID maxId, int totalLimit, const std::string &searchQuery = "");
bool hasDeletedMessages(ID userId, ID dialogId, ID topicId);
void clearDeletedMessages(ID userId, ID dialogId, ID topicId);
std::vector<RegexFilter> getAllRegexFilters();
RegexFilter getById(std::vector<char> id);
@@ -134,4 +134,9 @@ bool hasDeletedMessages(not_null<PeerData*> peer, ID topicId) {
return AyuDatabase::hasDeletedMessages(userId, getDialogIdFromPeer(peer), topicId);
}
void clearDeletedMessages(not_null<PeerData*> peer, ID topicId) {
const ID userId = peer->session().userId().bare & PeerId::kChatTypeMask;
AyuDatabase::clearDeletedMessages(userId, getDialogIdFromPeer(peer), topicId);
}
}
@@ -17,5 +17,6 @@ bool hasRevisions(not_null<HistoryItem*> item);
void addDeletedMessage(not_null<HistoryItem*> item);
std::vector<AyuMessageBase> getDeletedMessages(not_null<PeerData*> peer, ID topicId, ID minId, ID maxId, int totalLimit, const QString &searchQuery = QString());
bool hasDeletedMessages(not_null<PeerData*> peer, ID topicId);
void clearDeletedMessages(not_null<PeerData*> peer, ID topicId);
}
@@ -29,6 +29,7 @@
#include "data/data_search_controller.h"
#include "data/data_session.h"
#include "data/data_user.h"
#include "history/history.h"
#include "history/history_item_components.h"
#include "history/view/history_view_context_menu.h"
#include "history/view/history_view_element.h"
@@ -46,6 +47,33 @@ namespace AyuUi {
namespace {
Fn<void()> ClearDeletedMessagesHandler(not_null<Window::SessionController*> controller, not_null<PeerData*> peer, ID topicId) {
return [=] {
controller->show(Ui::MakeConfirmBox({
.text = tr::ayu_ClearDeletedMessagesText(tr::now),
.confirmed = [=](Fn<void()> &&close) {
auto items = std::vector<not_null<HistoryItem*>>();
for (const auto &block : peer->owner().history(peer)->blocks) {
for (const auto &view : block->messages) {
const auto item = view->data();
if (item->isDeleted() && (!topicId || (item->topicRootId().bare == topicId))) {
items.push_back(item);
}
}
}
AyuMessages::clearDeletedMessages(peer, topicId);
for (const auto item : items) {
item->destroy();
}
close();
},
.confirmText = tr::ayu_ClearDeletedMessagesActionText(tr::now),
.cancelText = tr::lng_cancel(),
.confirmStyle = &st::attentionBoxButton,
}));
};
}
void DeleteMyMessagesAfterConfirm(not_null<PeerData*> peer) {
const auto session = &peer->session();
@@ -211,6 +239,10 @@ void AddDeletedMessagesActions(PeerData *peerData,
->showSection(std::make_shared<MessageHistory::SectionMemento>(peerData, nullptr, topicId));
},
&st::menuIconArchive);
addCallback(
tr::ayu_ClearDeletedMenuText(tr::now),
ClearDeletedMessagesHandler(sessionController, peerData, topicId),
&st::menuIconDelete);
// todo view filters
}
@@ -634,6 +634,17 @@ bool InnerWidget::elementHideTopicButton(not_null<const Element*> view) {
}
void InnerWidget::saveState(not_null<SectionMemento*> memento) {
if (!_item) {
memento->setItems({}, {}, false, true);
memento->setSearchQuery(base::take(_searchQuery));
_items.clear();
_messageIds.clear();
_itemsByData.clear();
_upLoaded = false;
_downLoaded = true;
return;
}
for (auto &item : _items) {
item.clearView();
}
@@ -648,6 +659,21 @@ void InnerWidget::saveState(not_null<SectionMemento*> memento) {
}
void InnerWidget::restoreState(not_null<SectionMemento*> memento) {
if (!_item) {
_items.clear();
_messageIds.clear();
_itemsByData.clear();
_itemDates.clear();
_upLoaded = false;
_downLoaded = true;
_searchQuery = memento->takeSearchQuery();
updateMinMaxIds();
updateEmptyText();
updateSize();
preloadMore(Direction::Up);
return;
}
_items = memento->takeItems();
for (auto &item : _items) {
item.refreshView(this);