FIX: Offer site_logo_dark_url as an option for dark mode themes (#14361)

FIX: Offer site_logo_dark_url as an option for dark mode themes (#14361)

diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 56996a4..8bd509f 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -341,6 +341,18 @@ module ApplicationHelper
     end
   end
 
+  def application_logo_dark_url
+    @application_logo_dark_url ||= begin
+      if dark_scheme_id != -1
+        if mobile_view? && SiteSetting.site_mobile_logo_dark_url != application_logo_url
+          SiteSetting.site_mobile_logo_dark_url
+        elsif !mobile_view? && SiteSetting.site_logo_dark_url != application_logo_url
+          SiteSetting.site_logo_dark_url
+        end
+      end
+    end
+  end
+
   def login_path
     "#{Discourse.base_path}/login"
   end
diff --git a/app/views/application/_header.html.erb b/app/views/application/_header.html.erb
index 9c2e593..d93fca7 100644
--- a/app/views/application/_header.html.erb
+++ b/app/views/application/_header.html.erb
@@ -5,7 +5,12 @@
         <div class="title">
           <a href="<%= path "/" %>">
             <%- if application_logo_url.present? %>
-              <img src="<%= application_logo_url %>" alt="<%= SiteSetting.title %>" id="site-logo">
+              <picture>
+                <%- if application_logo_dark_url.present? %>
+                  <source srcset="<%= application_logo_dark_url %>" media="(prefers-color-scheme: dark)" />
+                <%- end %>
+                <img src="<%= application_logo_url %>" alt="<%= SiteSetting.title %>" id="site-logo" />
+              </picture>
             <%- else %>
               <h2 id='site-text-logo'><%= SiteSetting.title %></h2>
             <%- end %>
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index ccc7842..bc20d32 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -136,6 +136,59 @@ describe ApplicationHelper do
     end
   end
 
+  describe "application_logo_dark_url" do
+    context "when dark theme is not present" do
+      context "when dark logo is not present" do
+        it "should return nothing" do
+          expect(helper.application_logo_dark_url.present?).to eq(false)
+        end
+      end
+    end
+
+    context "when dark theme is present" do
+      before do
+        dark_theme = Theme.create(
+          name: "Dark",
+          user_id: -1,
+          color_scheme_id: ColorScheme.find_by(base_scheme_id: "Dark").id
+        )
+      end
+
+      context "when dark logo is not present" do
+        it "should return nothing" do
+          expect(helper.application_logo_dark_url.present?).to eq(false)
+        end
+      end
+
+      context "when dark logo is present" do
+        before do
+          SiteSetting.logo_dark = Fabricate(:upload, url: '/images/logo-dark.png')
+        end
+
+        it "should return correct url" do
+          expect(helper.application_logo_dark_url).to eq(SiteSetting.site_logo_dark_url)
+        end
+      end
+    end
+
+    context "when dark theme is present and selected" do
+      before do
+        dark_theme = Theme.create(
+          name: "Dark",
+          user_id: -1,
+          color_scheme_id: ColorScheme.find_by(base_scheme_id: "Dark").id
+        )
+        helper.request.env[:resolved_theme_id] = dark_theme.id
+        SiteSetting.logo_dark = Fabricate(:upload, url: '/images/logo-dark.png')
+      end
+
+      it "should return nothing" do
+        expect(helper.application_logo_url).to eq(SiteSetting.site_logo_dark_url)
+        expect(helper.application_logo_dark_url.present?).to eq(false)
+      end
+    end
+  end
+
   describe "mobile_view?" do
     context "enable_mobile_theme is true" do
       before do

GitHub sha: da88cad6489a6211bebcf4b0e5c357e3b1100e50

This commit appears in #14361 which was approved by pmusaraj. It was merged by jbrw.