lazy load admin ui data by page

This commit is contained in:
2026-06-29 18:23:04 +08:00
parent 57c7264c7b
commit 8c21691478
+41 -12
View File
@@ -551,11 +551,29 @@ export default function App() {
} }
} }
async function refreshLiveData() { async function loadPageData(targetPage: PageKey, { incrementalLogs = true } = {}) {
if (targetPage === "requests") {
await loadRequests();
return;
}
if (targetPage === "profiles") {
await loadProfiles();
return;
}
if (targetPage === "logs") {
await loadLogs(incrementalLogs && latestLogSeq > 0);
}
}
async function refreshLiveData(targetPage: PageKey = page) {
if (restoreRequested || switchingTo) { if (restoreRequested || switchingTo) {
return; return;
} }
await Promise.all([loadStatus(false), loadRequests(), loadProfiles(), loadLogs(true)]); const tasks: Array<Promise<unknown>> = [loadStatus(false)];
if (targetPage !== "overview" && targetPage !== "rules") {
tasks.push(loadPageData(targetPage, { incrementalLogs: true }));
}
await Promise.all(tasks);
} }
useEffect(() => { useEffect(() => {
@@ -580,19 +598,28 @@ export default function App() {
}, []); }, []);
useEffect(() => { useEffect(() => {
Promise.all([loadStatus(true), loadRequests(), loadProfiles(), loadLogs(false)]).catch((error) => { loadStatus(true).catch((error) => {
setRuleMessage({ text: error?.message || String(error), tone: "error" }); setRuleMessage({ text: error?.message || String(error), tone: "error" });
}); });
}, []); }, []);
useEffect(() => { useEffect(() => {
const timer = window.setInterval(() => { const timer = window.setInterval(() => {
refreshLiveData().catch((error) => { refreshLiveData().catch((error) => {
setRuleMessage({ text: error?.message || String(error), tone: "error" }); setRuleMessage({ text: error?.message || String(error), tone: "error" });
}); });
}, 2500); }, 2500);
return () => window.clearInterval(timer); return () => window.clearInterval(timer);
}); }, [page, requestQuery, requestFilter, latestLogSeq, restoreRequested, switchingTo]);
useEffect(() => {
if (page === "overview" || page === "rules") {
return;
}
loadPageData(page, { incrementalLogs: false }).catch((error) => {
setRuleMessage({ text: error?.message || String(error), tone: "error" });
});
}, [page]);
useEffect(() => { useEffect(() => {
if (page !== "profiles" || !shouldSyncProfileFormToActive) { if (page !== "profiles" || !shouldSyncProfileFormToActive) {
@@ -631,7 +658,6 @@ export default function App() {
}); });
setStatus(payload); setStatus(payload);
setRuleForm(ruleFormFromStatus(payload)); setRuleForm(ruleFormFromStatus(payload));
await Promise.all([loadRequests(), loadLogs(false)]);
setRuleMessage({ text: "配置已保存,并已对当前 gateway 立即生效。", tone: "success" }); setRuleMessage({ text: "配置已保存,并已对当前 gateway 立即生效。", tone: "success" });
} catch (error) { } catch (error) {
setRuleMessage({ text: error instanceof Error ? error.message : String(error), tone: "error" }); setRuleMessage({ text: error instanceof Error ? error.message : String(error), tone: "error" });
@@ -639,13 +665,16 @@ export default function App() {
} }
useEffect(() => { useEffect(() => {
if (page !== "requests") {
return;
}
const timer = window.setTimeout(() => { const timer = window.setTimeout(() => {
loadRequests().catch((error) => { loadRequests().catch((error) => {
setRuleMessage({ text: error?.message || String(error), tone: "error" }); setRuleMessage({ text: error?.message || String(error), tone: "error" });
}); });
}, 180); }, 180);
return () => window.clearTimeout(timer); return () => window.clearTimeout(timer);
}, [requestQuery, requestFilter]); }, [page, requestQuery, requestFilter]);
async function saveProfile(event: FormEvent) { async function saveProfile(event: FormEvent) {
event.preventDefault(); event.preventDefault();
@@ -780,7 +809,7 @@ export default function App() {
if (payload.config?.profile_name === profileName) { if (payload.config?.profile_name === profileName) {
setSwitchingTo(""); setSwitchingTo("");
setShouldSyncProfileFormToActive(true); setShouldSyncProfileFormToActive(true);
Promise.all([loadStatus(true), loadRequests(), loadProfiles(), loadLogs(false)]).catch(() => {}); Promise.all([loadStatus(true), loadProfiles()]).catch(() => {});
return; return;
} }
} catch { } catch {