-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
101 lines (77 loc) · 3.24 KB
/
app.js
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
const elements = {
wordContainer: document.getElementById('word'),
domWrongLetters: document.getElementById('wrong-letters'),
playAgainBtn: document.getElementById('play-button'),
popup: document.getElementById('popup-container'),
notification: document.getElementById('notification-container'),
finalMessage: document.getElementById('final-message'),
figureParts: document.querySelectorAll('.figure-part'),
};
const state = {
words: [],
selectedWord: '',
correctLetters: [],
wrongLetters: [],
gameDone: false,
timeout: null,
};
const setState = (newState = {}) => ((prevState = state) => Object.assign(prevState, newState))();
const getWords = (async () => {
const words = await fetch('https://api.datamuse.com/words?ml=ringing+in+the+ears')
.then(res => res.json())
.then(data => data.map(({ word }) => word));
setState({ words, selectedWord: words[Math.floor(Math.random() * words.length)] });
displayWord();
})();
const showNotification = () => {
elements.notification.classList.add('show');
state.timeout && clearTimeout(state.timeout);
setState({ timeout: setTimeout(() => elements.notification.classList.remove('show'), 1000) });
};
const renderLetter = letter => {
const markup = `<span class="letter">${ state.correctLetters.includes(letter) ? letter : '' }</span>`;
elements.wordContainer.insertAdjacentHTML('beforeend', markup);
};
const displayWord = () => {
const { selectedWord, correctLetters } = state;
const { wordContainer, finalMessage, popup } = elements;
wordContainer.textContent = '';
selectedWord.split('').forEach(renderLetter);
const areAllLettersPresent = selectedWord.split('').every(letter => correctLetters.includes(letter));
if (areAllLettersPresent) {
setState({ gameDone: true });
finalMessage.textContent = 'Congratulations You Won 👌';
popup.classList.add('show-popup');
}
};
const updateWrongLetters = () => {
const { wrongLetters } = state;
const { domWrongLetters, figureParts, finalMessage, popup } = elements;
domWrongLetters.textContent = '';
domWrongLetters.insertAdjacentHTML(
'afterbegin',
`
${wrongLetters.length ? '<p>Wrong</p>' : ''}
${wrongLetters.map(letter => `<span>${letter}</span>`).join('')}
`,
);
figureParts.forEach((part, partIdx) => partIdx < wrongLetters.length && (part.style.display = 'block'));
if (wrongLetters.length === figureParts.length) {
setState({ gameDone: true });
finalMessage.textContent = 'Unfortunately you lost. 😓';
popup.classList.add('show-popup');
}
};
document.addEventListener('keydown', ({ key: letter, ctrlKey }) => {
const { gameDone, selectedWord, correctLetters, wrongLetters } = state;
if (gameDone || ctrlKey || !/^(\w)$/i.test(letter)) return;
if (selectedWord.includes(letter) && !correctLetters.includes(letter)) {
correctLetters.push(letter);
displayWord();
} else if (wrongLetters.includes(letter) || correctLetters.includes(letter)) showNotification();
else {
wrongLetters.push(letter);
updateWrongLetters();
}
});
elements.playAgainBtn.addEventListener('click', () => location.reload());