68 lines
1.9 KiB
TypeScript
68 lines
1.9 KiB
TypeScript
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
|
|
};
|
|
}
|