feat: refactor artifact analysis workspace

This commit is contained in:
2026-08-19 16:09:51 +08:00
parent bfadc95f93
commit d2f2895c36
26 changed files with 998 additions and 2278 deletions
@@ -0,0 +1,67 @@
import { useCallback, useMemo, useRef, useState } from "react";
import { createAnalysisArtifactFixture } from "./analysis-document-fixtures";
import {
collapseActiveArtifact,
createInitialArtifactWorkspaceState,
destroyActiveArtifact,
destroyPendingArtifact,
openPendingArtifact,
previewAnalysisArtifact,
requestArtifactView,
resolveWorkbenchSurfaceMode,
ARTIFACT_MAP_SPLIT_MIN_WIDTH,
type ArtifactRequestedView
} from "./workspace-model";
export function useArtifactWorkspace(viewportWidth: number) {
const [state, setState] = useState(createInitialArtifactWorkspaceState);
const fixtureIndexRef = useRef(0);
const fixtureInstanceRef = useRef(0);
const createTestArtifactPreview = useCallback(() => {
const artifact = createAnalysisArtifactFixture(
fixtureIndexRef.current,
fixtureInstanceRef.current
);
fixtureIndexRef.current = (fixtureIndexRef.current + 1) % 3;
fixtureInstanceRef.current += 1;
setState((current) => previewAnalysisArtifact(current, artifact));
}, []);
const openPreview = useCallback(() => {
setState(openPendingArtifact);
}, []);
const collapseArtifact = useCallback(() => {
setState(collapseActiveArtifact);
}, []);
const destroyPreview = useCallback(() => {
setState(destroyPendingArtifact);
}, []);
const destroyArtifact = useCallback(() => {
setState(destroyActiveArtifact);
}, []);
const setView = useCallback((view: ArtifactRequestedView) => {
setState((current) => requestArtifactView(current, view));
}, []);
const surfaceMode = useMemo(
() => resolveWorkbenchSurfaceMode(state, viewportWidth),
[state, viewportWidth]
);
return {
...state,
surfaceMode,
mapSplitAvailable: viewportWidth >= ARTIFACT_MAP_SPLIT_MIN_WIDTH,
createTestArtifactPreview,
openPreview,
collapseArtifact,
destroyPreview,
destroyArtifact,
setView
};
}