1import { useAtomValue } from "@effect/atom-react";
2import { useMemo } from "react";
3
4import { environmentShellSummaryAtom } from "./shell";
5import { projectWorkspaceState } from "./workspaceModel";
6import { environmentCatalog } from "../connection/catalog";
7import { environmentPresentations } from "./presentation";
8import { createWorkspaceConnectionAtoms } from "./workspace-connection-atoms";
9
10export const workspaceConnections = createWorkspaceConnectionAtoms({
11 catalogValueAtom: environmentCatalog.catalogValueAtom,
12 networkStatusValueAtom: environmentCatalog.networkStatusValueAtom,
13 presentationAtom: environmentPresentations.presentationAtom,
14});
15
16export function useWorkspaceEnvironments() {
17 return useAtomValue(workspaceConnections.environmentsAtom);
18}
19
20export function useWorkspaceConnectionState() {
21 return useAtomValue(workspaceConnections.stateAtom);
22}
23
24export function useConnectionsReady() {
25 return useAtomValue(workspaceConnections.isReadyAtom);
26}
27
28export function useWorkspaceState() {
29 const isReady = useConnectionsReady();
30 const networkStatus = useAtomValue(environmentCatalog.networkStatusValueAtom);
31 const projectedEnvironments = useWorkspaceEnvironments();
32 const shellSummary = useAtomValue(environmentShellSummaryAtom);
33 const state = useMemo(
34 () =>
35 projectWorkspaceState({
36 isReady,
37 networkStatus,
38 environments: projectedEnvironments,
39 shellSummary,
40 }),
41 [isReady, networkStatus, projectedEnvironments, shellSummary],
42 );
43
44 return {
45 environments: projectedEnvironments,
46 state,
47 };
48}