128 lines
3.1 KiB
JavaScript
128 lines
3.1 KiB
JavaScript
const LAUNCH = new Date('2026-04-30T16:00:00+03:00');
|
||
|
||
|
||
function pad2(n) {
|
||
return String(n).padStart(2, '0');
|
||
}
|
||
|
||
|
||
function tickCountdown() {
|
||
const root = document.getElementById('countdown');
|
||
if (!root) {
|
||
return false;
|
||
}
|
||
const doneEl = document.getElementById('countdown-done');
|
||
const diff = LAUNCH.getTime() - Date.now();
|
||
if (diff <= 0) {
|
||
root.querySelectorAll('.countdown__units, .countdown__title').forEach((el) => {
|
||
el.setAttribute('hidden', '');
|
||
});
|
||
if (doneEl) {
|
||
doneEl.removeAttribute('hidden');
|
||
}
|
||
return false;
|
||
}
|
||
const totalSeconds = Math.floor(diff / 1000);
|
||
const days = Math.floor(totalSeconds / 86400);
|
||
const hours = Math.floor((totalSeconds % 86400) / 3600);
|
||
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
||
const seconds = totalSeconds % 60;
|
||
const map = {
|
||
days: days < 100 ? pad2(days) : String(days),
|
||
hours: pad2(hours),
|
||
minutes: pad2(minutes),
|
||
seconds: pad2(seconds),
|
||
};
|
||
Object.keys(map).forEach((key) => {
|
||
const el = root.querySelector(`[data-unit='${key}']`);
|
||
if (el) {
|
||
el.textContent = map[key];
|
||
}
|
||
});
|
||
return true;
|
||
}
|
||
|
||
|
||
function initCabinetSubmit() {
|
||
const form = document.getElementById('cabinet-form');
|
||
const status = document.getElementById('cabinet-status');
|
||
if (!form) {
|
||
return;
|
||
}
|
||
const submitBtn = form.querySelector('.cabinet__submit');
|
||
form.addEventListener('submit', async (e) => {
|
||
e.preventDefault();
|
||
const cfg = window.__SITE_CONFIG__ || {};
|
||
const url = cfg.notifyUrl || 'http://72.56.9.52:8000/notify';
|
||
const fd = new FormData(form);
|
||
const name = String(fd.get('name') || '').trim();
|
||
const email = String(fd.get('email') || '').trim();
|
||
if (status) {
|
||
status.setAttribute('hidden', '');
|
||
status.textContent = '';
|
||
}
|
||
if (submitBtn) {
|
||
submitBtn.disabled = true;
|
||
}
|
||
try {
|
||
const res = await fetch(url, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
body: JSON.stringify({ name, email }),
|
||
});
|
||
if (!res.ok) {
|
||
throw new Error(String(res.status));
|
||
}
|
||
if (status) {
|
||
status.removeAttribute('hidden');
|
||
status.textContent = 'Заявка отправлена';
|
||
}
|
||
form.reset();
|
||
} catch {
|
||
if (status) {
|
||
status.removeAttribute('hidden');
|
||
status.textContent = 'Не удалось отправить заявку';
|
||
}
|
||
} finally {
|
||
if (submitBtn) {
|
||
submitBtn.disabled = false;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
function initNav() {
|
||
const btn = document.querySelector('.burger');
|
||
if (!btn) {
|
||
return;
|
||
}
|
||
btn.addEventListener('click', () => {
|
||
document.body.classList.toggle('nav-open');
|
||
});
|
||
document.querySelectorAll('.nav__link').forEach((link) => {
|
||
link.addEventListener('click', () => {
|
||
document.body.classList.remove('nav-open');
|
||
});
|
||
});
|
||
}
|
||
|
||
|
||
function startCountdown() {
|
||
if (!tickCountdown()) {
|
||
return;
|
||
}
|
||
const countdownTimer = setInterval(() => {
|
||
if (!tickCountdown()) {
|
||
clearInterval(countdownTimer);
|
||
}
|
||
}, 1000);
|
||
}
|
||
|
||
|
||
startCountdown();
|
||
initNav();
|
||
initCabinetSubmit();
|