window.renderUpdate = function(container){container.innerHTML = ` <div class="update-page"> <h2>Обновление ПО</h2> <div class="update-info"> <p>Текущая версия: <b id="current-version">Загрузка...</b></p> <p>Доступная версия: <b id="available-version">—</b></p> <div id="update-status"></div> </div> <div id="action-buttons"></div> <div id="update-loader" class="loading" style="display:none;"> <div class="spinner"></div> <p>Идет обновление...</p> <p>Не закрывайте страницу</p> </div> </div>`;checkForUpdate();};async function checkForUpdate(){const buttonsDiv = document.getElementById('action-buttons');const loader = document.getElementById('update-loader');const statusDiv = document.getElementById('update-status');loader.style.display = 'none';buttonsDiv.innerHTML = '<button class="update-btn" disabled>Проверка...</button>';statusDiv.innerHTML = '';try{const res = await fetch('/api/ota/check?t=' + Date.now());const result = await res.json();if(result.success){const current = result.current_version || '0.0.0';const available = result.version || current;document.getElementById('current-version').textContent = `v${current}`;document.getElementById('available-version').textContent = `v${available}`;statusDiv.innerHTML = `<p style="color: var(--accent);font-size: 1.1em;">${current === available ? '✓ Версия актуальна' : '✓ Доступно обновление'}</p>`;buttonsDiv.innerHTML = `<button class="update-btn" id="apply-update-btn">Установить обновление</button>`;document.getElementById('apply-update-btn').addEventListener('click',applyUpdate);}else{statusDiv.innerHTML = `<p style="color: red;">Ошибка: ${result.error}</p>`;}}catch(e){statusDiv.innerHTML = `<p style="color: red;">Ошибка сети</p>`;}}async function applyUpdate(){if(!confirm('Начать обновление?\nУстройство перезагрузится.'))return;sessionStorage.setItem('ota_update_started','true');const loader = document.getElementById('update-loader');const statusDiv = document.getElementById('update-status');const buttonsDiv = document.getElementById('action-buttons');buttonsDiv.innerHTML = '';loader.style.display = 'flex';try{await fetch('/api/ota/update?t=' + Date.now());}catch(e){}let timeLeft = 90;statusDiv.innerHTML = `<p style="color: var(--accent);">Обновление... Осталось: <b>${timeLeft}</b> сек</p>`;const timer = setInterval(()=>{timeLeft--;const el = statusDiv.querySelector('b');if(el)el.textContent = timeLeft;if(timeLeft <= 0)clearInterval(timer);},1000);let attempts = 0;const maxAttempts = 40;let done = false;const check = async()=>{if(done)return;attempts++;try{const res = await fetch(`/api/ota/file-status?t=${Date.now()}`,{cache: 'no-cache'});if(res.ok){const data = await res.json();if(['completed','error','idle'].includes(data.status)|| attempts >= maxAttempts){done = true;clearInterval(timer);const updateStarted = sessionStorage.getItem('ota_update_started')=== 'true';const isSuccess = data.status === 'completed' ||(data.status === 'idle' && updateStarted);let errorMessage = '';if(data.status === 'error'){errorMessage = data.message || 'Неизвестная ошибка';}else if(!isSuccess && attempts >= maxAttempts){errorMessage = 'Превышено время ожидания';}if(isSuccess){sessionStorage.removeItem('ota_update_started');sessionStorage.setItem('force_reload_after_ota','true');}statusDiv.innerHTML = ` <p style="color: ${isSuccess ? 'green' : 'red'};font-size: 1.2em;font-weight: bold;margin: 20px 0;"> ${isSuccess ? '✓ Обновление завершено' : `⚠ Процесс завершен: ${errorMessage}`}</p> <button class="update-btn" onclick="window.location.href='/?t=' + Date.now()" style="margin-top: 15px;"> Перезагрузить страницу </button> `;loader.style.display = 'none';return;}}}catch(e){}if(!done)setTimeout(check,2000);};setTimeout(()=>{check();},25000);}