(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"); } }); })();