feat(v2.2): 完成高频读取热路径

This commit is contained in:
Script Generator
2026-07-03 11:53:25 +08:00
parent 5a90923031
commit 70460c3273
28 changed files with 3042 additions and 121 deletions

View File

@@ -1,6 +1,6 @@
'use client';
import { useEffect, useMemo } from 'react';
import { useEffect, useMemo, useState } from 'react';
import { useProductStore } from '@/stores/useProductStore';
import { useVersionPlanStore } from '@/stores/useVersionPlanStore';
import { useRequirementStore } from '@/stores/useRequirementStore';
@@ -10,6 +10,8 @@ import { useBugStore } from '@/stores/useBugStore';
import { useAuthStore } from '@/stores/useAuthStore';
import { flattenVersions } from '@/lib/derive';
import { aggregateWorkItems } from '@/lib/workspace-engine';
import { loadV22WorkspaceData, type V22WorkspaceData } from '@/lib/v22-api';
import { selectWorkspaceCollections } from '@/lib/workspace-v22-source';
export function useWorkspaceWorkItems({ autoFetch = true }: { autoFetch?: boolean } = {}) {
const { overview, fetchOverview } = useProductStore();
@@ -19,15 +21,60 @@ export function useWorkspaceWorkItems({ autoFetch = true }: { autoFetch?: boolea
const { testCases, fetchTestCases } = useTestCaseStore();
const { bugs, fetchBugs } = useBugStore();
const user = useAuthStore((s) => s.user);
const [v22WorkspaceData, setV22WorkspaceData] = useState<V22WorkspaceData | null>(null);
const [v22WorkspaceLoaded, setV22WorkspaceLoaded] = useState(false);
const [v22WorkspaceFailed, setV22WorkspaceFailed] = useState(false);
useEffect(() => { if (autoFetch) fetchOverview(); }, [autoFetch, fetchOverview]);
useEffect(() => { if (autoFetch) fetchPlans(); }, [autoFetch, fetchPlans]);
useEffect(() => { if (autoFetch) fetchRequirements(); }, [autoFetch, fetchRequirements]);
useEffect(() => { if (autoFetch) fetchTasks(); }, [autoFetch, fetchTasks]);
useEffect(() => { if (autoFetch) fetchTestCases(); }, [autoFetch, fetchTestCases]);
useEffect(() => { if (autoFetch) fetchBugs(); }, [autoFetch, fetchBugs]);
const userName = user?.name ?? '';
const workspaceUserKey = userName || user?.id || '';
useEffect(() => {
if (!autoFetch || !workspaceUserKey.trim()) {
setV22WorkspaceData(null);
setV22WorkspaceLoaded(false);
setV22WorkspaceFailed(false);
return;
}
let cancelled = false;
setV22WorkspaceLoaded(false);
setV22WorkspaceFailed(false);
loadV22WorkspaceData(workspaceUserKey)
.then((data) => {
if (cancelled) return;
setV22WorkspaceData(data);
setV22WorkspaceLoaded(true);
})
.catch(() => {
if (cancelled) return;
setV22WorkspaceData(null);
setV22WorkspaceFailed(true);
});
return () => {
cancelled = true;
};
}, [autoFetch, workspaceUserKey]);
useEffect(() => {
if (!autoFetch || !workspaceUserKey.trim() || !v22WorkspaceFailed) return;
void fetchPlans();
void fetchRequirements();
void fetchTasks();
void fetchTestCases();
void fetchBugs();
}, [
autoFetch,
fetchBugs,
fetchPlans,
fetchRequirements,
fetchTasks,
fetchTestCases,
v22WorkspaceFailed,
workspaceUserKey,
]);
const allVersions = useMemo(() => flattenVersions(overview), [overview]);
const versionMap = useMemo(() => {
@@ -51,9 +98,27 @@ export function useWorkspaceWorkItems({ autoFetch = true }: { autoFetch?: boolea
return map;
}, [requirements]);
const workspaceCollections = useMemo(
() => selectWorkspaceCollections({
v22Loaded: v22WorkspaceLoaded,
v22Failed: v22WorkspaceFailed,
v22Data: v22WorkspaceData,
appData: { plans, devTasks, testCases, bugs },
}),
[bugs, devTasks, plans, testCases, v22WorkspaceData, v22WorkspaceFailed, v22WorkspaceLoaded],
);
const workItems = useMemo(
() => aggregateWorkItems(userName, plans, devTasks, testCases, bugs, versionMap, requirementVersionMap),
[userName, plans, devTasks, testCases, bugs, versionMap, requirementVersionMap],
() => aggregateWorkItems(
userName,
workspaceCollections.versionPlans,
workspaceCollections.devTasks,
workspaceCollections.testCases,
workspaceCollections.bugs,
versionMap,
requirementVersionMap,
),
[userName, workspaceCollections, versionMap, requirementVersionMap],
);
return {
@@ -62,8 +127,8 @@ export function useWorkspaceWorkItems({ autoFetch = true }: { autoFetch?: boolea
versionMap,
requirementVersionMap,
workItems,
devTasks,
testCases,
bugs,
devTasks: workspaceCollections.devTasks,
testCases: workspaceCollections.testCases,
bugs: workspaceCollections.bugs,
};
}