Skip to content
Source
Sign inSign up

presentation.ts

45 lines1.7 KB

1import { useAtomValue } from "@effect/atom-react";
2import type { EnvironmentPresentation } from "@t3tools/client-runtime/connection";
3import {
4 createEnvironmentPresentationAtoms,
5 createEnvironmentSummaryAtoms,
6} from "@t3tools/client-runtime/state/presentation";
7import type { EnvironmentId } from "@t3tools/contracts";
8import { Atom } from "effect/reactivity";
9​
10import { environmentCatalog } from "../connection/catalog";
11import { environmentServerConfigsAtom, serverEnvironment } from "./server";
12import { createThreadListEnvironmentsAtom } from "./thread-list-environments";
13​
14export const environmentPresentations = createEnvironmentPresentationAtoms({
15 catalogValueAtom: environmentCatalog.catalogValueAtom,
16 stateAtom: environmentCatalog.stateAtom,
17 serverConfigValueAtom: serverEnvironment.configValueAtom,
18});
19​
20export const { connectedEnvironmentIdsAtom } = createEnvironmentSummaryAtoms({
21 catalogValueAtom: environmentCatalog.catalogValueAtom,
22 presentationAtom: environmentPresentations.presentationAtom,
23});
24​
25export const threadListEnvironmentsAtom = createThreadListEnvironmentsAtom(
26 environmentServerConfigsAtom,
27 connectedEnvironmentIdsAtom,
28);
29​
30const EMPTY_ENVIRONMENT_PRESENTATION_ATOM = Atom.make<EnvironmentPresentation | null>(null).pipe(
31 Atom.withLabel("mobile-environment-presentation:empty"),
32);
33​
34export function useEnvironmentPresentation(environmentId: EnvironmentId | null) {
35 const catalog = useAtomValue(environmentCatalog.catalogValueAtom);
36 const presentation = useAtomValue(
37 environmentId === null
38 ? EMPTY_ENVIRONMENT_PRESENTATION_ATOM
39 : environmentPresentations.presentationAtom(environmentId),
40 );
41 return {
42 isReady: catalog.isReady,
43 presentation,
44 };