Files
next-tjwater-frontend/src/features/workbench/workspace/use-artifact-workspace.ts
T

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
};
}