diff --git a/web/src/components/Sidebar.svelte b/web/src/components/Sidebar.svelte index 14c7e25..e1756f4 100644 --- a/web/src/components/Sidebar.svelte +++ b/web/src/components/Sidebar.svelte @@ -12,15 +12,11 @@ return routerState.path === route; } - // Track whether we've attempted to load projects to avoid infinite retries on error - let loadAttempted = false; - - // Load projects on mount + // Load projects on mount and poll for changes every 10 seconds $effect(() => { - if (projectsState.projects.length === 0 && !loadAttempted) { - loadAttempted = true; - loadProjects(); - } + loadProjects(); + const interval = setInterval(loadProjects, 10_000); + return () => clearInterval(interval); }); diff --git a/web/src/views/Dashboard.svelte b/web/src/views/Dashboard.svelte index bc6acb3..58025c2 100644 --- a/web/src/views/Dashboard.svelte +++ b/web/src/views/Dashboard.svelte @@ -8,7 +8,7 @@ */ import type { ActiveAgent } from '../types'; - import { loadProjects, projectsState } from '../stores/projects.svelte'; + import { projectsState } from '../stores/projects.svelte'; import { apiClient } from '../api'; import { navigate } from '../router.svelte'; import LoadingSpinner from '../components/LoadingSpinner.svelte'; @@ -33,27 +33,25 @@ let error = $state(null); /** - * Load dashboard data on mount. - * Read reactive dependencies synchronously, then call async function. + * Reload dashboard whenever the project list changes. + * Projects are loaded/polled by the Sidebar, so we just react here. */ $effect(() => { - // Read reactive deps synchronously so Svelte tracks them const projects = projectsState.projects; - loadDashboardData(projects); + if (projects.length > 0) { + loadDashboardData(projects); + } }); /** * Async function to load all dashboard data. * Parallelizes goal fetches per-project, then parallelizes agent fetches. */ - async function loadDashboardData(projects: typeof projectsState.projects): Promise { + async function loadDashboardData(projects: Array): Promise { try { loading = true; error = null; - // Load all projects first - await loadProjects(); - // Fetch goals for all projects in parallel using Promise.allSettled const goalResults = await Promise.allSettled( projects.map((project) => apiClient.listGoals(project.id))