-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtimer.js
More file actions
111 lines (100 loc) · 4.76 KB
/
timer.js
File metadata and controls
111 lines (100 loc) · 4.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { state as eventState } from './eventHandler.js';
import { saveProgress, countCorrectChars, countCorrectWords } from './utils.js';
export const state = {
startTime: null,
endTime: null,
timerInterval: null
};
const elements = {
typingArea: null,
timerDisplay: null,
wpmDisplay: null,
accuracyDisplay: null,
resultModal: null,
modalWpm: null,
modalAccuracy: null,
modalCorrectWords: null,
modalIncorrectWords: null,
modalTimeTaken: null
};
export function startTimer() {
console.log('startTimer called');
elements.timerDisplay = document.getElementById('timer');
elements.wpmDisplay = document.getElementById('wpm');
elements.accuracyDisplay = document.getElementById('accuracy');
elements.resultModal = document.getElementById('result-modal');
elements.modalWpm = document.getElementById('modal-wpm');
elements.modalAccuracy = document.getElementById('modal-accuracy');
elements.modalCorrectWords = document.getElementById('modal-correct-words');
elements.modalIncorrectWords = document.getElementById('modal-incorrect-words');
elements.modalTimeTaken = document.getElementById('modal-time-taken');
if (!elements.timerDisplay || !elements.wpmDisplay || !elements.accuracyDisplay || !elements.resultModal) {
console.error('Required elements not found for timer:', {
timerDisplay: !!elements.timerDisplay,
wpmDisplay: !!elements.wpmDisplay,
accuracyDisplay: !!elements.accuracyDisplay,
resultModal: !!elements.resultModal
});
return;
}
const timeModeSelect = document.getElementById('time-mode');
let timeLeft = parseInt(timeModeSelect.value, 10);
elements.timerDisplay.textContent = timeLeft;
if (state.timerInterval) clearInterval(state.timerInterval);
state.timerInterval = setInterval(() => {
timeLeft--;
elements.timerDisplay.textContent = timeLeft;
if (timeLeft <= 0 && !eventState.isZenMode) {
console.log('Timer ended, calling endTest');
endTest();
}
}, 1000);
}
export function endTest() {
console.log('endTest called');
if (state.timerInterval) clearInterval(state.timerInterval);
state.endTime = new Date();
const timeTaken = eventState.startTime ? (state.endTime - eventState.startTime) / 1000 : 0;
const typedWords = eventState.typedWords.filter(word => word);
const originalWords = (eventState.currentText || 'The quick brown fox jumps over the lazy dog').split(/\s+/).filter(word => word);
const correctWords = countCorrectWords(typedWords, originalWords);
const wordsTyped = typedWords.length;
const incorrectWords = wordsTyped - correctWords;
const correctChars = countCorrectChars(typedWords, originalWords);
const totalTypedChars = eventState.allTypedText.length || 1; // Avoid division by zero
const accuracy = Math.round((correctChars / totalTypedChars) * 100);
const wpm = timeTaken > 0 ? Math.round(correctWords / (timeTaken / 60)) : 0;
console.log('Test results:', { wpm, accuracy, correctWords, incorrectWords, timeTaken });
if (elements.wpmDisplay) elements.wpmDisplay.textContent = wpm;
if (elements.accuracyDisplay) elements.accuracyDisplay.textContent = `${accuracy}%`;
if (elements.modalWpm) elements.modalWpm.textContent = wpm;
if (elements.modalAccuracy) elements.modalAccuracy.textContent = `${accuracy}%`;
if (elements.modalCorrectWords) elements.modalCorrectWords.textContent = correctWords;
if (elements.modalIncorrectWords) elements.modalIncorrectWords.textContent = incorrectWords;
if (elements.modalTimeTaken) elements.modalTimeTaken.textContent = `${Math.round(timeTaken)}s`;
if (elements.resultModal) {
elements.resultModal.classList.remove('hidden');
console.log('Result modal shown');
} else {
console.error('Result modal element not found');
}
console.log('Checking saveProgress condition:', { wpm, accuracy, typedWordsLength: typedWords.length });
if (typedWords.length > 0) {
console.log('Calling saveProgress with:', { wpm, accuracy });
saveProgress(wpm, accuracy);
displayLeaderboard();
console.log('Progress saved and leaderboard updated');
} else {
console.warn('Not saving progress: No words typed');
}
}
export function resetTimer() {
console.log('resetTimer called');
if (state.timerInterval) clearInterval(state.timerInterval);
state.startTime = null;
state.endTime = null;
state.timerInterval = null;
if (elements.timerDisplay && elements.timeModeSelect) {
elements.timerDisplay.textContent = elements.timeModeSelect.value;
}
}