From 1ede8ade12f26cf39d29d5c616bd28693d677e09 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Fri, 14 Nov 2025 14:48:25 -0600 Subject: Add support for message moderation and retraction --- .../ui/conversation_content_view/item_actions.vala | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'main/src/ui/conversation_content_view/item_actions.vala') 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 if their app supports it!") { 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 can't be deleted 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 -- cgit v1.3