Skip to content
Open
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
27 changes: 8 additions & 19 deletions src/palettes/changeTheme/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ 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 changeEditorTheme from "../changeEditorTheme";

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

export default function changeTheme(type = "editor") {
if (type === "editor") return changeEditorTheme();
palette(
Expand Down Expand Up @@ -41,30 +42,18 @@ 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 syncSystemTheme(event) {
if (appSettings.value.appTheme.toLowerCase() !== "system") return;
const isDark = event ? event.matches : darkModeMediaQuery.matches;
updateSystemTheme(isDark);
}

function startSystemThemeWatcher() {
if (intervalId) return;
intervalId = setInterval(syncSystemTheme, updateTimeMs);
darkModeMediaQuery.addEventListener("change", syncSystemTheme);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Legacy Media Query Listener Crash

When a WebView supports matchMedia but exposes only addListener, selecting the system theme now throws because addEventListener is undefined. The previous polling path worked in this runtime, so system-theme synchronization needs matching addListener and removeListener fallbacks.

}

function stopSystemThemeWatcher() {
if (!intervalId) return;
clearInterval(intervalId);
intervalId = null;
darkModeMediaQuery.removeEventListener("change", syncSystemTheme);
}

function updateSystemThemeWatcher(theme) {
Expand Down
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
Loading