Compare commits
4
Commits
v0.8.1
...
803c346854
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
803c346854 | ||
|
|
f9f9af0fc9 | ||
|
|
9f51ea5e84 | ||
|
|
d190a55bf2 |
No files matched your search
+974
-91
File diff suppressed because it is too large.
Load diff
@@ -179,7 +179,7 @@ export function DashboardPage() {
|
|||||||
</div>
|
</div>
|
||||||
{loadStats && !loading && (
|
{loadStats && !loading && (
|
||||||
<span className="hidden text-[10px] text-content-muted sm:inline">
|
<span className="hidden text-[10px] text-content-muted sm:inline">
|
||||||
{t("loadStats", { ms: loadStats.ms, kb: loadStats.kb })}
|
{t("loadStats", { ms: loadStats.ms })}
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useCallback, useEffect, useState } from "react";
|
import { useCallback, useEffect, useRef, useState } from "react";
|
||||||
import { invoke } from "@tauri-apps/api/core";
|
import { invoke } from "@tauri-apps/api/core";
|
||||||
import type { SummaryResult } from "../types/dashboard";
|
import type { SummaryResult } from "../types/dashboard";
|
||||||
|
|
||||||
@@ -23,9 +23,12 @@ export function useDashboard() {
|
|||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
/** Round-trip timing for the last get_summary call (user-perceived lag). */
|
/** Round-trip timing for the last get_summary call (user-perceived lag). */
|
||||||
const [loadStats, setLoadStats] = useState<{ ms: number; kb: number } | null>(null);
|
const [loadStats, setLoadStats] = useState<{ ms: number } | null>(null);
|
||||||
|
// Generation counter: stale responses (superseded range / unmounted) are dropped.
|
||||||
|
const genRef = useRef(0);
|
||||||
|
|
||||||
const refresh = useCallback(async (force = false) => {
|
const refresh = useCallback(async (force = false) => {
|
||||||
|
const gen = ++genRef.current;
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError(null);
|
setError(null);
|
||||||
const start = performance.now();
|
const start = performance.now();
|
||||||
@@ -34,16 +37,15 @@ export function useDashboard() {
|
|||||||
range,
|
range,
|
||||||
refresh: force,
|
refresh: force,
|
||||||
});
|
});
|
||||||
|
if (genRef.current !== gen) return;
|
||||||
setData(result);
|
setData(result);
|
||||||
setLoadStats({
|
setLoadStats({ ms: Math.round(performance.now() - start) });
|
||||||
ms: Math.round(performance.now() - start),
|
|
||||||
kb: Math.round(JSON.stringify(result).length / 1024),
|
|
||||||
});
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
if (genRef.current !== gen) return;
|
||||||
const msg = err instanceof Error ? err.message : String(err);
|
const msg = err instanceof Error ? err.message : String(err);
|
||||||
setError(msg);
|
setError(msg);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
if (genRef.current === gen) setLoading(false);
|
||||||
}
|
}
|
||||||
}, [range]);
|
}, [range]);
|
||||||
|
|
||||||
@@ -51,6 +53,13 @@ export function useDashboard() {
|
|||||||
refresh();
|
refresh();
|
||||||
}, [refresh]);
|
}, [refresh]);
|
||||||
|
|
||||||
|
// Ignore late responses after unmount.
|
||||||
|
useEffect(() => {
|
||||||
|
return () => {
|
||||||
|
genRef.current += 1;
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
const changeRange = useCallback((next: DashboardRange) => {
|
const changeRange = useCallback((next: DashboardRange) => {
|
||||||
setRange(next);
|
setRange(next);
|
||||||
try {
|
try {
|
||||||
|
|||||||
+1
-1
@@ -257,7 +257,7 @@ export const enTranslations: Record<TranslationKey, string> = {
|
|||||||
scanning: "Scanning…",
|
scanning: "Scanning…",
|
||||||
refresh: "Refresh",
|
refresh: "Refresh",
|
||||||
refreshing: "Refreshing…",
|
refreshing: "Refreshing…",
|
||||||
loadStats: "Loaded in {ms} ms · {kb} KB payload",
|
loadStats: "Loaded in {ms} ms",
|
||||||
refreshed: "Refreshed",
|
refreshed: "Refreshed",
|
||||||
cancel: "Cancel",
|
cancel: "Cancel",
|
||||||
confirmDeleteTitle: "Delete session forever?",
|
confirmDeleteTitle: "Delete session forever?",
|
||||||
|
|||||||
+1
-1
@@ -249,7 +249,7 @@ export const zhTranslations = {
|
|||||||
scanning: "扫描中…",
|
scanning: "扫描中…",
|
||||||
refresh: "刷新",
|
refresh: "刷新",
|
||||||
refreshing: "刷新中…",
|
refreshing: "刷新中…",
|
||||||
loadStats: "加载 {ms} ms · 数据 {kb} KB",
|
loadStats: "加载 {ms} ms",
|
||||||
refreshed: "已刷新",
|
refreshed: "已刷新",
|
||||||
cancel: "取消",
|
cancel: "取消",
|
||||||
confirmDeleteTitle: "永久删除会话?",
|
confirmDeleteTitle: "永久删除会话?",
|
||||||
|
|||||||
Reference in new issue
Block a user