-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlessons.js
More file actions
113 lines (98 loc) · 2.84 KB
/
lessons.js
File metadata and controls
113 lines (98 loc) · 2.84 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
112
113
let step = 0;
const parseIntThrow = (s) => {
const i = parseInt(s, 10);
if (Number.isNaN(i)) {
throw new Error(`Cannot parse integer for ${s}`);
}
return i;
};
const setShowHiddenSteps = () => {
const elements = document.querySelectorAll("[data-step]");
for (const element of elements) {
const sectionStep = parseIntThrow(element.dataset.step);
if (sectionStep > step) {
element.classList.add("hidden");
} else {
element.classList.remove("hidden");
}
}
};
const rerender = () => {
setShowHiddenSteps();
const buttonElements = document.querySelectorAll(
"button[data-challenge-submit]"
);
for (const element of buttonElements) {
const elemStep = parseIntThrow(element.dataset.challengeSubmit);
element.disabled = elemStep <= step;
}
};
const setStep = (newStep) => {
if (newStep > step) {
step = newStep;
let lessons;
try {
lessons = JSON.parse(localStorage.getItem("lessons")) ?? {};
} catch {
lessons = {};
}
lessons[window.LESSON] = newStep;
localStorage.setItem("lessons", JSON.stringify(lessons));
rerender();
}
};
const initButtons = () => {
const formElements = document.querySelectorAll("form[data-challenge]");
for (const element of formElements) {
const step = parseIntThrow(element.dataset.challenge);
const error = element.querySelector(".error");
if (!error) {
alert(`The step ${step} is missing an error div!`);
}
element.addEventListener("submit", (e) => {
e.preventDefault(e);
error.innerText = "";
const answer = element.dataset.answer;
if (!answer) {
setStep(step);
return;
}
const input = e.target[0];
const value = input.value;
if (value === answer) {
setStep(step);
return;
}
// Wrong answer :(
const incorrectTries = parseIntThrow(error.dataset.errors ?? "0");
const hint =
element.dataset.hint ??
`The answer is ${answer.length} characters long`;
const messages = [
"This is not the right answer, please try again.",
"This is still not the right answer, please try again.",
`This is still not the right answer, please try again. Hint: ${hint}`,
`The right answer was: '${answer}'. Enter it to finish this step.`,
];
if (incorrectTries >= messages.length) {
input.value = answer;
setStep(step); // just give up and finish lol
return;
}
error.innerText = messages[incorrectTries];
error.dataset.errors = incorrectTries + 1;
});
}
};
const init = () => {
try {
const lessons = JSON.parse(localStorage.getItem("lessons"));
const existingStep = lessons[window.LESSON];
if (typeof existingStep === "number") {
step = existingStep;
}
} catch {}
initButtons();
rerender();
};
init();