Skip to content

Commit 266227d

Browse files
committed
feat: auto-restore word mode settings + fix storage sync on toggle
Add automatic save/restore of word mode flags when toggling to/from sentence case. Technical changes: - Add savedWordModeSettings object to track previous word mode state - Update setShouldCapitaliseOption() to save flags on sentence case enable - Update setShouldCapitaliseOption() to restore flags on sentence case disable - Sync flag changes to browser.storage.sync to keep popup UI in sync - Guard browser.storage calls with typeof check for test compatibility Fixes: - Fix browser.storage sync bug causing incorrect behavior on multiple toggles - Word mode checkboxes now stay in sync when toggling modes - Second toggle to sentence case now correctly prevents word capitalization Tests: - Add 8 comprehensive mode toggle tests in mode-toggle-typing.test.js - Test automatic restoration without manual re-enabling - Test multiple toggle cycles to prevent storage sync regression - All 87 tests pass across 9 test suites
1 parent 90aa126 commit 266227d

File tree

3 files changed

+355
-119
lines changed

3 files changed

+355
-119
lines changed

I_CAPITALIZATION_FIX_V2.md

Lines changed: 0 additions & 119 deletions
This file was deleted.

src/utils.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ export const optionsDictionary = {
4040
[shouldCapitaliseLocations]: false,
4141
[shouldConvertToSentenceCase]: false,
4242
};
43+
44+
// Store previous word mode settings before switching to sentence case
45+
let savedWordModeSettings = {
46+
[shouldCapitaliseI]: false,
47+
[shouldCapitaliseNames]: false,
48+
[shouldCapitaliseAcronyms]: false,
49+
[shouldCapitaliseLocations]: false,
50+
};
51+
4352
const keyValueDictionary = {
4453
[constantsKeyVal]: {},
4554
[namesKeyVal]: {},
@@ -58,6 +67,11 @@ export function __resetAllOptionsAndDictionariesForTests() {
5867
optionsDictionary[shouldCapitaliseAcronyms] = false;
5968
optionsDictionary[shouldCapitaliseLocations] = false;
6069
optionsDictionary[shouldConvertToSentenceCase] = false;
70+
// Reset saved state
71+
savedWordModeSettings[shouldCapitaliseI] = false;
72+
savedWordModeSettings[shouldCapitaliseNames] = false;
73+
savedWordModeSettings[shouldCapitaliseAcronyms] = false;
74+
savedWordModeSettings[shouldCapitaliseLocations] = false;
6175
keyValueDictionary[constantsKeyVal] = {};
6276
keyValueDictionary[namesKeyVal] = {};
6377
keyValueDictionary[acronymsKeyVal] = {};
@@ -225,12 +239,68 @@ export function setShouldCapitaliseOption(optionName, value) {
225239
if (value != null) {
226240
// Enforce strict mutual exclusion here as a single source of truth.
227241
if (optionName === shouldConvertToSentenceCase && value === true) {
242+
// Save current word mode settings before switching to sentence case
243+
savedWordModeSettings[shouldCapitaliseI] =
244+
optionsDictionary[shouldCapitaliseI];
245+
savedWordModeSettings[shouldCapitaliseNames] =
246+
optionsDictionary[shouldCapitaliseNames];
247+
savedWordModeSettings[shouldCapitaliseAcronyms] =
248+
optionsDictionary[shouldCapitaliseAcronyms];
249+
savedWordModeSettings[shouldCapitaliseLocations] =
250+
optionsDictionary[shouldCapitaliseLocations];
251+
228252
optionsDictionary[shouldConvertToSentenceCase] = true;
229253
// Turn off all word-level flags explicitly
230254
optionsDictionary[shouldCapitaliseI] = false;
231255
optionsDictionary[shouldCapitaliseNames] = false;
232256
optionsDictionary[shouldCapitaliseAcronyms] = false;
233257
optionsDictionary[shouldCapitaliseLocations] = false;
258+
259+
// Sync disabled word flags to browser storage so UI stays in sync
260+
if (
261+
typeof browser !== 'undefined' &&
262+
browser.storage &&
263+
browser.storage.sync
264+
) {
265+
browser.storage.sync.set({
266+
[shouldCapitaliseI]: false,
267+
[shouldCapitaliseNames]: false,
268+
[shouldCapitaliseAcronyms]: false,
269+
[shouldCapitaliseLocations]: false,
270+
});
271+
}
272+
} else if (
273+
optionName === shouldConvertToSentenceCase &&
274+
value === false &&
275+
optionsDictionary[shouldConvertToSentenceCase] === true
276+
) {
277+
// Only restore saved word mode settings if we're actually switching FROM sentence case
278+
// (i.e., sentence case was previously true and is now being set to false)
279+
optionsDictionary[shouldConvertToSentenceCase] = false;
280+
optionsDictionary[shouldCapitaliseI] =
281+
savedWordModeSettings[shouldCapitaliseI];
282+
optionsDictionary[shouldCapitaliseNames] =
283+
savedWordModeSettings[shouldCapitaliseNames];
284+
optionsDictionary[shouldCapitaliseAcronyms] =
285+
savedWordModeSettings[shouldCapitaliseAcronyms];
286+
optionsDictionary[shouldCapitaliseLocations] =
287+
savedWordModeSettings[shouldCapitaliseLocations];
288+
289+
// Sync restored word flags to browser storage so UI stays in sync
290+
if (
291+
typeof browser !== 'undefined' &&
292+
browser.storage &&
293+
browser.storage.sync
294+
) {
295+
browser.storage.sync.set({
296+
[shouldCapitaliseI]: savedWordModeSettings[shouldCapitaliseI],
297+
[shouldCapitaliseNames]: savedWordModeSettings[shouldCapitaliseNames],
298+
[shouldCapitaliseAcronyms]:
299+
savedWordModeSettings[shouldCapitaliseAcronyms],
300+
[shouldCapitaliseLocations]:
301+
savedWordModeSettings[shouldCapitaliseLocations],
302+
});
303+
}
234304
} else if (
235305
value === true &&
236306
(optionName === shouldCapitaliseI ||

0 commit comments

Comments
 (0)