const API_URL = 'http://localhost:3000'; let authToken = localStorage.getItem('admin_token'); document.addEventListener('DOMContentLoaded', () => { checkAuth(); if (authToken) { loadApps(); } }); function checkAuth() { const loginSection = document.getElementById('login-section'); const adminSection = document.getElementById('admin-section'); const userStatus = document.getElementById('user-status'); if (authToken) { loginSection.classList.add('hidden'); adminSection.classList.remove('hidden'); userStatus.classList.remove('hidden'); userStatus.innerHTML = 'Admin'; } } async function login() { const tokenInput = document.getElementById('admin-token'); const token = tokenInput.value; const errorDiv = document.getElementById('error-message'); if (!token) { showError('Inserisci il token admin'); return; } try { const response = await fetch(`${API_URL}/api/admin/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token }) }); const data = await response.json(); if (response.ok) { authToken = data.apiKey; localStorage.setItem('admin_token', authToken); checkAuth(); loadApps(); tokenInput.value = ''; } else { showError(data.error || 'Login fallito'); } } catch (error) { showError('Errore connessione API: ' + error.message); } } function logout() { localStorage.removeItem('admin_token'); authToken = null; checkAuth(); } async function loadApps() { const container = document.getElementById('apps-list'); container.innerHTML = '
'; try { const response = await fetch(`${API_URL}/api/apps`); const data = await response.json(); renderApps(data.apps || data); } catch (error) { container.innerHTML = '
Errore caricamento app
'; } } function renderApps(apps) { const container = document.getElementById('apps-list'); if (!apps || apps.length === 0) { container.innerHTML = '
Nessuna applicazione. Aggiungine una!
'; return; } container.innerHTML = ''; apps.forEach(app => { const appCard = document.createElement('div'); appCard.className = 'bg-gray-850 rounded-xl overflow-hidden shadow-lg border border-gray-700 hover:shadow-xl transition-shadow duration-300'; appCard.innerHTML = `

${app.name}

ID: ${app.id}

${app.description || ''}

APT: ${app.packages?.apt || 'N/A'}
AppStream: ${app.packages?.appstream || 'N/A'}
Flatpak: ${app.packages?.flatpak || 'N/A'}
`; container.appendChild(appCard); }); } function showError(message) { const errorDiv = document.getElementById('error-message'); errorDiv.textContent = message; errorDiv.classList.remove('hidden'); setTimeout(() => errorDiv.classList.add('hidden'), 5000); } function showAddForm() { document.getElementById('form-title').textContent = 'Aggiungi Applicazione'; document.getElementById('app-form').reset(); document.getElementById('app-id').value = ''; document.getElementById('app-id-input').value = ''; document.getElementById('app-name').value = ''; document.getElementById('app-description').value = ''; document.getElementById('app-icon').value = 'fa-package'; document.getElementById('app-colors').value = 'from-purple-500 to-indigo-600'; document.getElementById('app-apt').value = ''; document.getElementById('app-appstream').value = ''; document.getElementById('app-flatpak').value = ''; document.getElementById('app-form-modal').classList.remove('hidden'); } function closeForm() { document.getElementById('app-form-modal').classList.add('hidden'); } async function saveApp(event) { event.preventDefault(); const idInput = document.getElementById('app-id-input').value; const name = document.getElementById('app-name').value; const description = document.getElementById('app-description').value; const icon = document.getElementById('app-icon').value; const colors = document.getElementById('app-colors').value; const apt = document.getElementById('app-apt').value; const appstream = document.getElementById('app-appstream').value; const flatpak = document.getElementById('app-flatpak').value; const appData = { id: idInput, name, description, icon, colors, packages: { apt, appstream, flatpak } }; const isEdit = document.getElementById('app-id').value; const method = isEdit ? 'PUT' : 'POST'; const url = isEdit ? `${API_URL}/api/admin/apps/${document.getElementById('app-id').value}` : `${API_URL}/api/admin/apps`; try { const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${authToken}` }, body: JSON.stringify(appData) }); if (response.ok) { closeForm(); loadApps(); } else { const error = await response.json(); showError(error.error || 'Salvataggio fallito'); } } catch (error) { showError('Errore: ' + error.message); } } async function editApp(id) { const apps = await fetch(`${API_URL}/api/apps`).then(r => r.json()); const app = (apps.apps || apps).find(a => a.id === id); if (!app) return; document.getElementById('form-title').textContent = 'Modifica Applicazione'; document.getElementById('app-id').value = app.id; document.getElementById('app-id-input').value = app.id; document.getElementById('app-name').value = app.name; document.getElementById('app-description').value = app.description; document.getElementById('app-icon').value = app.icon || 'fa-package'; document.getElementById('app-colors').value = app.colors || 'from-purple-500 to-indigo-600'; document.getElementById('app-apt').value = app.packages?.apt || ''; document.getElementById('app-appstream').value = app.packages?.appstream || ''; document.getElementById('app-flatpak').value = app.packages?.flatpak || ''; document.getElementById('app-form-modal').classList.remove('hidden'); } async function deleteApp(id) { if (!confirm('Vuoi eliminare questa applicazione?')) return; try { const response = await fetch(`${API_URL}/api/admin/apps/${id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${authToken}` } }); if (response.ok) { loadApps(); } else { showError('Eliminazione fallita'); } } catch (error) { showError('Errore: ' + error.message); } } // Close modal on outside click document.getElementById('app-form-modal').addEventListener('click', (e) => { if (e.target.classList.contains('fixed')) { closeForm(); } });