From 111c686ff79558f395d7694a5bbd5cc91db15c14 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 16 Apr 2026 23:33:24 -0500 Subject: [PATCH] feat(ui): implement warning for stranger links and configurable messages sidebar position --- .../messages/ConversationViewer.vue | 30 +++++++++- .../components/messages/MessagesPage.vue | 10 +++- .../components/messages/MessagesSidebar.vue | 57 +++++++++++++++---- .../components/settings/SettingsPage.vue | 48 ++++++++++++++++ .../frontend/components/tools/BotsPage.vue | 14 +++-- 5 files changed, 142 insertions(+), 17 deletions(-) diff --git a/meshchatx/src/frontend/components/messages/ConversationViewer.vue b/meshchatx/src/frontend/components/messages/ConversationViewer.vue index 280ec64..8c712fb 100644 --- a/meshchatx/src/frontend/components/messages/ConversationViewer.vue +++ b/meshchatx/src/frontend/components/messages/ConversationViewer.vue @@ -1783,6 +1783,9 @@ export default { showUnknownContactBanner() { return GlobalState.config?.show_unknown_contact_banner !== false; }, + warnOnStrangerLinksEnabled() { + return GlobalState.config?.warn_on_stranger_links !== false; + }, filteredContacts() { if (!this.contactsSearch) return this.contacts; const s = this.contactsSearch.toLowerCase(); @@ -2162,7 +2165,7 @@ export default { } return base; }, - handleMessageClick(event) { + async handleMessageClick(event) { const nomadnetLink = event.target.closest(".nomadnet-link"); if (nomadnetLink) { event.preventDefault(); @@ -2177,6 +2180,7 @@ export default { query: { path: path }, }); } + return; } const lxmfLink = event.target.closest(".lxmf-link"); @@ -2189,7 +2193,31 @@ export default { params: { destinationHash: address }, }); } + return; } + + const standardLink = event.target.closest("a[href]"); + if (!standardLink) { + return; + } + + const href = String(standardLink.getAttribute("href") || "").trim(); + if (!/^https?:\/\//i.test(href)) { + event.preventDefault(); + return; + } + + event.preventDefault(); + if (this.isStrangerPeer && this.warnOnStrangerLinksEnabled) { + const proceed = await DialogUtils.confirm( + this.$t("messages.stranger_link_open_confirm", { url: href }) + ); + if (!proceed) { + return; + } + } + + window.open(href, "_blank", "noopener"); }, async updatePropagationNodeStatus() { try { diff --git a/meshchatx/src/frontend/components/messages/MessagesPage.vue b/meshchatx/src/frontend/components/messages/MessagesPage.vue index fff50f1..34983ed 100644 --- a/meshchatx/src/frontend/components/messages/MessagesPage.vue +++ b/meshchatx/src/frontend/components/messages/MessagesPage.vue @@ -1,10 +1,11 @@