From 492a45da37b6b8e9b5b8091f6e3f26031cac69b1 Mon Sep 17 00:00:00 2001
From: David Taylor <david@taylorhq.com>
Date: Thu, 1 Aug 2024 13:43:18 +0100
Subject: [PATCH] DEV: Introduce `home-logo-image-url` value transformer
 (#28189)

Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
---
 .../app/components/header/home-logo.gjs       | 28 +++++++++++--------
 .../discourse/app/lib/transformer/registry.js |  1 +
 .../transformers/home-logo-image-url-test.js  | 25 +++++++++++++++++
 3 files changed, 42 insertions(+), 12 deletions(-)
 create mode 100644 app/assets/javascripts/discourse/tests/acceptance/transformers/home-logo-image-url-test.js

diff --git a/app/assets/javascripts/discourse/app/components/header/home-logo.gjs b/app/assets/javascripts/discourse/app/components/header/home-logo.gjs
index 2dab793b189..c4606ff489a 100644
--- a/app/assets/javascripts/discourse/app/components/header/home-logo.gjs
+++ b/app/assets/javascripts/discourse/app/components/header/home-logo.gjs
@@ -55,23 +55,27 @@ export default class HomeLogo extends Component {
   }
 
   logoResolver(name, opts = {}) {
-    // get alternative logos for browser dark dark mode switching
-    if (opts.dark) {
-      return this.siteSettings[`site_${name}_dark_url`];
-    }
+    let url;
 
-    // try dark logos first when color scheme is dark
-    // this is independent of browser dark mode
-    // hence the fallback to normal logos
-    if (this.session.defaultColorSchemeIsDark) {
-      return (
+    if (opts.dark) {
+      // get alternative logos for browser dark dark mode switching
+      url = this.siteSettings[`site_${name}_dark_url`];
+    } else if (this.session.defaultColorSchemeIsDark) {
+      // try dark logos first when color scheme is dark
+      // this is independent of browser dark mode
+      // hence the fallback to normal logos
+      url =
         this.siteSettings[`site_${name}_dark_url`] ||
         this.siteSettings[`site_${name}_url`] ||
-        ""
-      );
+        "";
+    } else {
+      url = this.siteSettings[`site_${name}_url`] || "";
     }
 
-    return this.siteSettings[`site_${name}_url`] || "";
+    return applyValueTransformer("home-logo-image-url", url, {
+      name,
+      dark: opts.dark,
+    });
   }
 
   @action
diff --git a/app/assets/javascripts/discourse/app/lib/transformer/registry.js b/app/assets/javascripts/discourse/app/lib/transformer/registry.js
index bde4aef4d0a..1f6ea052df3 100644
--- a/app/assets/javascripts/discourse/app/lib/transformer/registry.js
+++ b/app/assets/javascripts/discourse/app/lib/transformer/registry.js
@@ -7,4 +7,5 @@ export const VALUE_TRANSFORMERS = Object.freeze([
   // use only lowercase names
   "header-notifications-avatar-size",
   "home-logo-href",
+  "home-logo-image-url",
 ]);
diff --git a/app/assets/javascripts/discourse/tests/acceptance/transformers/home-logo-image-url-test.js b/app/assets/javascripts/discourse/tests/acceptance/transformers/home-logo-image-url-test.js
new file mode 100644
index 00000000000..f439988663a
--- /dev/null
+++ b/app/assets/javascripts/discourse/tests/acceptance/transformers/home-logo-image-url-test.js
@@ -0,0 +1,25 @@
+import { visit } from "@ember/test-helpers";
+import { test } from "qunit";
+import { withPluginApi } from "discourse/lib/plugin-api";
+import { acceptance } from "discourse/tests/helpers/qunit-helpers";
+
+acceptance("home-logo-image-url transformer", function () {
+  test("applying a value transformation", async function (assert) {
+    withPluginApi("1.34.0", (api) => {
+      api.registerValueTransformer(
+        "home-logo-image-url",
+        ({ value }) => "/transformed" + value
+      );
+    });
+
+    await visit("/");
+
+    assert
+      .dom("#site-logo")
+      .hasAttribute(
+        "src",
+        "/transformed/assets/logo.png",
+        "it transforms the logo url"
+      );
+  });
+});