From 1e6d9ed634da83c92d48462312909751c97048a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Wed, 15 May 2024 10:06:38 +0200 Subject: [PATCH] FIX: respect "external_links_in_new_tab" user preference... (#622) ... for AI conversations since they look & feel "external". Internal ref - /t/128182 --- .../discourse-ai-shared-conversation-show.js | 19 ++++-- ...-ai-shared-conversation-show-route-test.js | 64 +++++++++++++++++++ 2 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 test/javascripts/unit/routes/discourse-ai-shared-conversation-show-route-test.js diff --git a/assets/javascripts/discourse/routes/discourse-ai-shared-conversation-show.js b/assets/javascripts/discourse/routes/discourse-ai-shared-conversation-show.js index 03effaa9..7d33124d 100644 --- a/assets/javascripts/discourse/routes/discourse-ai-shared-conversation-show.js +++ b/assets/javascripts/discourse/routes/discourse-ai-shared-conversation-show.js @@ -1,8 +1,19 @@ +import { service } from "@ember/service"; import DiscourseRoute from "discourse/routes/discourse"; -export default DiscourseRoute.extend({ +export default class DiscourseAiSharedConversationShowRoute extends DiscourseRoute { + @service currentUser; + beforeModel(transition) { - window.location = transition.intent.url; + if (this.currentUser?.user_option?.external_links_in_new_tab) { + window.open(transition.intent.url, "_blank"); + } else { + this.redirect(transition.intent.url); + } transition.abort(); - }, -}); + } + + redirect(url) { + window.location = url; + } +} diff --git a/test/javascripts/unit/routes/discourse-ai-shared-conversation-show-route-test.js b/test/javascripts/unit/routes/discourse-ai-shared-conversation-show-route-test.js new file mode 100644 index 00000000..462c5aad --- /dev/null +++ b/test/javascripts/unit/routes/discourse-ai-shared-conversation-show-route-test.js @@ -0,0 +1,64 @@ +import { setupTest } from "ember-qunit"; +import { module, test } from "qunit"; + +module( + "Unit | Route | discourse-ai-shared-conversation-show", + function (hooks) { + setupTest(hooks); + + test("it redirects based on currentUser preference", function (assert) { + const transition = { + intent: { url: "https://www.discourse.org" }, + abort() { + assert.ok(true, "transition.abort() was called"); + }, + }; + + const route = this.owner.lookup( + "route:discourse-ai-shared-conversation-show" + ); + + const originalOpen = window.open; + const originalRedirect = route.redirect; + + // Test when external_links_in_new_tab is true + route.set("currentUser", { + user_option: { + external_links_in_new_tab: true, + }, + }); + + window.open = (url, target) => { + assert.equal( + url, + "https://www.discourse.org", + "window.open was called with the correct URL" + ); + assert.equal(target, "_blank", 'window.open was called with "_blank"'); + }; + + route.beforeModel(transition); + + // Test when external_links_in_new_tab is false + route.set("currentUser", { + user_option: { + external_links_in_new_tab: false, + }, + }); + + route.redirect = (url) => { + assert.equal( + url, + "https://www.discourse.org", + "redirect was called with the correct URL" + ); + }; + + route.beforeModel(transition); + + // Reset + window.open = originalOpen; + route.redirect = originalRedirect; + }); + } +);