aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/item_actions.vala
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2025-11-14 14:48:25 -0600
committerfiaxh <git@lightrise.org>2025-11-14 14:48:25 -0600
commit1ede8ade12f26cf39d29d5c616bd28693d677e09 (patch)
treedc0bb08cd95c1b47291e48766dfd3fbd7acbaf40 /main/src/ui/conversation_content_view/item_actions.vala
parent9f02aba799e07ad2ab587334fe59c577e5d4605d (diff)
Add support for message moderation and retraction
Diffstat (limited to 'main/src/ui/conversation_content_view/item_actions.vala')
-rw-r--r--main/src/ui/conversation_content_view/item_actions.vala61
1 files changed, 61 insertions, 0 deletions
diff --git a/main/src/ui/conversation_content_view/item_actions.vala b/main/src/ui/conversation_content_view/item_actions.vala
index d4195bdd..6102dc9a 100644
--- a/main/src/ui/conversation_content_view/item_actions.vala
+++ b/main/src/ui/conversation_content_view/item_actions.vala
@@ -48,4 +48,65 @@ namespace Dino.Ui {
}
return action;
}
+
+ public Plugins.MessageAction? get_delete_action(ContentItem content_item, Conversation conversation, StreamInteractor stream_interactor) {
+ bool is_deletable = stream_interactor.get_module(MessageDeletion.IDENTITY).is_deletable(conversation, content_item);
+ if (!is_deletable) return null;
+
+ bool can_delete_for_everyone = stream_interactor.get_module(MessageDeletion.IDENTITY).can_delete_for_everyone(conversation, content_item);
+
+ Plugins.MessageAction action = new Plugins.MessageAction();
+ action.name = "delete";
+ action.icon_name = "user-trash-symbolic";
+ action.tooltip = _("Delete message");
+ action.shortcut_action = false;
+ action.callback = () => {
+ Adw.AlertDialog dialog = new Adw.AlertDialog(_("Delete message"), null) { content_width = 350, follows_content_size = false };
+ if (can_delete_for_everyone) {
+ CheckButton check_button = new CheckButton() { label="Delete for everyone", active=true };
+
+ Box extra_child = new Box(Orientation.VERTICAL, 8);
+ extra_child.append(new Label("Would you like to remove this message for everyone or just for yourself?") { xalign=0, use_markup=true, wrap=true });
+ extra_child.append(new Label("The message will only be deleted for others <b>if their app supports it</b>!") { xalign=0, use_markup=true, wrap=true });
+ extra_child.append(check_button);
+ dialog.extra_child = extra_child;
+
+ check_button.toggled.connect(() => {
+ dialog.remove_response("delete");
+ dialog.remove_response("cancel");
+ if (check_button.active) {
+ dialog.add_response("delete", "Delete for everyone");
+ } else {
+ dialog.add_response("delete", "Only delete for yourself");
+ }
+ dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE);
+ dialog.add_response("cancel", "Cancel");
+ });
+ dialog.response.connect((response) => {
+ if (response == "delete") {
+ if (check_button.active) {
+ stream_interactor.get_module(MessageDeletion.IDENTITY).delete_globally(conversation, content_item);
+ } else {
+ stream_interactor.get_module(MessageDeletion.IDENTITY).delete_locally(conversation, content_item, conversation.account.bare_jid);
+ }
+ }
+ });
+ dialog.add_response("delete", "Delete for everyone");
+ dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE);
+ dialog.add_response("cancel", "Cancel");
+ } else {
+ dialog.extra_child = new Label("This message <b>can't be deleted</b> for everyone. Would you like to remove it only for yourself?") { use_markup=true, wrap=true };
+ dialog.add_response("delete", "Only delete for myself");
+ dialog.set_response_appearance("delete", Adw.ResponseAppearance.DESTRUCTIVE);
+ dialog.add_response("cancel", "Cancel");
+ dialog.response.connect((response) => {
+ if (response == "delete") {
+ stream_interactor.get_module(MessageDeletion.IDENTITY).delete_locally(conversation, content_item, conversation.account.bare_jid);
+ }
+ });
+ }
+ dialog.present(((Dino.Ui.Application)Dino.Application.get_default()).window);
+ };
+ return action;
+ }
} \ No newline at end of file