From 64c1dd1789b91375340a1207c0d84c1f8ba6049a Mon Sep 17 00:00:00 2001 From: thibaud-lclr Date: Mon, 20 Apr 2026 16:53:49 +0200 Subject: [PATCH] fix(ui): harden ticket detail back navigation workflow --- src/components/projects/ProjectDashboard.tsx | 39 +++++++++++++------- src/components/tickets/TicketDetail.tsx | 2 +- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/components/projects/ProjectDashboard.tsx b/src/components/projects/ProjectDashboard.tsx index 76e50aa..a261684 100644 --- a/src/components/projects/ProjectDashboard.tsx +++ b/src/components/projects/ProjectDashboard.tsx @@ -9,6 +9,7 @@ import { getProjectThroughput, getRuntimeActivity, } from "../../lib/api"; +import { getErrorMessage } from "../../lib/errors"; import type { Project, WatchedTracker, @@ -70,6 +71,7 @@ export default function ProjectDashboard() { const [activePolls, setActivePolls] = useState>({}); const [activeAgents, setActiveAgents] = useState>({}); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); + const [loadError, setLoadError] = useState(""); function appendActivity(level: ActivityLevel, message: string) { const item: ActivityItem = { @@ -84,16 +86,23 @@ export default function ProjectDashboard() { const loadData = useCallback(async () => { if (!projectId) return; - const [proj, trks, tkts, stats] = await Promise.all([ - getProject(projectId), - listTrackers(projectId), - listProcessedTickets(projectId), - getProjectThroughput(projectId), - ]); - setProject(proj); - setTrackers(trks); - setTickets(tkts); - setThroughput(stats); + try { + const [proj, trks, tkts, stats] = await Promise.all([ + getProject(projectId), + listTrackers(projectId), + listProcessedTickets(projectId), + getProjectThroughput(projectId), + ]); + setProject(proj); + setTrackers(trks); + setTickets(tkts); + setThroughput(stats); + setLoadError(""); + } catch (error) { + const message = getErrorMessage(error); + setLoadError(message); + console.error("Failed to load project dashboard data", error); + } }, [projectId]); const syncRuntimeActivity = useCallback(async () => { @@ -388,12 +397,14 @@ export default function ProjectDashboard() { } if (!project) { - return
Loading...
; + return ( +
+ {loadError ? `Unable to load project: ${loadError}` : "Loading..."} +
+ ); } - const recentTickets = [...tickets] - .sort((a, b) => Date.parse(b.detected_at) - Date.parse(a.detected_at)) - .slice(0, 10); + const recentTickets = tickets.slice(0, 10); const activePollList = Object.entries(activePolls); const activeAgentList = Object.values(activeAgents); const done24h = throughput?.done_last_24h ?? 0; diff --git a/src/components/tickets/TicketDetail.tsx b/src/components/tickets/TicketDetail.tsx index 50e5f67..87c0796 100644 --- a/src/components/tickets/TicketDetail.tsx +++ b/src/components/tickets/TicketDetail.tsx @@ -292,7 +292,7 @@ export default function TicketDetail() {