Skip to content

Commit bfc64b3

Browse files
fix: theme listener
1 parent 7eb0270 commit bfc64b3

2 files changed

Lines changed: 46 additions & 30 deletions

File tree

src/palettes/changeTheme/index.js

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ import "./style.scss";
22
import palette from "components/palette";
33
import config from "lib/config";
44
import appSettings from "lib/settings";
5-
import themes from "theme/list";
6-
import { updateSystemTheme } from "theme/preInstalled";
5+
import themes, { updateSystemThemeWatcher } from "theme/list";
76
import changeEditorTheme from "../changeEditorTheme";
87

9-
const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
10-
118
export default function changeTheme(type = "editor") {
129
if (type === "editor") return changeEditorTheme();
1310
palette(
@@ -42,32 +39,6 @@ function generateHints(type) {
4239
});
4340
}
4441

45-
function syncSystemTheme(event) {
46-
if (appSettings.value.appTheme.toLowerCase() !== "system") return;
47-
const isDark = event ? event.matches : darkModeMediaQuery.matches;
48-
updateSystemTheme(isDark);
49-
}
50-
51-
function startSystemThemeWatcher() {
52-
darkModeMediaQuery.addEventListener("change", syncSystemTheme);
53-
}
54-
55-
function stopSystemThemeWatcher() {
56-
darkModeMediaQuery.removeEventListener("change", syncSystemTheme);
57-
}
58-
59-
function updateSystemThemeWatcher(theme) {
60-
if (String(theme).toLowerCase() === "system") {
61-
startSystemThemeWatcher();
62-
syncSystemTheme();
63-
return;
64-
}
65-
stopSystemThemeWatcher();
66-
}
67-
68-
updateSystemThemeWatcher(appSettings.value.appTheme);
69-
appSettings.on("update:appTheme", updateSystemThemeWatcher);
70-
7142
function onselect(value) {
7243
if (!value) return;
7344

src/theme/list.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ const appThemes = new Map();
1111
let themeApplied = false;
1212
let firstTime = true;
1313

14+
const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
15+
let systemThemeWatcherActive = false;
16+
1417
function init() {
1518
themes.forEach((theme) => add(theme));
19+
updateSystemThemeWatcher(settings.value.appTheme);
20+
settings.on("update:appTheme", updateSystemThemeWatcher);
1621
}
1722

1823
/**
@@ -159,6 +164,45 @@ export function update(theme) {
159164
});
160165
}
161166

167+
function syncSystemTheme(event) {
168+
if (settings.value.appTheme.toLowerCase() !== "system") return;
169+
const isDark = event ? event.matches : darkModeMediaQuery.matches;
170+
updateSystemTheme(isDark);
171+
}
172+
173+
function startSystemThemeWatcher() {
174+
if (systemThemeWatcherActive) return;
175+
systemThemeWatcherActive = true;
176+
if (typeof darkModeMediaQuery.addEventListener === "function") {
177+
darkModeMediaQuery.addEventListener("change", syncSystemTheme);
178+
} else {
179+
darkModeMediaQuery.addListener(syncSystemTheme);
180+
}
181+
}
182+
183+
function stopSystemThemeWatcher() {
184+
if (!systemThemeWatcherActive) return;
185+
systemThemeWatcherActive = false;
186+
if (typeof darkModeMediaQuery.removeEventListener === "function") {
187+
darkModeMediaQuery.removeEventListener("change", syncSystemTheme);
188+
} else {
189+
darkModeMediaQuery.removeListener(syncSystemTheme);
190+
}
191+
}
192+
193+
/**
194+
* Start or stop syncing the app theme with the OS color scheme
195+
* @param {string} theme
196+
*/
197+
export function updateSystemThemeWatcher(theme) {
198+
if (String(theme).toLowerCase() === "system") {
199+
startSystemThemeWatcher();
200+
syncSystemTheme();
201+
return;
202+
}
203+
stopSystemThemeWatcher();
204+
}
205+
162206
export default {
163207
get applied() {
164208
return themeApplied;
@@ -169,4 +213,5 @@ export default {
169213
add,
170214
apply,
171215
update,
216+
updateSystemThemeWatcher,
172217
};

0 commit comments

Comments
 (0)