Skip to content
This repository was archived by the owner on Feb 7, 2025. It is now read-only.

Commit e33db19

Browse files
authored
FIX: Render the correct logo for the active scheme when logo is minimized (#57)
There's currently a bug where if you use the color scheme toggler to switch to the opposite color mode of your system preference, i.e. enable light mode when your system preference is dark and vice versa, the header logo renders the version matching your system preference instead of the selected choice made via the toggler the next time the logo is minimized or expanded (e.g. when scrolling in a long topic). The bug occurs because when you switch your color scheme via the toggler component, the component updates all the relevant DOM elements that are currently in-view, but subsequent changes to the DOM made by the app, e.g. when the header logo is minimized/expanded, aren't aware of the new choice and resort to the system preference. This commit fixes the bug by adding a hook to the header logo that gets called when the logo is minimized/expanded and making sure the user's scheme choice is applied to the logo when it's re-rendered. Internal topic: t/144688.
1 parent 2da8ecc commit e33db19

File tree

4 files changed

+113
-12
lines changed

4 files changed

+113
-12
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Component from "@glimmer/component";
2+
import { action } from "@ember/object";
3+
import didUpdate from "@ember/render-modifiers/modifiers/did-update";
4+
import { service } from "@ember/service";
5+
import {
6+
changeHomeLogo,
7+
COLOR_SCHEME_OVERRIDE_KEY,
8+
} from "../../lib/color-scheme-override";
9+
10+
export default class MinimizedHook extends Component {
11+
@service keyValueStore;
12+
13+
@action
14+
onMinimizedChange() {
15+
const storedOverride = this.keyValueStore.getItem(
16+
COLOR_SCHEME_OVERRIDE_KEY
17+
);
18+
if (storedOverride) {
19+
changeHomeLogo(storedOverride);
20+
}
21+
}
22+
23+
<template>
24+
<span
25+
class="hidden color-toggler-minimized-hook"
26+
{{didUpdate this.onMinimizedChange @outletArgs.minimized}}
27+
/>
28+
</template>
29+
}

javascripts/discourse/lib/color-scheme-override.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,18 @@ export function colorSchemeOverride(type) {
1010
return;
1111
}
1212

13-
const logoDarkSrc = document.querySelector(".title picture source");
14-
1513
switch (type) {
1614
case "dark":
1715
lightScheme.origMedia = lightScheme.media;
1816
lightScheme.media = "none";
1917
darkScheme.origMedia = darkScheme.media;
2018
darkScheme.media = "all";
21-
if (logoDarkSrc) {
22-
logoDarkSrc.origMedia = logoDarkSrc.media;
23-
logoDarkSrc.media = "all";
24-
}
2519
break;
2620
case "light":
2721
lightScheme.origMedia = lightScheme.media;
2822
lightScheme.media = "all";
2923
darkScheme.origMedia = darkScheme.media;
3024
darkScheme.media = "none";
31-
if (logoDarkSrc) {
32-
logoDarkSrc.origMedia = logoDarkSrc.media;
33-
logoDarkSrc.media = "none";
34-
}
3525
break;
3626
default:
3727
if (lightScheme.origMedia) {
@@ -42,7 +32,29 @@ export function colorSchemeOverride(type) {
4232
darkScheme.media = darkScheme.origMedia;
4333
darkScheme.removeAttribute("origMedia");
4434
}
45-
if (logoDarkSrc?.origMedia) {
35+
break;
36+
}
37+
changeHomeLogo(type);
38+
}
39+
40+
export function changeHomeLogo(type) {
41+
const logoDarkSrc = document.querySelector(".title picture source");
42+
43+
if (!logoDarkSrc) {
44+
return;
45+
}
46+
47+
switch (type) {
48+
case "dark":
49+
logoDarkSrc.origMedia = logoDarkSrc.media;
50+
logoDarkSrc.media = "all";
51+
break;
52+
case "light":
53+
logoDarkSrc.origMedia = logoDarkSrc.media;
54+
logoDarkSrc.media = "none";
55+
break;
56+
default:
57+
if (logoDarkSrc.origMedia) {
4658
logoDarkSrc.media = logoDarkSrc.origMedia;
4759
}
4860
break;

locales/en.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
en:
2-
toggle_button_title: Toggle color scheme
2+
toggle_button_title: Toggle color palette
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe "", system: true do
4+
fab!(:topic) { Fabricate(:post).topic }
5+
fab!(:user)
6+
fab!(:post) { Fabricate(:post, topic:, raw: <<~POST * 20) }
7+
Very lengthy post with lots of height for testing logo change when scrolling
8+
9+
Here's another paragraph to make the post take very large vertical space\n
10+
POST
11+
12+
fab!(:dark_mode_image) { Fabricate(:image_upload, color: "white", width: 400, height: 120) }
13+
fab!(:light_mode_image) { Fabricate(:image_upload, color: "black", width: 400, height: 120) }
14+
15+
fab!(:small_dark_mode_image) { Fabricate(:image_upload, color: "white", width: 120, height: 120) }
16+
fab!(:small_light_mode_image) do
17+
Fabricate(:image_upload, color: "black", width: 120, height: 120)
18+
end
19+
20+
let!(:theme_component) { upload_theme_component }
21+
22+
let(:topic_page) { PageObjects::Pages::Topic.new }
23+
24+
before do
25+
SiteSetting.logo = light_mode_image
26+
SiteSetting.logo_small = small_light_mode_image
27+
SiteSetting.logo_dark = dark_mode_image
28+
SiteSetting.logo_small_dark = small_dark_mode_image
29+
sign_in(user)
30+
end
31+
32+
it "applies the correct `media` attribute on the source element when the logo is minimized upon scrolling" do
33+
topic_page.visit_topic(topic)
34+
35+
dark_logo_source =
36+
find(
37+
".title picture source[media=\"(prefers-color-scheme: dark)\"][srcset*=\"#{dark_mode_image.url}\"]",
38+
visible: false,
39+
)
40+
expect(dark_logo_source).to be_present
41+
42+
find(".color-scheme-toggler").click
43+
44+
dark_logo_source =
45+
find(
46+
".title picture source[media=\"all\"][srcset*=\"#{dark_mode_image.url}\"]",
47+
visible: false,
48+
)
49+
expect(dark_logo_source).to be_present
50+
51+
page.scroll_to(find(".topic-footer-main-buttons .create"))
52+
53+
dark_logo_source =
54+
find(
55+
".title picture source[media=\"all\"][srcset*=\"#{small_dark_mode_image.url}\"]",
56+
visible: false,
57+
)
58+
expect(dark_logo_source).to be_present
59+
end
60+
end

0 commit comments

Comments
 (0)