From bcc3d9e00e3bc4e7b7643f61cf33dd07a6cdd691 Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Sun, 5 Jul 2026 17:42:20 +0300 Subject: [PATCH] Lazy load SEO project diagnostics --- seo_mode/seo_mode/app/src/App.tsx | 52 ++++++++++++++++++------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/seo_mode/seo_mode/app/src/App.tsx b/seo_mode/seo_mode/app/src/App.tsx index f5228ea..7a791b3 100644 --- a/seo_mode/seo_mode/app/src/App.tsx +++ b/seo_mode/seo_mode/app/src/App.tsx @@ -10005,19 +10005,19 @@ export function App() { setPatchArtifacts(Object.fromEntries(patchEntries)); } - async function loadModelProviderStatuses(projectList: ProjectSummary[]) { - const statusEntries = await Promise.all( - projectList.map(async (project) => { - try { - const result = await fetchModelProviderStatus(project.id); - return [project.id, result.modelProvider] as const; - } catch { - return [project.id, null] as const; - } - }) - ); - - setModelProviderStatuses(Object.fromEntries(statusEntries)); + async function loadModelProviderStatusForProject(projectId: string) { + try { + const result = await fetchModelProviderStatus(projectId); + setModelProviderStatuses((currentStatuses) => ({ + ...currentStatuses, + [projectId]: result.modelProvider + })); + } catch { + setModelProviderStatuses((currentStatuses) => ({ + ...currentStatuses, + [projectId]: null + })); + } } async function loadExternalServices() { @@ -10243,7 +10243,9 @@ export function App() { try { const result = await fetchProjects(); setProjects(result.projects); - await Promise.all([ + setProjectsLoading(false); + + void Promise.all([ loadScanSummaries(result.projects), loadSemanticAnalyses(result.projects), loadContextReviews(result.projects), @@ -10258,15 +10260,15 @@ export function App() { loadSeoStrategies(result.projects), loadStrategySyntheses(result.projects), loadStrategyQualityReviews(result.projects), - loadRewritePlans(result.projects), - loadMaterializationContracts(result.projects), - loadRewriteDiffContracts(result.projects), - loadPatchArtifacts(result.projects), - loadModelProviderStatuses(result.projects) - ]); + loadRewritePlans(result.projects), + loadMaterializationContracts(result.projects), + loadRewriteDiffContracts(result.projects), + loadPatchArtifacts(result.projects) + ]).catch(() => { + // Project rows should remain usable even when a secondary contract endpoint is temporarily unavailable. + }); } catch (error: unknown) { setProjectsError(getErrorMessage(error, "Не удалось загрузить проекты.")); - } finally { setProjectsLoading(false); } } @@ -10782,6 +10784,14 @@ export function App() { } }, [activeProjectId, projects, projectsLoading]); + useEffect(() => { + if (!activeProjectId || !isWorkPanelOpen || Object.prototype.hasOwnProperty.call(modelProviderStatuses, activeProjectId)) { + return; + } + + void loadModelProviderStatusForProject(activeProjectId); + }, [activeProjectId, isWorkPanelOpen, modelProviderStatuses]); + useEffect(() => { folderInputRef.current?.setAttribute("webkitdirectory", ""); folderInputRef.current?.setAttribute("directory", "");