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(businessWorkspaceWidth: 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, businessWorkspaceWidth), [businessWorkspaceWidth, state] ); return { ...state, surfaceMode, mapSplitAvailable: businessWorkspaceWidth >= ARTIFACT_MAP_SPLIT_MIN_WIDTH, createTestArtifactPreview, openPreview, collapseArtifact, destroyPreview, destroyArtifact, setView }; }