const DIFFICULTIES = [
{ id: 'easy', label: '쉬움' },
{ id: 'medium', label: '보통' },
{ id: 'hard', label: '어려움' },
];
const fillSelect = (select, values) => {
select.replaceChildren(
...values.map((value) => {
const option = document.createElement('option');
option.value = value;
option.textContent = value;
return option;
})
);
select.disabled = values.length === 0;
};
class OptionPage extends HTMLElement {
async connectedCallback() {
this.className = 'screen';
this.innerHTML = `
공부의 시작은 나를 아는것
문제를 풀면 AI가 여러분을 메타인지하고 피드백 해줘요.
`;
const errorBox = this.querySelector('#error');
const showMessage = (message) => {
errorBox.className = message ? 'error-box' : '';
errorBox.textContent = message ?? '';
};
if (this.dataset.error) showMessage(this.dataset.error);
this.querySelector('#history').onclick = () => showHistoryScreen();
let difficulty = 'medium';
this.querySelector('#difficulty').appendChild(
createChipGroup(DIFFICULTIES, {
selected: difficulty,
onSelect: (value) => {
difficulty = value;
},
})
);
const school = this.querySelector('#school');
const subject = this.querySelector('#subject');
const chapter = this.querySelector('#chapter');
const student = this.querySelector('#student');
const amount = this.querySelector('#amount');
const startButton = this.querySelector('#start');
let chapters = {};
const onSchoolChange = () => {
fillSelect(subject, Object.keys(chapters[school.value] ?? {}));
onSubjectChange();
};
const onSubjectChange = () => {
fillSelect(chapter, chapters[school.value]?.[subject.value] ?? []);
};
school.onchange = onSchoolChange;
subject.onchange = onSubjectChange;
startButton.disabled = true;
try {
chapters = await api.chapters();
fillSelect(school, Object.keys(chapters));
onSchoolChange();
startButton.disabled = false;
} catch (err) {
showMessage(`단원 목록을 불러오지 못했습니다. ${err.message}`);
return;
}
const submit = () => {
if (!chapter.value) {
showMessage('과목과 단원을 선택해 주세요.');
return;
}
startQuiz(
{
student: student.value.trim() || '학생',
school: school.value,
subject: subject.value,
chapter: chapter.value,
difficulty,
},
Math.min(Math.max(Number(amount.value) || 5, 1), 20)
);
};
startButton.onclick = submit;
student.addEventListener('keydown', (event) => {
if (event.key === 'Enter') submit();
});
}
}
customElements.define('option-page', OptionPage);