Skip to content

Commit e0b5c46

Browse files
authored
refactor: add options object to setConfig (@Miodec) (monkeytypegame#7228)
1 parent 2b380bb commit e0b5c46

File tree

17 files changed

+253
-97
lines changed

17 files changed

+253
-97
lines changed

frontend/__tests__/root/config.spec.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,9 @@ describe("Config", () => {
212212
replaceConfig({ numbers: false });
213213

214214
//WHEN
215-
Config.setConfig("numbers", true, true);
215+
Config.setConfig("numbers", true, {
216+
nosave: true,
217+
});
216218

217219
//THEN
218220
//wait for debounce
@@ -227,7 +229,9 @@ describe("Config", () => {
227229
replaceConfig({ numbers: false });
228230

229231
//WHEN
230-
Config.setConfig("numbers", true, true);
232+
Config.setConfig("numbers", true, {
233+
nosave: true,
234+
});
231235

232236
//THEN
233237

@@ -241,21 +245,21 @@ describe("Config", () => {
241245

242246
it("triggers resize if property is set", () => {
243247
///WHEN
244-
Config.setConfig("maxLineWidth", 50, false);
248+
Config.setConfig("maxLineWidth", 50);
245249

246250
expect(miscTriggerResizeMock).toHaveBeenCalled();
247251
});
248252

249253
it("does not triggers resize if property is not set", () => {
250254
///WHEN
251-
Config.setConfig("startGraphsAtZero", true, false);
255+
Config.setConfig("startGraphsAtZero", true);
252256

253257
expect(miscTriggerResizeMock).not.toHaveBeenCalled();
254258
});
255259

256260
it("does not triggers resize if property on nosave", () => {
257261
///WHEN
258-
Config.setConfig("maxLineWidth", 50, true);
262+
Config.setConfig("maxLineWidth", 50, { nosave: true });
259263

260264
expect(miscTriggerResizeMock).not.toHaveBeenCalled();
261265
});

frontend/__tests__/utils/url-handler.spec.ts

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,12 @@ describe("url-handler", () => {
5656
loadTestSettingsFromUrl("");
5757

5858
//THEN
59-
expect(setConfigMock).toHaveBeenCalledWith("mode", "time", true);
60-
expect(setConfigMock).toHaveBeenCalledWith("time", 60, true);
59+
expect(setConfigMock).toHaveBeenCalledWith("mode", "time", {
60+
nosave: true,
61+
});
62+
expect(setConfigMock).toHaveBeenCalledWith("time", 60, {
63+
nosave: true,
64+
});
6165
expect(restartTestMock).toHaveBeenCalled();
6266
});
6367
it("sets time", () => {
@@ -70,8 +74,12 @@ describe("url-handler", () => {
7074
loadTestSettingsFromUrl("");
7175

7276
//THEN
73-
expect(setConfigMock).toHaveBeenCalledWith("mode", "time", true);
74-
expect(setConfigMock).toHaveBeenCalledWith("time", 30, true);
77+
expect(setConfigMock).toHaveBeenCalledWith("mode", "time", {
78+
nosave: true,
79+
});
80+
expect(setConfigMock).toHaveBeenCalledWith("time", 30, {
81+
nosave: true,
82+
});
7583
expect(restartTestMock).toHaveBeenCalled();
7684
});
7785
it("sets word count", () => {
@@ -84,8 +92,12 @@ describe("url-handler", () => {
8492
loadTestSettingsFromUrl("");
8593

8694
//THEN
87-
expect(setConfigMock).toHaveBeenCalledWith("mode", "words", true);
88-
expect(setConfigMock).toHaveBeenCalledWith("words", 50, true);
95+
expect(setConfigMock).toHaveBeenCalledWith("mode", "words", {
96+
nosave: true,
97+
});
98+
expect(setConfigMock).toHaveBeenCalledWith("words", 50, {
99+
nosave: true,
100+
});
89101
expect(restartTestMock).toHaveBeenCalled();
90102
});
91103
it("sets quote length", () => {
@@ -98,8 +110,10 @@ describe("url-handler", () => {
98110
loadTestSettingsFromUrl("");
99111

100112
//THEN
101-
expect(setConfigMock).toHaveBeenCalledWith("mode", "quote", true);
102-
expect(setConfigMock).toHaveBeenCalledWith("quoteLength", [-2], false);
113+
expect(setConfigMock).toHaveBeenCalledWith("mode", "quote", {
114+
nosave: true,
115+
});
116+
expect(setConfigMock).toHaveBeenCalledWith("quoteLength", [-2]);
103117
expect(setSelectedQuoteIdMock).toHaveBeenCalledWith(512);
104118
expect(restartTestMock).toHaveBeenCalled();
105119
});
@@ -111,7 +125,9 @@ describe("url-handler", () => {
111125
loadTestSettingsFromUrl("");
112126

113127
//THEN
114-
expect(setConfigMock).toHaveBeenCalledWith("punctuation", true, true);
128+
expect(setConfigMock).toHaveBeenCalledWith("punctuation", true, {
129+
nosave: true,
130+
});
115131
expect(restartTestMock).toHaveBeenCalled();
116132
});
117133
it("sets numbers", () => {
@@ -122,7 +138,9 @@ describe("url-handler", () => {
122138
loadTestSettingsFromUrl("");
123139

124140
//THEN
125-
expect(setConfigMock).toHaveBeenCalledWith("numbers", false, true);
141+
expect(setConfigMock).toHaveBeenCalledWith("numbers", false, {
142+
nosave: true,
143+
});
126144
expect(restartTestMock).toHaveBeenCalled();
127145
});
128146
it("sets language", () => {
@@ -133,7 +151,9 @@ describe("url-handler", () => {
133151
loadTestSettingsFromUrl("");
134152

135153
//THEN
136-
expect(setConfigMock).toHaveBeenCalledWith("language", "english", true);
154+
expect(setConfigMock).toHaveBeenCalledWith("language", "english", {
155+
nosave: true,
156+
});
137157
expect(restartTestMock).toHaveBeenCalled();
138158
});
139159
it("sets difficulty", () => {
@@ -144,7 +164,9 @@ describe("url-handler", () => {
144164
loadTestSettingsFromUrl("");
145165

146166
//THEN
147-
expect(setConfigMock).toHaveBeenCalledWith("difficulty", "master", true);
167+
expect(setConfigMock).toHaveBeenCalledWith("difficulty", "master", {
168+
nosave: true,
169+
});
148170
expect(restartTestMock).toHaveBeenCalled();
149171
});
150172
it("sets funbox", () => {
@@ -160,7 +182,9 @@ describe("url-handler", () => {
160182
expect(setConfigMock).toHaveBeenCalledWith(
161183
"funbox",
162184
["crt", "choo_choo"],
163-
true,
185+
{
186+
nosave: true,
187+
},
164188
);
165189
expect(restartTestMock).toHaveBeenCalled();
166190
});
@@ -177,7 +201,9 @@ describe("url-handler", () => {
177201
expect(setConfigMock).toHaveBeenCalledWith(
178202
"funbox",
179203
["crt", "choo_choo"],
180-
true,
204+
{
205+
nosave: true,
206+
},
181207
);
182208
expect(restartTestMock).toHaveBeenCalled();
183209
});

frontend/src/ts/config.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ function isConfigChangeBlocked(): boolean {
9191
export function setConfig<T extends keyof Config>(
9292
key: T,
9393
value: Config[T],
94-
nosave: boolean = false,
94+
options?: {
95+
nosave?: boolean;
96+
},
9597
): boolean {
9698
const metadata = configMetadata[key] as ConfigMetadataObject[T];
9799
if (metadata === undefined) {
@@ -168,7 +170,7 @@ export function setConfig<T extends keyof Config>(
168170
continue; // no need to set if the value is already the same
169171
}
170172

171-
const set = setConfig(targetKey, targetValue, nosave);
173+
const set = setConfig(targetKey, targetValue, options);
172174
if (!set) {
173175
throw new Error(
174176
`Failed to set config key "${targetKey}" with value "${targetValue}" for ${metadata.displayString} config override.`,
@@ -178,22 +180,24 @@ export function setConfig<T extends keyof Config>(
178180
}
179181

180182
config[key] = value;
181-
if (!nosave) saveToLocalStorage(key, nosave);
183+
if (!options?.nosave) saveToLocalStorage(key, options?.nosave);
182184

183185
// @ts-expect-error i can't figure this out
184186
ConfigEvent.dispatch({
185187
key: key,
186188
newValue: value,
187-
nosave,
189+
nosave: options?.nosave ?? false,
188190
previousValue: previousValue as Config[T],
189191
});
190192

191-
if (metadata.triggerResize && !nosave) {
193+
if (metadata.triggerResize && !options?.nosave) {
192194
triggerResize();
193195
}
194196

195-
metadata.afterSet?.({ nosave: nosave || false, currentConfig: config });
196-
197+
metadata.afterSet?.({
198+
nosave: options?.nosave ?? false,
199+
currentConfig: config,
200+
});
197201
return true;
198202
}
199203

@@ -232,7 +236,9 @@ export function toggleFunbox(funbox: FunboxName, nosave?: boolean): boolean {
232236
}
233237

234238
export function setQuoteLengthAll(nosave?: boolean): boolean {
235-
return setConfig("quoteLength", [0, 1, 2, 3], nosave);
239+
return setConfig("quoteLength", [0, 1, 2, 3], {
240+
nosave,
241+
});
236242
}
237243

238244
const lastConfigsToApply: Set<keyof Config> = new Set([
@@ -275,7 +281,7 @@ export async function applyConfig(
275281
for (const configKey of [...firstKeys, ...lastConfigsToApply]) {
276282
const configValue = fullConfig[configKey];
277283

278-
const set = setConfig(configKey, configValue, true);
284+
const set = setConfig(configKey, configValue, { nosave: true });
279285

280286
if (!set) {
281287
configKeysToReset.push(configKey);

frontend/src/ts/controllers/challenge-controller.ts

Lines changed: 90 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -241,26 +241,48 @@ export async function setup(challengeName: string): Promise<boolean> {
241241
return false;
242242
}
243243
if (challenge.type === "customTime") {
244-
setConfig("time", challenge.parameters[0] as number, true);
245-
setConfig("mode", "time", true);
246-
setConfig("difficulty", "normal", true);
244+
setConfig("time", challenge.parameters[0] as number, {
245+
nosave: true,
246+
});
247+
setConfig("mode", "time", {
248+
nosave: true,
249+
});
250+
setConfig("difficulty", "normal", {
251+
nosave: true,
252+
});
247253
if (challenge.name === "englishMaster") {
248-
setConfig("language", "english_10k", true);
249-
setConfig("numbers", true, true);
250-
setConfig("punctuation", true, true);
254+
setConfig("language", "english_10k", {
255+
nosave: true,
256+
});
257+
setConfig("numbers", true, {
258+
nosave: true,
259+
});
260+
setConfig("punctuation", true, {
261+
nosave: true,
262+
});
251263
}
252264
} else if (challenge.type === "customWords") {
253-
setConfig("words", challenge.parameters[0] as number, true);
254-
setConfig("mode", "words", true);
255-
setConfig("difficulty", "normal", true);
265+
setConfig("words", challenge.parameters[0] as number, {
266+
nosave: true,
267+
});
268+
setConfig("mode", "words", {
269+
nosave: true,
270+
});
271+
setConfig("difficulty", "normal", {
272+
nosave: true,
273+
});
256274
} else if (challenge.type === "customText") {
257275
CustomText.setText((challenge.parameters[0] as string).split(" "));
258276
CustomText.setMode(challenge.parameters[1] as CustomTextMode);
259277
CustomText.setLimitValue(challenge.parameters[2] as number);
260278
CustomText.setLimitMode(challenge.parameters[3] as CustomTextLimitMode);
261279
CustomText.setPipeDelimiter(challenge.parameters[4] as boolean);
262-
setConfig("mode", "custom", true);
263-
setConfig("difficulty", "normal", true);
280+
setConfig("mode", "custom", {
281+
nosave: true,
282+
});
283+
setConfig("difficulty", "normal", {
284+
nosave: true,
285+
});
264286
} else if (challenge.type === "script") {
265287
Loader.show();
266288
const response = await fetch(
@@ -278,41 +300,79 @@ export async function setup(challengeName: string): Promise<boolean> {
278300
CustomText.setMode("repeat");
279301
CustomText.setLimitMode("word");
280302
CustomText.setPipeDelimiter(false);
281-
setConfig("mode", "custom", true);
282-
setConfig("difficulty", "normal", true);
303+
setConfig("mode", "custom", {
304+
nosave: true,
305+
});
306+
setConfig("difficulty", "normal", {
307+
nosave: true,
308+
});
283309
if (challenge.parameters[1] !== null) {
284310
setConfig("theme", challenge.parameters[1] as ThemeName);
285311
}
286312
if (challenge.parameters[2] !== null) {
287313
void Funbox.activate(challenge.parameters[2] as FunboxName[]);
288314
}
289315
} else if (challenge.type === "accuracy") {
290-
setConfig("time", 0, true);
291-
setConfig("mode", "time", true);
292-
setConfig("difficulty", "master", true);
316+
setConfig("time", 0, {
317+
nosave: true,
318+
});
319+
setConfig("mode", "time", {
320+
nosave: true,
321+
});
322+
setConfig("difficulty", "master", {
323+
nosave: true,
324+
});
293325
} else if (challenge.type === "funbox") {
294-
setConfig("funbox", challenge.parameters[0] as FunboxName[], true);
295-
setConfig("difficulty", "normal", true);
326+
setConfig("funbox", challenge.parameters[0] as FunboxName[], {
327+
nosave: true,
328+
});
329+
setConfig("difficulty", "normal", {
330+
nosave: true,
331+
});
296332
if (challenge.parameters[1] === "words") {
297-
setConfig("words", challenge.parameters[2] as number, true);
333+
setConfig("words", challenge.parameters[2] as number, {
334+
nosave: true,
335+
});
298336
} else if (challenge.parameters[1] === "time") {
299-
setConfig("time", challenge.parameters[2] as number, true);
337+
setConfig("time", challenge.parameters[2] as number, {
338+
nosave: true,
339+
});
300340
}
301-
setConfig("mode", challenge.parameters[1] as Mode, true);
341+
setConfig("mode", challenge.parameters[1] as Mode, {
342+
nosave: true,
343+
});
302344
if (challenge.parameters[3] !== undefined) {
303-
setConfig("difficulty", challenge.parameters[3] as Difficulty, true);
345+
setConfig("difficulty", challenge.parameters[3] as Difficulty, {
346+
nosave: true,
347+
});
304348
}
305349
} else if (challenge.type === "special") {
306350
if (challenge.name === "semimak") {
307351
// so can you make a link that sets up 120s, 10k, punct, stop on word, and semimak as the layout?
308-
setConfig("mode", "time", true);
309-
setConfig("time", 120, true);
310-
setConfig("language", "english_10k", true);
311-
setConfig("punctuation", true, true);
312-
setConfig("stopOnError", "word", true);
313-
setConfig("layout", "semimak", true);
314-
setConfig("keymapLayout", "overrideSync", true);
315-
setConfig("keymapMode", "static", true);
352+
setConfig("mode", "time", {
353+
nosave: true,
354+
});
355+
setConfig("time", 120, {
356+
nosave: true,
357+
});
358+
setConfig("language", "english_10k", {
359+
nosave: true,
360+
});
361+
setConfig("punctuation", true, {
362+
nosave: true,
363+
});
364+
setConfig("stopOnError", "word", {
365+
nosave: true,
366+
});
367+
setConfig("layout", "semimak", {
368+
nosave: true,
369+
});
370+
setConfig("keymapLayout", "overrideSync", {
371+
nosave: true,
372+
});
373+
setConfig("keymapMode", "static", {
374+
nosave: true,
375+
});
316376
}
317377
}
318378
ManualRestart.set();

0 commit comments

Comments
 (0)