1
0

feat: Dashboard 刷新频率可配置 — RadioGroup 选择器、动态轮询间隔、手动刷新按钮

- useDashboard hook 改为接受 refetchInterval 动态参数,移除固定 8 秒常量
- Header operations 区域重构为 RadioGroup(手动/10秒/30秒/1分钟/5分钟)+ 倒计时/刷新按钮
- 新增 formatCountdown 工具函数及单元测试
- 新增 .dashboard-refresh-control 和 .dashboard-countdown CSS 类
- 同步更新 DEVELOPMENT.md、README.md、主 specs
This commit is contained in:
2026-05-14 18:03:42 +08:00
parent c61a4a6091
commit 9904f198aa
12 changed files with 176 additions and 44 deletions

View File

@@ -9,19 +9,17 @@ const queryKeys = {
["metrics", targetId, from, to, bucket] as const,
};
export const DASHBOARD_REFRESH_INTERVAL_MS = 8000;
export async function fetchJson<T>(url: string): Promise<T> {
const response = await fetch(url);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json() as Promise<T>;
}
export function useDashboard() {
export function useDashboard(refetchInterval: false | number) {
return useQuery({
queryFn: () => fetchJson<DashboardResponse>("/api/dashboard?window=24h&recentLimit=30"),
queryKey: queryKeys.dashboard(),
refetchInterval: DASHBOARD_REFRESH_INTERVAL_MS,
refetchInterval,
refetchIntervalInBackground: false,
});
}

View File

@@ -17,7 +17,7 @@ export function useTargetDetail() {
const [timeTo, setTimeTo] = useState("");
const [historyPage, setHistoryPage] = useState(1);
const { data: dashboardData } = useDashboard();
const { data: dashboardData } = useDashboard(false);
const selectedTarget =
selectedTargetId !== null
? (dashboardData?.targets.find((target) => target.id === selectedTargetId) ?? null)