Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 1 addition & 41 deletions src/palettes/changeTheme/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ import "./style.scss";
import palette from "components/palette";
import config from "lib/config";
import appSettings from "lib/settings";
import { isDeviceDarkTheme } from "lib/systemConfiguration";
import themes from "theme/list";
import { updateSystemTheme } from "theme/preInstalled";
import themes, { updateSystemThemeWatcher } from "theme/list";
import changeEditorTheme from "../changeEditorTheme";

export default function changeTheme(type = "editor") {
Expand Down Expand Up @@ -41,44 +39,6 @@ function generateHints(type) {
});
}

let previousDark = isDeviceDarkTheme();
const updateTimeMs = 2000;

let intervalId = null;

function syncSystemTheme() {
if (appSettings.value.appTheme.toLowerCase() === "system") {
const isDark = isDeviceDarkTheme();
if (isDark !== previousDark) {
previousDark = isDark;
updateSystemTheme(isDark);
}
}
}

function startSystemThemeWatcher() {
if (intervalId) return;
intervalId = setInterval(syncSystemTheme, updateTimeMs);
}

function stopSystemThemeWatcher() {
if (!intervalId) return;
clearInterval(intervalId);
intervalId = null;
}

function updateSystemThemeWatcher(theme) {
if (String(theme).toLowerCase() === "system") {
startSystemThemeWatcher();
syncSystemTheme();
return;
}
stopSystemThemeWatcher();
}

updateSystemThemeWatcher(appSettings.value.appTheme);
appSettings.on("update:appTheme", updateSystemThemeWatcher);

function onselect(value) {
if (!value) return;

Expand Down
45 changes: 45 additions & 0 deletions src/theme/list.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,13 @@ const appThemes = new Map();
let themeApplied = false;
let firstTime = true;

const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
let systemThemeWatcherActive = false;

function init() {
themes.forEach((theme) => add(theme));
updateSystemThemeWatcher(settings.value.appTheme);
settings.on("update:appTheme", updateSystemThemeWatcher);
}

/**
Expand Down Expand Up @@ -159,6 +164,45 @@ export function update(theme) {
});
}

function syncSystemTheme(event) {
if (settings.value.appTheme.toLowerCase() !== "system") return;
const isDark = event ? event.matches : darkModeMediaQuery.matches;
updateSystemTheme(isDark);
}

function startSystemThemeWatcher() {
if (systemThemeWatcherActive) return;
systemThemeWatcherActive = true;
if (typeof darkModeMediaQuery.addEventListener === "function") {
darkModeMediaQuery.addEventListener("change", syncSystemTheme);
} else {
darkModeMediaQuery.addListener(syncSystemTheme);
}
}

function stopSystemThemeWatcher() {
if (!systemThemeWatcherActive) return;
systemThemeWatcherActive = false;
if (typeof darkModeMediaQuery.removeEventListener === "function") {
darkModeMediaQuery.removeEventListener("change", syncSystemTheme);
} else {
darkModeMediaQuery.removeListener(syncSystemTheme);
}
}

/**
* Start or stop syncing the app theme with the OS color scheme
* @param {string} theme
*/
export function updateSystemThemeWatcher(theme) {
if (String(theme).toLowerCase() === "system") {
startSystemThemeWatcher();
syncSystemTheme();
return;
}
stopSystemThemeWatcher();
}

export default {
get applied() {
return themeApplied;
Expand All @@ -169,4 +213,5 @@ export default {
add,
apply,
update,
updateSystemThemeWatcher,
};
1 change: 1 addition & 0 deletions src/theme/preInstalled.js
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ export function updateSystemTheme(darkTheme) {

if (appSettings?.value?.appTheme === "system") {
apply(system.id);
appSettings.update({ editorTheme: system.preferredEditorTheme }, false);
}
}

Expand Down