(function () {
const form = document.getElementById("enrollForm");
const emailInput = document.getElementById("email");
const button = document.getElementById("submitButton");
const buttonLabel = document.getElementById("buttonLabel");
const buttonIcon = document.getElementById("buttonIcon");
const statusBox = document.getElementById("statusBox");
const statusTitle = document.getElementById("statusTitle");
const statusBody = document.getElementById("statusBody");
const statusPill = document.getElementById("statusPill");
const statusIcon = document.getElementById("statusIcon");
const progress = document.getElementById("progress");
const card = document.getElementById("card");
let isLoading = false;
function validateEmail(value) {
const trimmed = value.trim();
if (!trimmed) return false;
// простая, но нормальная проверка
const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return re.test(trimmed);
}
function setLoading(state) {
isLoading = state;
if (state) {
button.classList.add("button--disabled");
button.disabled = true;
buttonLabel.textContent = "Проверяем…";
buttonIcon.innerHTML = "";
const spinner = document.createElement("div");
spinner.className = "button-spinner";
buttonIcon.appendChild(spinner);
progress.classList.add("visible");
card.classList.add("card--active");
} else {
button.classList.remove("button--disabled");
button.disabled = false;
buttonLabel.textContent = "Проверить";
buttonIcon.innerHTML = "⇀";
progress.classList.remove("visible");
card.classList.remove("card--active");
}
}
function clearStatus() {
statusBox.className = "status";
statusBox.classList.remove("visible");
}
function showStatus(type, title, body) {
statusBox.className = "status visible status--" + type;
statusTitle.textContent = title;
statusBody.innerHTML = body;
switch (type) {
case "error":
statusPill.textContent = "ошибка";
statusIcon.textContent = "!";
break;
case "warning":
statusPill.textContent = "проблема";
statusIcon.textContent = "⚠";
break;
case "success":
statusPill.textContent = "зачислен";
statusIcon.textContent = "✓";
break;
}
}
async function submitEmail(email) {
try {
const response = await fetch("/api/email", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ email }),
});
const data = await response.json();
if (response.ok && data.status === "success") {
return { kind: "success", data };
} else if (data.status === "failure") {
return { kind: "not-on-course", data };
} else {
return { kind: "tech-error", data };
}
} catch (error) {
console.error("Network error:", error);
return {
kind: "tech-error",
data: { message: "Сетевая ошибка. Проверьте подключение к интернету." },
};
}
}
form.addEventListener("submit", async function (event) {
console.log("Form submit event triggered", event);
event.preventDefault();
if (isLoading) return;
const email = emailInput.value;
const isValid = validateEmail(email);
if (!isValid) {
emailInput.classList.add("invalid");
emailInput.focus();
clearStatus();
showStatus(
"error",
"Это точно e-mail?",
"Пожалуйста, введите корректный адрес электронной почты. Мы не умеем искать людей по «я_забыл_что_там».",
);
return;
} else {
emailInput.classList.remove("invalid");
}
clearStatus();
setLoading(true);
try {
const result = await submitEmail(email);
setLoading(false);
if (result.kind === "not-on-course") {
showStatus(
"error",
"Ошибка! Вы не были на курсе «Зимняя школа TypeScript-2022».",
`(свяжитесь с @xanf_ua если уверены что это ошибка`,
);
} else if (result.kind === "tech-error") {
showStatus(
"warning",
"Ошибка зачисления на курс.",
`Технические детали: ${result.data.message}.
Вы можете связаться с @xanf_ua если уверены что это ошибка)`,
);
} else {
showStatus(
"success",
"Вы успешно зачислены на курс!",
`Проверьте почту (включая папку СПАМ) через несколько минут.
Если письма нет — вы можете связаться с @xanf_ua`,
);
}
} catch (error) {
setLoading(false);
showStatus(
"warning",
"Произошла ошибка",
"Что-то пошло не так. Попробуйте ещё раз через несколько секунд.",
);
}
});
emailInput.addEventListener("input", function () {
if (
emailInput.classList.contains("invalid") &&
validateEmail(emailInput.value)
) {
emailInput.classList.remove("invalid");
}
});
})();