/** * Transmission RSS Manager - System Status Module * @description Functionality for system status display and updates */ // System status and updates functionality function initSystemStatus() { // Elements const versionElement = document.getElementById('system-version'); const uptimeElement = document.getElementById('uptime'); const transmissionStatusElement = document.getElementById('transmission-status'); const updateStatusElement = document.getElementById('update-status'); const updateAvailableDiv = document.getElementById('update-available'); const updateButton = document.getElementById('btn-update-now'); const refreshButton = document.getElementById('btn-refresh-status'); // Load system status function loadSystemStatus() { fetch('/api/system/status', { headers: authHeaders() }) .then(handleResponse) .then(data => { if (data.status === 'success') { versionElement.textContent = data.data.version; uptimeElement.textContent = data.data.uptime; // Update transmission status with icon if (data.data.transmissionStatus === 'Connected') { transmissionStatusElement.innerHTML = ' Connected'; } else { transmissionStatusElement.innerHTML = ' Disconnected'; } } else { showNotification('Failed to load system status', 'danger'); } }) .catch(error => { console.error('Error fetching system status:', error); showNotification('Failed to connect to server', 'danger'); }); } // Check for updates function checkForUpdates() { updateStatusElement.innerHTML = ' Checking...'; updateAvailableDiv.classList.add('d-none'); // Add test=true parameter to force update availability for testing const testMode = localStorage.getItem('showUpdateButton') === 'true'; const url = testMode ? '/api/system/check-updates?test=true' : '/api/system/check-updates'; fetch(url, { headers: authHeaders() }) .then(handleResponse) .then(data => { if (data.status === 'success') { if (data.data.updateAvailable) { updateStatusElement.innerHTML = ' Update available'; updateAvailableDiv.classList.remove('d-none'); updateAvailableDiv.querySelector('span').textContent = `A new version is available: ${data.data.currentVersion} → ${data.data.remoteVersion}`; } else { updateStatusElement.innerHTML = ' Up to date'; } } else { updateStatusElement.innerHTML = ' Check failed'; showNotification(data.message || 'Failed to check for updates', 'danger'); } }) .catch(error => { console.error('Error checking for updates:', error); updateStatusElement.innerHTML = ' Check failed'; showNotification('Failed to connect to server', 'danger'); }); } // Apply update function applyUpdate() { // Show confirmation dialog if (!confirm('Are you sure you want to update the application? The service will restart.')) { return; } // Show loading state updateButton.disabled = true; updateButton.innerHTML = ' Updating...'; showNotification('Applying update. Please wait...', 'info'); fetch('/api/system/update', { method: 'POST', headers: { 'Content-Type': 'application/json', ...authHeaders() } }) .then(handleResponse) .then(data => { if (data.status === 'success') { showNotification('Update applied successfully. The page will reload in 30 seconds.', 'success'); // Set a timer to reload the page after the service has time to restart setTimeout(() => { window.location.reload(); }, 30000); } else { updateButton.disabled = false; updateButton.innerHTML = ' Update Now'; showNotification(data.message || 'Failed to apply update', 'danger'); } }) .catch(error => { console.error('Error applying update:', error); updateButton.disabled = false; updateButton.innerHTML = ' Update Now'; showNotification('Failed to connect to server', 'danger'); }); } // Event listeners if (refreshButton) { refreshButton.addEventListener('click', () => { loadSystemStatus(); checkForUpdates(); }); } if (updateButton) { updateButton.addEventListener('click', applyUpdate); } // Test mode toggle (for developers) const testToggle = document.getElementById('toggle-test-update-button'); if (testToggle) { // Initialize based on current localStorage setting const isTestMode = localStorage.getItem('showUpdateButton') === 'true'; // Update toggle text testToggle.innerText = isTestMode ? 'Disable Test Update' : 'Enable Test Update'; // Add click handler testToggle.addEventListener('click', (e) => { e.preventDefault(); const currentSetting = localStorage.getItem('showUpdateButton') === 'true'; const newSetting = !currentSetting; localStorage.setItem('showUpdateButton', newSetting); testToggle.innerText = newSetting ? 'Disable Test Update' : 'Enable Test Update'; // Re-check for updates with new setting checkForUpdates(); showNotification(`Test update button ${newSetting ? 'enabled' : 'disabled'}`, 'info'); }); } // Initialize loadSystemStatus(); checkForUpdates(); // Set interval to refresh uptime every minute setInterval(loadSystemStatus, 60000); }