// 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)); // Stop the 1 Hz update-countdown interval + drop this view's LiveSystem // subscription on navigation away — both are module-private in data-loader.js // and otherwise outlive the page (the leak class). ctx.teardown runs these. ctx.sub(() => { if (typeof stopUpdateCountdown === 'function') stopUpdateCountdown(); }); ctx.sub(() => { if (typeof detachDashboardLive === 'function') detachDashboardLive(); }); }, async unmount() { // This view's teardown is all registered via ctx.sub() in mount() and runs // in ctx.teardown(): the pending reload timer, the 1 Hz update-countdown // interval (stopUpdateCountdown), and this view's LiveSystem subscription // (detachDashboardLive). No handler-newed controller or singleton to tear down. }, });