const API_URL = '/api/v1/index.php?request='; const state = { user: JSON.parse(localStorage.getItem('user')) || null, token: localStorage.getItem('token') || null, }; const routes = { '/': homePage, '/login': loginPage, '/learners': learnersPage, '/assessments': assessmentsPage, }; async function init() { window.addEventListener('hashchange', router); router(); updateNav(); } function router() { const hash = window.location.hash || '#/'; const path = hash.substring(1); const page = routes[path] || routes['/']; page(); } function updateNav() { const navLinks = document.getElementById('nav-links'); if (!state.token) { navLinks.innerHTML = ` `; return; } navLinks.innerHTML = ` `; document.getElementById('logout-btn').addEventListener('click', (e) => { e.preventDefault(); logout(); }); } function logout() { localStorage.removeItem('token'); localStorage.removeItem('user'); state.token = null; state.user = null; window.location.hash = '#/login'; updateNav(); } async function apiFetch(endpoint, options = {}) { const url = API_URL + endpoint; const defaultOptions = { headers: { 'Content-Type': 'application/json', ...(state.token ? { 'Authorization': `Bearer ${state.token}` } : {}) } }; const response = await fetch(url, { ...defaultOptions, ...options }); const data = await response.json(); if (response.status === 401) { logout(); throw new Error('Unauthorized'); } return data; } function render(html) { document.getElementById('content').innerHTML = html; } async function homePage() { if (!state.token) { window.location.hash = '#/login'; return; } render(`

Welcome, ${state.user.email}

This is the new static frontend for SOMS Platform. Everything is served from an API.


Learners

Manage your student records.

View All
Assessments

Record marks and track progress.

Open Hub
`); } function loginPage() { render(`

Sign In

`); document.getElementById('login-form').addEventListener('submit', async (e) => { e.preventDefault(); const email = document.getElementById('email').value; const password = document.getElementById('password').value; try { const data = await apiFetch('/auth/login', { method: 'POST', body: JSON.stringify({ email, password }) }); if (data.token) { localStorage.setItem('token', data.token); localStorage.setItem('user', JSON.stringify(data.user)); state.token = data.token; state.user = data.user; updateNav(); window.location.hash = '#/'; } } catch (err) { alert('Login failed: ' + err.message); } }); } async function learnersPage() { render('
'); try { const learners = await apiFetch('/learners'); let html = `

Learners

`; learners.forEach(l => { html += ` `; }); html += '
Full Name Grade Student ID Actions
${l.full_name} ${l.grade} ${l.student_id}
'; render(html); } catch (err) { render('
Failed to load learners
'); } } async function assessmentsPage() { render('
'); try { const assessments = await apiFetch('/assessments'); let html = `

Assessments

`; assessments.forEach(a => { html += `
${a.title}
${a.subject} - ${a.type}
`; }); html += '
'; render(html); } catch (err) { render('
Failed to load assessments
'); } } init();