|
726 | 726 | } |
727 | 727 |
|
728 | 728 | // ─── Overview ───────────────────────────────────────────────────────────────── |
729 | | -function Overview({ timeRange, setRoute, setParams }) { |
| 729 | +function Overview({ timeRange, setRoute, setParams, lastUpdated }) { |
730 | 730 | const { ENDPOINTS, RELEASES, INSIGHTS, SUMMARY } = window.AF_DATA; |
731 | 731 | const [globalTs, setGlobalTs] = useState(null); |
732 | 732 | const hours = TIME_HOURS[timeRange] || 24; |
|
735 | 735 | setGlobalTs(null); |
736 | 736 | fetch(`/api/global-timeseries?hours=${hours}`) |
737 | 737 | .then(r => r.json()).then(d => setGlobalTs(d)).catch(() => setGlobalTs([])); |
738 | | - }, [hours]); |
| 738 | + }, [hours, lastUpdated]); |
739 | 739 |
|
740 | 740 | const chartData = globalTs ? tsBucketsToChart(globalTs, hours) : null; |
741 | 741 | const points = Math.max(chartData?.p90?.length || 0, 2); |
|
1057 | 1057 | } |
1058 | 1058 |
|
1059 | 1059 | // ─── Endpoint detail ────────────────────────────────────────────────────────── |
1060 | | -function EndpointDetail({ id, timeRange, setRoute, setParams }) { |
| 1060 | +function EndpointDetail({ id, timeRange, setRoute, setParams, lastUpdated }) { |
1061 | 1061 | const { ENDPOINTS, INSIGHTS } = window.AF_DATA; |
1062 | 1062 | const ep = ENDPOINTS.find(e => e.id === id) || ENDPOINTS[0]; |
1063 | 1063 | const [tab, setTab] = useState('performance'); |
|
1072 | 1072 | setTs(null); |
1073 | 1073 | fetch(`/api/timeseries?route=${encodeURIComponent(route)}&method=${encodeURIComponent(method)}&hours=${hours}`) |
1074 | 1074 | .then(r => r.json()).then(d => setTs(d)).catch(() => setTs([])); |
1075 | | - }, [id, hours]); |
| 1075 | + }, [id, hours, lastUpdated]); |
1076 | 1076 |
|
1077 | 1077 | if (!ep) return <div className="empty-state">Endpoint not found.</div>; |
1078 | 1078 |
|
|
1635 | 1635 | lastUpdated={lastUpdated} onRefresh={() => fetchData.current()}/> |
1636 | 1636 | <div className="content"> |
1637 | 1637 | <div className="content-inner"> |
1638 | | - {route === 'overview' && <Overview timeRange={timeRange} setRoute={setRoute} setParams={setParams}/>} |
| 1638 | + {route === 'overview' && <Overview timeRange={timeRange} setRoute={setRoute} setParams={setParams} lastUpdated={lastUpdated}/>} |
1639 | 1639 | {route === 'endpoints' && <Endpoints setRoute={setRoute} setParams={setParams}/>} |
1640 | | - {route === 'endpoint' && <EndpointDetail id={params.id} timeRange={timeRange} setRoute={setRoute} setParams={setParams}/>} |
| 1640 | + {route === 'endpoint' && <EndpointDetail id={params.id} timeRange={timeRange} setRoute={setRoute} setParams={setParams} lastUpdated={lastUpdated}/>} |
1641 | 1641 | {route === 'insights' && <Insights setRoute={setRoute} setParams={setParams}/>} |
1642 | 1642 | {route === 'releases' && <Releases/>} |
1643 | 1643 | {route === 'settings' && <Settings/>} |
|
0 commit comments