Skip to content

Commit a7e6300

Browse files
committed
move
1 parent 29f8924 commit a7e6300

5 files changed

Lines changed: 72 additions & 61 deletions

File tree

frontend/src/ts/pages/test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import * as TestStats from "../test/test-stats";
21
import * as TestLogic from "../test/test-logic";
32
import * as Funbox from "../test/funbox/funbox";
43
import Page from "./page";
@@ -7,6 +6,11 @@ import * as ModesNotice from "../elements/modes-notice";
76
import * as Keymap from "../elements/keymap";
87
import { blurInputElement } from "../input/input-element";
98
import { qsr } from "../utils/dom";
9+
import {
10+
resetIncompleteSeconds,
11+
resetIncompleteTests,
12+
resetRestartCount,
13+
} from "../states/test";
1014

1115
export const page = new Page({
1216
id: "test",
@@ -25,7 +29,9 @@ export const page = new Page({
2529
},
2630
beforeShow: async (): Promise<void> => {
2731
updateFooterAndVerticalAds(false);
28-
TestStats.resetIncomplete();
32+
resetIncompleteTests();
33+
resetIncompleteSeconds();
34+
resetRestartCount();
2935
TestLogic.restart({
3036
noAnim: true,
3137
});

frontend/src/ts/states/test.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { getActivePage } from "./core";
55
import { canQuickRestart } from "../utils/quick-restart";
66
import { getData as getCustomTextData } from "../test/custom-text";
77
import { isCustomTextLong } from "../legacy-states/custom-text-name";
8+
import { CompletedEvent, IncompleteTest } from "@monkeytype/schemas/results";
9+
import { createSignalWithSetters } from "../hooks/createSignalWithSetters";
810

911
export const [wordsHaveNewline, setWordsHaveNewline] = createSignal(false);
1012
export const [wordsHaveTab, setWordsHaveTab] = createSignal(false);
@@ -13,8 +15,33 @@ export const [getLoadedChallenge, setLoadedChallenge] =
1315
createSignal<Challenge | null>(null);
1416
export const [getResultVisible, setResultVisible] = createSignal(false);
1517
export const [getFocus, setFocus] = createSignal(false);
16-
18+
export const [isTestInvalid, setIsTestInvalid] = createSignal(false);
1719
export const [isLongTest, setIsLongTest] = createSignal(false);
20+
export const [getLastResult, setLastResult] = createSignal<Omit<
21+
CompletedEvent,
22+
"hash" | "uid"
23+
> | null>(null);
24+
export const [
25+
getRestartCount,
26+
{ increment: incrementRestartCount, reset: resetRestartCount },
27+
] = createSignalWithSetters(0)({
28+
increment: (set) => set((n) => n + 1),
29+
reset: (set) => set(0),
30+
});
31+
export const [
32+
getIncompleteSeconds,
33+
{ increment: incrementIncompleteSeconds, reset: resetIncompleteSeconds },
34+
] = createSignalWithSetters(0)({
35+
increment: (set, val: number) => set((n) => n + val),
36+
reset: (set) => set(0),
37+
});
38+
export const [
39+
getIncompleteTests,
40+
{ push: pushIncompleteTest, reset: resetIncompleteTests },
41+
] = createSignalWithSetters<IncompleteTest[]>([])({
42+
push: (set, val: IncompleteTest) => set((arr) => [...arr, val]),
43+
reset: (set) => set([]),
44+
});
1845

1946
createEffect(() => {
2047
getActivePage(); // depend on active page

frontend/src/ts/test/result.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ import * as ConnectionState from "../legacy-states/connection";
6161
import { currentQuote } from "./test-words";
6262
import { qs, qsa } from "../utils/dom";
6363
import { getTheme } from "../states/theme";
64+
import { isTestInvalid } from "../states/test";
6465

6566
let result: CompletedEvent;
6667
let minChartVal: number;
@@ -833,7 +834,7 @@ function updateOther(
833834
if (afkDetected) {
834835
otherText += "<br>afk detected";
835836
}
836-
if (TestStats.invalid) {
837+
if (isTestInvalid()) {
837838
otherText += "<br>invalid";
838839
const extra: string[] = [];
839840
if (

frontend/src/ts/test/test-logic.ts

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ import { clearQuoteStats } from "../states/quote-rate";
2929
import * as Result from "./result";
3030
import { getActivePage, isAuthenticated } from "../states/core";
3131
import {
32+
getIncompleteSeconds,
33+
getIncompleteTests,
34+
getRestartCount,
35+
incrementIncompleteSeconds,
36+
incrementRestartCount,
37+
pushIncompleteTest,
38+
resetIncompleteSeconds,
39+
resetIncompleteTests,
40+
resetRestartCount,
41+
setIsTestInvalid,
42+
setLastResult,
3243
setResultVisible,
3344
setWordsHaveNewline,
3445
setWordsHaveTab,
@@ -253,10 +264,10 @@ export function restart(options = {} as RestartOptions): void {
253264
const afkseconds = TestStats.calculateAfkSeconds(testSeconds);
254265
let tt = Numbers.roundTo2(testSeconds - afkseconds);
255266
if (tt < 0) tt = 0;
256-
TestStats.incrementIncompleteSeconds(tt);
257-
TestStats.incrementRestartCount();
267+
incrementIncompleteSeconds(tt);
268+
incrementRestartCount();
258269
const acc = Numbers.roundTo2(TestStats.calculateAccuracy());
259-
TestStats.pushIncompleteTest(acc, tt);
270+
pushIncompleteTest({ acc, seconds: tt });
260271
}
261272
}
262273

@@ -297,6 +308,7 @@ export function restart(options = {} as RestartOptions): void {
297308
}
298309

299310
TestTimer.clear();
311+
setIsTestInvalid(false);
300312
TestStats.restart();
301313
TestInput.restart();
302314
TestInput.corrected.reset();
@@ -846,12 +858,10 @@ function buildCompletedEvent(
846858
lazyMode: Config.lazyMode,
847859
timestamp: Date.now(),
848860
language: language,
849-
restartCount: TestStats.restartCount,
850-
incompleteTests: TestStats.incompleteTests,
861+
restartCount: getRestartCount(),
862+
incompleteTests: getIncompleteTests(),
851863
incompleteTestSeconds:
852-
TestStats.incompleteSeconds < 0
853-
? 0
854-
: Numbers.roundTo2(TestStats.incompleteSeconds),
864+
getIncompleteSeconds() < 0 ? 0 : Numbers.roundTo2(getIncompleteSeconds()),
855865
difficulty: Config.difficulty,
856866
blindMode: Config.blindMode,
857867
tags: activeTagsIds,
@@ -1013,7 +1023,7 @@ export async function finish(difficultyFailed = false): Promise<void> {
10131023

10141024
const completedEvent = structuredClone(ce) as CompletedEvent;
10151025

1016-
TestStats.setLastResult(structuredClone(completedEvent));
1026+
setLastResult(structuredClone(completedEvent));
10171027

10181028
///////// completed event ready
10191029

@@ -1036,7 +1046,7 @@ export async function finish(difficultyFailed = false): Promise<void> {
10361046
) {
10371047
showNoticeNotification("Test invalid - inconsistent test duration");
10381048
console.error("Test duration inconsistent", ce.testDuration, dateDur);
1039-
TestStats.setInvalid();
1049+
setIsTestInvalid(true);
10401050
dontSave = true;
10411051
} else if (difficultyFailed) {
10421052
showNoticeNotification(`Test failed - ${failReason}`, {
@@ -1063,16 +1073,16 @@ export async function finish(difficultyFailed = false): Promise<void> {
10631073
(Config.mode === "zen" && completedEvent.testDuration < 15)
10641074
) {
10651075
showNoticeNotification("Test invalid - too short");
1066-
TestStats.setInvalid();
1076+
setIsTestInvalid(true);
10671077
tooShort = true;
10681078
dontSave = true;
10691079
} else if (afkDetected) {
10701080
showNoticeNotification("Test invalid - AFK detected");
1071-
TestStats.setInvalid();
1081+
setIsTestInvalid(true);
10721082
dontSave = true;
10731083
} else if (TestState.isRepeated) {
10741084
showNoticeNotification("Test invalid - repeated");
1075-
TestStats.setInvalid();
1085+
setIsTestInvalid(true);
10761086
dontSave = true;
10771087
} else if (
10781088
completedEvent.wpm < 0 ||
@@ -1084,7 +1094,7 @@ export async function finish(difficultyFailed = false): Promise<void> {
10841094
completedEvent.mode2 === "10")
10851095
) {
10861096
showNoticeNotification("Test invalid - wpm");
1087-
TestStats.setInvalid();
1097+
setIsTestInvalid(true);
10881098
dontSave = true;
10891099
} else if (
10901100
completedEvent.rawWpm < 0 ||
@@ -1096,7 +1106,7 @@ export async function finish(difficultyFailed = false): Promise<void> {
10961106
completedEvent.mode2 === "10")
10971107
) {
10981108
showNoticeNotification("Test invalid - raw");
1099-
TestStats.setInvalid();
1109+
setIsTestInvalid(true);
11001110
dontSave = true;
11011111
} else if (
11021112
(!DB.getSnapshot()?.lbOptOut &&
@@ -1105,7 +1115,7 @@ export async function finish(difficultyFailed = false): Promise<void> {
11051115
(completedEvent.acc < 50 || completedEvent.acc > 100))
11061116
) {
11071117
showNoticeNotification("Test invalid - accuracy");
1108-
TestStats.setInvalid();
1118+
setIsTestInvalid(true);
11091119
dontSave = true;
11101120
}
11111121

@@ -1118,9 +1128,9 @@ export async function finish(difficultyFailed = false): Promise<void> {
11181128
let tt = Numbers.roundTo2(testSeconds - afkseconds);
11191129
if (tt < 0) tt = 0;
11201130
const acc = completedEvent.acc;
1121-
TestStats.incrementIncompleteSeconds(tt);
1122-
TestStats.incrementRestartCount();
1123-
TestStats.pushIncompleteTest(acc, tt);
1131+
incrementIncompleteSeconds(tt);
1132+
incrementRestartCount();
1133+
pushIncompleteTest({ acc, seconds: tt });
11241134
}
11251135
}
11261136

@@ -1180,7 +1190,9 @@ export async function finish(difficultyFailed = false): Promise<void> {
11801190
if (dontSave) {
11811191
void AnalyticsController.log("testCompletedInvalid");
11821192
} else {
1183-
TestStats.resetIncomplete();
1193+
resetIncompleteTests();
1194+
resetRestartCount();
1195+
resetIncompleteSeconds();
11841196

11851197
if (!completedEvent.bailedOut) {
11861198
const challenge = ChallengeContoller.verify(completedEvent);

frontend/src/ts/test/test-stats.ts

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import * as TestInput from "./test-input";
55
import * as TestWords from "./test-words";
66
import * as TestState from "./test-state";
77
import * as Numbers from "@monkeytype/util/numbers";
8-
import { CompletedEvent, IncompleteTest } from "@monkeytype/schemas/results";
98
import { isFunboxActiveWithProperty } from "./funbox/list";
109
import * as CustomText from "./custom-text";
10+
import { getLastResult } from "../states/test";
1111

1212
type CharCount = {
1313
spaces: number;
@@ -33,21 +33,14 @@ export type Stats = {
3333
correctSpaces: number;
3434
};
3535

36-
export let invalid = false;
3736
export let start: number, end: number;
3837
export let start2: number, end2: number;
3938
export let start3: number, end3: number;
4039
export let lastSecondNotRound = false;
4140

42-
export let lastResult: Omit<CompletedEvent, "hash" | "uid">;
43-
44-
export function setLastResult(result: CompletedEvent): void {
45-
lastResult = result;
46-
}
47-
4841
export function getStats(): unknown {
4942
const ret = {
50-
lastResult,
43+
lastResult: getLastResult(),
5144
start,
5245
end,
5346
start3,
@@ -106,37 +99,9 @@ export function getStats(): unknown {
10699
export function restart(): void {
107100
start = 0;
108101
end = 0;
109-
invalid = false;
110102
lastSecondNotRound = false;
111103
}
112104

113-
export let restartCount = 0;
114-
export let incompleteSeconds = 0;
115-
116-
export let incompleteTests: IncompleteTest[] = [];
117-
118-
export function incrementRestartCount(): void {
119-
restartCount++;
120-
}
121-
122-
export function incrementIncompleteSeconds(val: number): void {
123-
incompleteSeconds += val;
124-
}
125-
126-
export function pushIncompleteTest(acc: number, seconds: number): void {
127-
incompleteTests.push({ acc, seconds });
128-
}
129-
130-
export function resetIncomplete(): void {
131-
restartCount = 0;
132-
incompleteSeconds = 0;
133-
incompleteTests = [];
134-
}
135-
136-
export function setInvalid(): void {
137-
invalid = true;
138-
}
139-
140105
export function calculateTestSeconds(now?: number): number {
141106
let duration = (end - start) / 1000;
142107

0 commit comments

Comments
 (0)