fix: only persist edited/existing mode overrides, refresh popover theme on dark mode toggle

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-26 16:11:24 -04:00
parent dd92ce8f0a
commit 210676e65b
3 changed files with 65 additions and 8 deletions

View File

@@ -156,6 +156,10 @@
const subredditName = container.getAttribute("data-rt-subreddit"); const subredditName = container.getAttribute("data-rt-subreddit");
applyColorsToContainer(container, settings, subredditName); applyColorsToContainer(container, settings, subredditName);
}); });
if (window.RedditTweaks.colorPopover && window.RedditTweaks.colorPopover.refreshTheme) {
window.RedditTweaks.colorPopover.refreshTheme(settings);
}
} }
function apply(settings) { function apply(settings) {

View File

@@ -6,6 +6,8 @@
var currentAnchor = null; var currentAnchor = null;
var editState = { light: null, dark: null }; var editState = { light: null, dark: null };
var selectedMode = "light"; var selectedMode = "light";
var dirtyModes = { light: false, dark: false };
var hadOverride = { light: false, dark: false };
var els = {}; var els = {};
@@ -103,6 +105,7 @@
els.resetBtn.addEventListener("click", resetToDefault); els.resetBtn.addEventListener("click", resetToDefault);
els.modeSelect.addEventListener("change", function () { els.modeSelect.addEventListener("change", function () {
markModeDirty(selectedMode);
storeCurrentEdits(); storeCurrentEdits();
selectedMode = els.modeSelect.value; selectedMode = els.modeSelect.value;
loadModeIntoInputs(); loadModeIntoInputs();
@@ -114,11 +117,13 @@
(function (prop) { (function (prop) {
var row = els.rows[prop]; var row = els.rows[prop];
row.swatch.addEventListener("input", function () { row.swatch.addEventListener("input", function () {
markModeDirty(selectedMode);
row.hex.value = row.swatch.value; row.hex.value = row.swatch.value;
row.hex.classList.remove("rt-input-error"); row.hex.classList.remove("rt-input-error");
updatePreview(); updatePreview();
}); });
row.hex.addEventListener("input", function () { row.hex.addEventListener("input", function () {
markModeDirty(selectedMode);
if (hexValid(row.hex.value)) { if (hexValid(row.hex.value)) {
row.swatch.value = row.hex.value; row.swatch.value = row.hex.value;
row.hex.classList.remove("rt-input-error"); row.hex.classList.remove("rt-input-error");
@@ -166,6 +171,15 @@
return getDefaultsForMode(settings, mode); return getDefaultsForMode(settings, mode);
} }
function markModeDirty(mode) {
dirtyModes[mode] = true;
}
function resetTracking() {
dirtyModes = { light: false, dark: false };
hadOverride = { light: false, dark: false };
}
function storeCurrentEdits() { function storeCurrentEdits() {
editState[selectedMode] = { editState[selectedMode] = {
bg: els.rows.bg.swatch.value, bg: els.rows.bg.swatch.value,
@@ -239,6 +253,11 @@
currentSubreddit = subredditName; currentSubreddit = subredditName;
currentAnchor = badgeEl; currentAnchor = badgeEl;
resetTracking();
var existingEntry = settings.subredditColors[subredditName];
hadOverride.light = !!(existingEntry && existingEntry.light);
hadOverride.dark = !!(existingEntry && existingEntry.dark);
var helpers = getHelpers(); var helpers = getHelpers();
selectedMode = helpers.getColorPrefix(settings); selectedMode = helpers.getColorPrefix(settings);
@@ -261,6 +280,7 @@
currentSubreddit = null; currentSubreddit = null;
currentAnchor = null; currentAnchor = null;
editState = { light: null, dark: null }; editState = { light: null, dark: null };
resetTracking();
} }
async function save() { async function save() {
@@ -271,10 +291,18 @@
var settings = await window.RedditTweaks.loadSettings(); var settings = await window.RedditTweaks.loadSettings();
var entry = settings.subredditColors[currentSubreddit] || {}; var entry = settings.subredditColors[currentSubreddit] || {};
if (editState.light) entry.light = editState.light; if (dirtyModes.light || hadOverride.light) {
if (editState.dark) entry.dark = editState.dark; entry.light = editState.light;
}
if (dirtyModes.dark || hadOverride.dark) {
entry.dark = editState.dark;
}
if (!entry.light && !entry.dark) {
delete settings.subredditColors[currentSubreddit];
} else {
settings.subredditColors[currentSubreddit] = entry; settings.subredditColors[currentSubreddit] = entry;
}
await window.RedditTweaks.saveSettings(settings); await window.RedditTweaks.saveSettings(settings);
close(); close();
} }
@@ -286,15 +314,22 @@
delete settings.subredditColors[currentSubreddit]; delete settings.subredditColors[currentSubreddit];
await window.RedditTweaks.saveSettings(settings); await window.RedditTweaks.saveSettings(settings);
resetTracking();
editState.light = getDefaultsForMode(settings, "light"); editState.light = getDefaultsForMode(settings, "light");
editState.dark = getDefaultsForMode(settings, "dark"); editState.dark = getDefaultsForMode(settings, "dark");
loadModeIntoInputs(); loadModeIntoInputs();
updatePreview(); updatePreview();
} }
function refreshTheme(settings) {
if (!popoverEl || !popoverEl.classList.contains("rt-popover-visible")) return;
applyDarkModeToPopover(settings);
}
window.RedditTweaks = window.RedditTweaks || {}; window.RedditTweaks = window.RedditTweaks || {};
window.RedditTweaks.colorPopover = { window.RedditTweaks.colorPopover = {
open: open, open: open,
close: close, close: close,
refreshTheme: refreshTheme,
}; };
})(); })();

View File

@@ -103,9 +103,15 @@
light: { bg: bgInput.value, border: borderInput.value, text: textInput.value }, light: { bg: bgInput.value, border: borderInput.value, text: textInput.value },
dark: { bg: colorToHex(darkColors.bg), border: colorToHex(darkColors.border), text: colorToHex(darkColors.text) }, dark: { bg: colorToHex(darkColors.bg), border: colorToHex(darkColors.border), text: colorToHex(darkColors.text) },
}; };
entry._hadOverride = {
light: !!(modeColors && modeColors.light),
dark: !!(modeColors && modeColors.dark),
};
entry._dirtyModes = { light: false, dark: false };
modeSelect.addEventListener("change", function () { modeSelect.addEventListener("change", function () {
var prev = modeSelect.value === "dark" ? "light" : "dark"; var prev = modeSelect.value === "dark" ? "light" : "dark";
entry._dirtyModes[prev] = true;
entry._colorState[prev] = { bg: bgInput.value, border: borderInput.value, text: textInput.value }; entry._colorState[prev] = { bg: bgInput.value, border: borderInput.value, text: textInput.value };
var next = entry._colorState[modeSelect.value]; var next = entry._colorState[modeSelect.value];
bgInput.value = next.bg; bgInput.value = next.bg;
@@ -114,7 +120,12 @@
}); });
[nameInput, bgInput, borderInput, textInput].forEach(function (input) { [nameInput, bgInput, borderInput, textInput].forEach(function (input) {
input.addEventListener("change", saveFromControls); input.addEventListener("change", function () {
if (input !== nameInput) {
entry._dirtyModes[modeSelect.value] = true;
}
saveFromControls();
});
}); });
entry.appendChild(header); entry.appendChild(header);
@@ -144,10 +155,17 @@
text: entry._textInput.value, text: entry._textInput.value,
}; };
overrides[name] = { var entryOverrides = {};
light: entry._colorState.light, if (entry._hadOverride.light || entry._dirtyModes.light) {
dark: entry._colorState.dark, entryOverrides.light = entry._colorState.light;
}; }
if (entry._hadOverride.dark || entry._dirtyModes.dark) {
entryOverrides.dark = entry._colorState.dark;
}
if (entryOverrides.light || entryOverrides.dark) {
overrides[name] = entryOverrides;
}
}); });
return overrides; return overrides;
} }