// components/dashboard/index.js — the landing Dashboard as a feature module. // // dashboard.js exposes bare global functions (loadInstalledApps, // loadDashboardData live in dashboard.js / data-loader.js, both eager core // scripts) — there is no controller class to lazy-load, so scripts is empty. // system-loader's 'dashboard' component already ran initializeData()/ // loadSystemInfo()/setupEventListeners() once at boot; mount() only does the // per-navigation refresh (mirrors the old handleDashboard + the navigate() // data-reload special-case, which has been removed from spa.js so the reload // now fires exactly once here). LP.features.register({ id: 'dashboard', routes: ['/', '/dashboard'], async mount(ctx) { const html = await ctx.loadFragment('/components/dashboard/html/dashboard-content.html'); ctx.setContent(html, 'Dashboard'); // Render the installed-apps icon grid (handleDashboard's only post-render call). if (typeof loadInstalledApps === 'function') loadInstalledApps(); // Repaint the stat cards / disk donut + (re)wire the 1 Hz live SSE. The // 100 ms cushion lets the freshly-injected DOM settle (loadSystemInfo also // guards on element presence). ctx.sub() cancels it if we navigate away // before it fires. const reloadTimer = setTimeout(() => { if (typeof loadDashboardData === 'function') loadDashboardData(); }, 100); ctx.sub(() => clearTimeout(reloadTimer)); }, async unmount() { // Nothing this view owns is destroyable from here: the dashboard has no // handler-newed controller and no system-loader singleton to tear down. // The pending reload timer is cancelled via the ctx.sub() above (ctx.teardown). // The 1 Hz LiveSystem SSE sub (attachDashboardLive) self-releases on its // next sample once the dashboard DOM is gone, and the 1 s update countdown // is a module-private interval with no exported stopper (pre-existing; it // self-clears on the next dashboard mount). Both are noted for the Phase 5 // dashboard cleanup; neither is reachable here. }, });