mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2026-07-25 06:54:43 +00:00
feat: add clear deleted messages action for chats
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user