import { useAtomValue } from "@effect/atom-react";import { connectionCatalogDisplayUrl, type EnvironmentPresentation as BaseEnvironmentPresentation,} from "@t3tools/client-runtime/connection";import type { EnvironmentId } from "@t3tools/contracts";import { useMemo } from "react"; import { environmentCatalog } from "../connection/catalog";import { environmentPresentations } from "./presentation";import { useEnvironmentQuery } from "./query"; export interface EnvironmentPresentation extends BaseEnvironmentPresentation { readonly environmentId: EnvironmentId; readonly label: string; readonly displayUrl: string | null; readonly relayManaged: boolean;} export function projectEnvironmentPresentation( environmentId: EnvironmentId, presentation: BaseEnvironmentPresentation,): EnvironmentPresentation { return { ...presentation, environmentId, label: presentation.entry.target.label, displayUrl: connectionCatalogDisplayUrl(presentation.entry), relayManaged: presentation.entry.target._tag === "RelayConnectionTarget", };} export function useEnvironments() { const catalog = useAtomValue(environmentCatalog.catalogValueAtom); const networkStatus = useAtomValue(environmentCatalog.networkStatusValueAtom); const presentationById = useAtomValue(environmentPresentations.presentationsAtom); const environments = useMemo( () => [...presentationById.entries()].map(([environmentId, presentation]) => projectEnvironmentPresentation(environmentId, presentation), ), [presentationById], ); return { isReady: catalog.isReady, networkStatus, environments, presentationById, };} export function useEnvironmentConnectionState(environmentId: EnvironmentId) { return useEnvironmentQuery(environmentCatalog.stateAtom(environmentId));}
import { useAtomValue } from "@effect/atom-react";
import {
connectionCatalogDisplayUrl,
type EnvironmentPresentation as BaseEnvironmentPresentation,
} from "@t3tools/client-runtime/connection";
import type { EnvironmentId } from "@t3tools/contracts";
import { useMemo } from "react";
import { environmentCatalog } from "../connection/catalog";
import { environmentPresentations } from "./presentation";
import { useEnvironmentQuery } from "./query";
export interface EnvironmentPresentation extends BaseEnvironmentPresentation {
readonly environmentId: EnvironmentId;
readonly label: string;
readonly displayUrl: string | null;
readonly relayManaged: boolean;
}
export function projectEnvironmentPresentation(
environmentId: EnvironmentId,
presentation: BaseEnvironmentPresentation,
): EnvironmentPresentation {
return {
...presentation,
environmentId,
label: presentation.entry.target.label,
displayUrl: connectionCatalogDisplayUrl(presentation.entry),
relayManaged: presentation.entry.target._tag === "RelayConnectionTarget",
};
}
export function useEnvironments() {
const catalog = useAtomValue(environmentCatalog.catalogValueAtom);
const networkStatus = useAtomValue(environmentCatalog.networkStatusValueAtom);
const presentationById = useAtomValue(environmentPresentations.presentationsAtom);
const environments = useMemo(
() =>
[...presentationById.entries()].map(([environmentId, presentation]) =>
projectEnvironmentPresentation(environmentId, presentation),
),
[presentationById],
);
return {
isReady: catalog.isReady,
networkStatus,
environments,
presentationById,
};
}
export function useEnvironmentConnectionState(environmentId: EnvironmentId) {
return useEnvironmentQuery(environmentCatalog.stateAtom(environmentId));
}