Lazy load SEO project diagnostics

This commit is contained in:
DCCONSTRUCTIONS 2026-07-05 17:42:20 +03:00
parent 74abe909bd
commit bcc3d9e00e
1 changed files with 31 additions and 21 deletions

View File

@ -10005,19 +10005,19 @@ export function App() {
setPatchArtifacts(Object.fromEntries(patchEntries)); setPatchArtifacts(Object.fromEntries(patchEntries));
} }
async function loadModelProviderStatuses(projectList: ProjectSummary[]) { async function loadModelProviderStatusForProject(projectId: string) {
const statusEntries = await Promise.all(
projectList.map(async (project) => {
try { try {
const result = await fetchModelProviderStatus(project.id); const result = await fetchModelProviderStatus(projectId);
return [project.id, result.modelProvider] as const; setModelProviderStatuses((currentStatuses) => ({
...currentStatuses,
[projectId]: result.modelProvider
}));
} catch { } catch {
return [project.id, null] as const; setModelProviderStatuses((currentStatuses) => ({
...currentStatuses,
[projectId]: null
}));
} }
})
);
setModelProviderStatuses(Object.fromEntries(statusEntries));
} }
async function loadExternalServices() { async function loadExternalServices() {
@ -10243,7 +10243,9 @@ export function App() {
try { try {
const result = await fetchProjects(); const result = await fetchProjects();
setProjects(result.projects); setProjects(result.projects);
await Promise.all([ setProjectsLoading(false);
void Promise.all([
loadScanSummaries(result.projects), loadScanSummaries(result.projects),
loadSemanticAnalyses(result.projects), loadSemanticAnalyses(result.projects),
loadContextReviews(result.projects), loadContextReviews(result.projects),
@ -10261,12 +10263,12 @@ export function App() {
loadRewritePlans(result.projects), loadRewritePlans(result.projects),
loadMaterializationContracts(result.projects), loadMaterializationContracts(result.projects),
loadRewriteDiffContracts(result.projects), loadRewriteDiffContracts(result.projects),
loadPatchArtifacts(result.projects), loadPatchArtifacts(result.projects)
loadModelProviderStatuses(result.projects) ]).catch(() => {
]); // Project rows should remain usable even when a secondary contract endpoint is temporarily unavailable.
});
} catch (error: unknown) { } catch (error: unknown) {
setProjectsError(getErrorMessage(error, "Не удалось загрузить проекты.")); setProjectsError(getErrorMessage(error, "Не удалось загрузить проекты."));
} finally {
setProjectsLoading(false); setProjectsLoading(false);
} }
} }
@ -10782,6 +10784,14 @@ export function App() {
} }
}, [activeProjectId, projects, projectsLoading]); }, [activeProjectId, projects, projectsLoading]);
useEffect(() => {
if (!activeProjectId || !isWorkPanelOpen || Object.prototype.hasOwnProperty.call(modelProviderStatuses, activeProjectId)) {
return;
}
void loadModelProviderStatusForProject(activeProjectId);
}, [activeProjectId, isWorkPanelOpen, modelProviderStatuses]);
useEffect(() => { useEffect(() => {
folderInputRef.current?.setAttribute("webkitdirectory", ""); folderInputRef.current?.setAttribute("webkitdirectory", "");
folderInputRef.current?.setAttribute("directory", ""); folderInputRef.current?.setAttribute("directory", "");