const API = location.origin; const form = document.getElementById('form'); const preview = document.getElementById('preview'); const placeholderSrc = preview.src; const removePhotoBtn = document.getElementById('removePhotoBtn'); const groupInput = document.getElementById('groupInput'); const toast = document.getElementById('toast'); const camVideo = document.getElementById('camVideo'); const camCanvas = document.getElementById('camCanvas'); const camModal = document.getElementById('camModal'); let capturedBlob = null; let stream = null; const descInput = document.getElementById('descInput'); const filesInput = document.getElementById('filesInput'); const filesList = document.getElementById('filesList'); const filesClearBtn = document.getElementById('filesClearBtn'); let selectedFiles = []; const sentPanel = document.getElementById('sentPanel'); const sentTitle = document.getElementById('sentTitle'); const sentText = document.getElementById('sentText'); const sentTimer = document.getElementById('sentTimer'); const SENT_KEY = 'whatido_entry_sent_at'; let entryCooldownMin = 30; let sentTimerId = null; function unlockForm() { clearInterval(sentTimerId); sentTimerId = null; localStorage.removeItem(SENT_KEY); sentPanel.style.display = 'none'; form.style.display = 'grid'; toast.textContent = 'Можно отправить новую запись'; toast.classList.add('show'); setTimeout(() => toast.classList.remove('show'), 2500); } function tickSentTimer(unlockTime) { const remain = Math.max(0, unlockTime - Date.now()); if (remain <= 0) { sentTimer.textContent = ''; unlockForm(); return; } const m = Math.floor(remain / 60000); const s = Math.floor((remain % 60000) / 1000); sentTimer.textContent = 'Новую запись можно отправить через ' + m + ' мин ' + s + ' сек'; } function showSent(title, text, unlockTime) { form.style.display = 'none'; sentPanel.style.display = 'flex'; sentTitle.textContent = title; sentText.textContent = text; tickSentTimer(unlockTime); clearInterval(sentTimerId); sentTimerId = setInterval(() => tickSentTimer(unlockTime), 1000); } function cooldownMs() { return entryCooldownMin * 60 * 1000; } function checkPreviousSend() { const raw = localStorage.getItem(SENT_KEY); if (!raw) return; const sentAt = parseInt(raw, 10); if (!Number.isFinite(sentAt)) { localStorage.removeItem(SENT_KEY); return; } const unlockTime = sentAt + cooldownMs(); if (Date.now() < unlockTime) { showSent('Запись уже отправлена', 'Ты уже отправил(а) запись сегодня. Дождись окончания отсчёта, чтобы отправить новую.', unlockTime); } else { localStorage.removeItem(SENT_KEY); } } function humanSize(b) { if (b < 1024) return b + ' Б'; if (b < 1048576) return (b / 1024).toFixed(1) + ' КБ'; return (b / 1048576).toFixed(1) + ' МБ'; } function renderFiles() { filesList.innerHTML = ''; selectedFiles.forEach((f, i) => { const row = document.createElement('div'); row.className = 'file-row'; const name = document.createElement('span'); name.className = 'f-name'; name.textContent = f.name; name.title = f.name; const size = document.createElement('span'); size.className = 'f-size'; size.textContent = humanSize(f.size); const del = document.createElement('button'); del.type = 'button'; del.textContent = '✕'; del.addEventListener('click', () => removeFile(i)); row.append(name, size, del); filesList.appendChild(row); }); filesClearBtn.classList.toggle('show', selectedFiles.length > 0); } function removeFile(i) { selectedFiles.splice(i, 1); renderFiles(); } function clearFiles() { selectedFiles = []; filesInput.value = ''; renderFiles(); } filesInput.addEventListener('change', () => { const keep = 10 - selectedFiles.length; if (keep <= 0) { alert('Можно прикрепить не более 10 файлов'); filesInput.value = ''; return; } selectedFiles = selectedFiles.concat([...filesInput.files].slice(0, keep)); if ([...filesInput.files].length > keep) alert('Можно прикрепить не более 10 файлов'); filesInput.value = ''; renderFiles(); }); const params = new URLSearchParams(location.search); let studentName = ''; function escName(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; } if (params.get('nameInput')) { studentName = params.get('nameInput'); document.getElementById('nameInput').value = studentName; const field = document.getElementById('nameField'); field.innerHTML = `