Skip to content

Commit 6068a2c

Browse files
committed
refactor: move test active state to a signal
1 parent 1c862b7 commit 6068a2c

20 files changed

Lines changed: 62 additions & 52 deletions

File tree

frontend/__tests__/root/config.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import * as ConfigValidation from "../../src/ts/config/validation";
1515
import { configEvent } from "../../src/ts/events/config";
1616
import * as ApeConfig from "../../src/ts/ape/config";
1717
import * as Notifications from "../../src/ts/states/notifications";
18+
import * as TestState from "../../src/ts/states/test";
19+
1820
const { replaceConfig, getConfig } = __testing;
1921

2022
describe("Config", () => {
@@ -41,6 +43,7 @@ describe("Config", () => {
4143
);
4244
const miscReloadAfterMock = vi.spyOn(Misc, "reloadAfter");
4345
const miscTriggerResizeMock = vi.spyOn(Misc, "triggerResize");
46+
const stateIsTestActiveMock = vi.spyOn(TestState, "isTestActive");
4447

4548
const mocks = [
4649
canSetConfigWithCurrentFunboxesMock,
@@ -56,13 +59,10 @@ describe("Config", () => {
5659
vi.useFakeTimers();
5760
mocks.forEach((it) => it.mockClear());
5861

59-
vi.mock("../../src/ts/test/test-state", () => ({
60-
isActive: true,
61-
}));
62-
6362
isConfigValueValidMock.mockReturnValue(true);
6463
canSetConfigWithCurrentFunboxesMock.mockReturnValue(true);
6564
dbSaveConfigMock.mockResolvedValue();
65+
stateIsTestActiveMock.mockReturnValue(true);
6666

6767
replaceConfig({});
6868
});

frontend/src/ts/config/setters.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import {
99
canSetConfigWithCurrentFunboxes,
1010
canSetFunboxWithConfig,
1111
} from "./funbox-validation";
12-
import * as TestState from "../test/test-state";
1312
import { triggerResize, escapeHTML } from "../utils/misc";
1413
import { camelCaseToWords, capitalizeFirstLetter } from "../utils/strings";
1514
import { Config, setConfigStore } from "./store";
1615
import { FunboxName } from "@monkeytype/schemas/configs";
1716
import { typedKeys } from "@monkeytype/util/objects";
17+
import { isTestActive } from "../states/test";
1818

1919
export function setConfig<T extends keyof ConfigSchemas.Config>(
2020
key: T,
@@ -41,7 +41,7 @@ export function setConfig<T extends keyof ConfigSchemas.Config>(
4141

4242
if (
4343
metadata.changeRequiresRestart &&
44-
TestState.isActive &&
44+
isTestActive() &&
4545
Config.funbox.includes("no_quit")
4646
) {
4747
showNoticeNotification(
@@ -154,7 +154,7 @@ export function setQuoteLengthAll(nosave?: boolean): boolean {
154154
}
155155

156156
export function toggleFunbox(funbox: FunboxName, nosave?: boolean): boolean {
157-
if (TestState.isActive && Config.funbox.includes("no_quit")) {
157+
if (isTestActive() && Config.funbox.includes("no_quit")) {
158158
showNoticeNotification(
159159
"No quit funbox is active. Please finish the test.",
160160
{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
import { debounce } from "throttle-debounce";
33
import { configEvent } from "../events/config";
44
import { Config } from "../config/store";
5-
import * as TestState from "../test/test-state";
65
import * as EG from "./eg-ad-controller";
76
import * as PW from "./pw-ad-controller";
87
import { onDOMReady, qs } from "../utils/dom";
8+
import { isTestActive } from "../states/test";
99
// import { createEffect } from "solid-js";
1010

1111
const breakpoint = 900;
@@ -41,7 +41,7 @@ function init(): void {
4141
}
4242

4343
setInterval(() => {
44-
if (TestState.isActive) {
44+
if (isTestActive()) {
4545
return;
4646
}
4747
if (choice === "eg") {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as TestState from "../test/test-state";
77
import { showNoticeNotification } from "../states/notifications";
88
import { navigationEvent, type NavigateOptions } from "../events/navigation";
99
import { authEvent } from "../events/auth";
10+
import { isTestActive } from "../states/test";
1011

1112
//source: https://www.youtube.com/watch?v=OstALBk-jTc
1213
// https://www.youtube.com/watch?v=OstALBk-jTc
@@ -176,7 +177,7 @@ export async function navigate(
176177
}
177178

178179
const noQuit = isFunboxActive("no_quit");
179-
if (TestState.isActive && noQuit) {
180+
if (isTestActive() && noQuit) {
180181
showNoticeNotification(
181182
"No quit funbox is active. Please finish the test.",
182183
{

frontend/src/ts/input/handlers/before-delete.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import { getInputElementValue } from "../input-element";
55
import * as TestUI from "../../test/test-ui";
66
import { isAwaitingNextWord } from "../state";
77
import { getInputForWord } from "../../test/events/data";
8+
import { isTestActive } from "../../states/test";
89

910
export function onBeforeDelete(event: InputEvent): void {
10-
if (!TestState.isActive) {
11+
if (!isTestActive()) {
1112
event.preventDefault();
1213
return;
1314
}

frontend/src/ts/input/handlers/insert-text.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { shouldGoToNextWord, isCharCorrect } from "../helpers/validation";
3131
import { getCurrentInput, logTestEvent } from "../../test/events/data";
3232
import { getCommitCharacterType, normalizeData } from "../helpers/util";
3333
import { areAllWordsGenerated } from "../../test/words-generator";
34+
import { isTestActive } from "../../states/test";
3435

3536
const charOverrides = new Map<string, string>([
3637
["…", "..."],
@@ -132,7 +133,7 @@ export async function onInsertText(options: OnInsertTextParams): Promise<void> {
132133
const data = normalizedData ?? options.data;
133134

134135
// start if needed
135-
if (!TestState.isActive) {
136+
if (!isTestActive()) {
136137
TestLogic.startTest(now);
137138
}
138139

frontend/src/ts/input/listeners/composition.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { setLastInsertCompositionTextData } from "../state";
66
import * as CompositionDisplay from "../../elements/composition-display";
77
import { onInsertText } from "../handlers/insert-text";
88
import { logTestEvent } from "../../test/events/data";
9+
import { isTestActive } from "../../states/test";
910

1011
const inputEl = getInputElement();
1112

@@ -21,7 +22,7 @@ inputEl.addEventListener("compositionstart", (event) => {
2122
CompositionState.setComposing(true);
2223
CompositionState.setData("");
2324
setLastInsertCompositionTextData("");
24-
if (!TestState.isActive) {
25+
if (!isTestActive()) {
2526
TestLogic.startTest(now);
2627
}
2728

frontend/src/ts/legacy-states/connection.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { debounce } from "throttle-debounce";
22
import { showSuccessNotification } from "../states/notifications";
33
import { connectionEvent } from "../events/connection";
4-
import * as TestState from "../test/test-state";
54
import { onDOMReady } from "../utils/dom";
65
import { addBanner, removeBanner } from "../states/banners";
6+
import { isTestActive } from "../states/test";
77

88
let state = navigator.onLine;
99

@@ -38,7 +38,7 @@ const throttledHandleState = debounce(5000, () => {
3838
noInternetBannerId = undefined;
3939
}
4040
bannerAlreadyClosed = false;
41-
} else if (!TestState.isActive) {
41+
} else if (!isTestActive()) {
4242
showOfflineBanner();
4343
}
4444
});

frontend/src/ts/states/test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ export const [getCurrentQuote, setCurrentQuote] =
5858
export const [getLastSignedOutResult, setLastSignedOutResult] =
5959
createSignal<CompletedEvent | null>(null);
6060

61+
export const [isTestActive, setTestActive] = createSignal(false);
62+
6163
createEffect(() => {
6264
getActivePage(); // depend on active page
6365
setIsLongTest(

frontend/src/ts/test/live-acc.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Config } from "../config/store";
2-
import * as TestState from "../test/test-state";
32
import { configEvent } from "../events/config";
43
import { applyReducedMotion } from "../utils/misc";
54
import { requestDebouncedAnimationFrame } from "../utils/debounced-animation-frame";
65
import { qs } from "../utils/dom";
6+
import { isTestActive } from "../states/test";
77

88
const textEl = qs("#liveStatsTextBottom .liveAcc");
99
const miniEl = qs("#liveStatsMini .acc");
@@ -30,7 +30,7 @@ let state = false;
3030

3131
export function show(): void {
3232
if (Config.liveAccStyle === "off") return;
33-
if (!TestState.isActive) return;
33+
if (!isTestActive()) return;
3434
if (state) return;
3535
requestDebouncedAnimationFrame("live-acc.show", () => {
3636
if (Config.liveAccStyle === "mini") {

0 commit comments

Comments
 (0)