import { api } from '../api.js'; import { showToast } from '../components/toast.js'; const headers = () => ({ Authorization: `Bearer ${localStorage.getItem('token')}`, 'Content-Type': 'application/json' }); const API = (url, opts = {}) => fetch('/api' + url, { headers: headers(), ...opts }).then(r => r.json()); export async function render(container) { const user = JSON.parse(localStorage.getItem('user') || '{}'); if (user.role !== 'superadmin') { container.innerHTML = '

Access Denied

Platform admin access required.

'; return; } container.innerHTML = `

All Users

Loading...

Subscription Plans

Loading...

System

Loading...

`; loadUsers(); loadPlans(); loadSystem(); } async function loadUsers() { const el = document.getElementById('allUsersTable'); try { const [users, plans] = await Promise.all([API('/auth/users'), fetch('/api/subscription/plans').then(r => r.json())]); el.innerHTML = ` ${users.map(u => ` `).join('')}
User Auth Last Login Role Plan Actions
${u.name || u.email}
${u.email}
${u.auth_provider} ${u.last_login ? new Date(u.last_login * 1000).toLocaleString() : 'Never'} ${u.role !== 'superadmin' ? `` : 'Owner'}

${users.length} total users

`; // Role change el.querySelectorAll('[data-role-user]').forEach(select => { select.onchange = async () => { try { await API(`/auth/users/${select.dataset.roleUser}/role`, { method: 'PUT', body: JSON.stringify({ role: select.value }) }); showToast('Role updated', 'success'); } catch (err) { showToast(err.message, 'error'); loadUsers(); } }; }); // Plan change el.querySelectorAll('[data-plan-user]').forEach(select => { select.onchange = async () => { try { await API('/subscription/assign', { method: 'POST', body: JSON.stringify({ user_id: select.dataset.planUser, plan_id: select.value }) }); showToast('Plan updated', 'success'); } catch (err) { showToast(err.message, 'error'); loadUsers(); } }; }); // Delete user el.querySelectorAll('[data-delete-user]').forEach(btn => { let confirming = false; btn.onclick = async () => { if (confirming) { try { await api.deleteUser(btn.dataset.deleteUser); showToast('User removed', 'success'); loadUsers(); } catch (err) { showToast(err.message, 'error'); } return; } confirming = true; btn.textContent = 'Confirm?'; btn.style.background = 'var(--danger)'; btn.style.color = 'white'; setTimeout(() => { confirming = false; btn.textContent = 'Remove'; btn.style.background = ''; btn.style.color = ''; }, 3000); }; }); } catch (err) { el.innerHTML = `

${err.message}

`; } } async function loadPlans() { const el = document.getElementById('plansTable'); try { const plans = await fetch('/api/subscription/plans').then(r => r.json()); el.innerHTML = ` ${plans.map(p => ` `).join('')}
Plan Devices Storage Monthly Yearly
${p.display_name} ${p.max_devices === -1 ? 'Unlimited' : p.max_devices} ${p.max_storage_mb === -1 ? 'Unlimited' : p.max_storage_mb >= 1024 ? (p.max_storage_mb/1024)+'GB' : p.max_storage_mb+'MB'} ${p.price_monthly > 0 ? '$'+p.price_monthly : 'Free'} ${p.price_yearly > 0 ? '$'+p.price_yearly : '-'}
`; } catch (err) { el.innerHTML = `

${err.message}

`; } } async function loadSystem() { const el = document.getElementById('systemInfo'); try { const version = await fetch('/api/version').then(r => r.json()); const token = localStorage.getItem('token'); el.innerHTML = `
Version
${version.version}
Frontend Hash
${version.hash}
Download DB Backup Server Status
`; } catch (err) { el.innerHTML = `

${err.message}

`; } } export function cleanup() {}