import { useAtomValue } from "@effect/atom-react";import { connectionCatalogDisplayUrl, type EnvironmentPresentation as BaseEnvironmentPresentation,} from "@t3tools/client-runtime/connection";import { Discovery } from "@t3tools/client-runtime/relay";import type { EnvironmentId } from "@t3tools/contracts";import * as Option from "effect/Option";import { useMemo } from "react"; import { environmentCatalog } from "../connection/catalog";import { environmentPresentations, useEnvironmentPresentation } from "./presentation";import { primaryEnvironmentIdAtom } from "./primaryEnvironment";import { relayEnvironmentDiscovery } from "./relay";import { usePreparedConnection } from "./session"; export interface EnvironmentPresentation extends BaseEnvironmentPresentation { readonly environmentId: EnvironmentId; readonly label: string; readonly displayUrl: string | null; readonly relayManaged: boolean;} 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 usePrimaryEnvironmentId(): EnvironmentId | null { return useAtomValue(primaryEnvironmentIdAtom);} export function useEnvironment( environmentId: EnvironmentId | null,): EnvironmentPresentation | null { const { presentation } = useEnvironmentPresentation(environmentId); return useMemo( () => environmentId === null || presentation === null ? null : projectEnvironmentPresentation(environmentId, presentation), [environmentId, presentation], );} export function usePrimaryEnvironment(): EnvironmentPresentation | null { return useEnvironment(usePrimaryEnvironmentId());} export function useEnvironmentHttpBaseUrl(environmentId: EnvironmentId | null): string | null { const prepared = usePreparedConnection(environmentId); return Option.isSome(prepared) ? prepared.value.httpBaseUrl : null;} export function useRelayEnvironmentDiscovery(): Discovery.RelayEnvironmentDiscoveryState { return useAtomValue(relayEnvironmentDiscovery.stateValueAtom);}
import { useAtomValue } from "@effect/atom-react";
import {
connectionCatalogDisplayUrl,
type EnvironmentPresentation as BaseEnvironmentPresentation,
} from "@t3tools/client-runtime/connection";
import { Discovery } from "@t3tools/client-runtime/relay";
import type { EnvironmentId } from "@t3tools/contracts";
import * as Option from "effect/Option";
import { useMemo } from "react";
import { environmentCatalog } from "../connection/catalog";
import { environmentPresentations, useEnvironmentPresentation } from "./presentation";
import { primaryEnvironmentIdAtom } from "./primaryEnvironment";
import { relayEnvironmentDiscovery } from "./relay";
import { usePreparedConnection } from "./session";
export interface EnvironmentPresentation extends BaseEnvironmentPresentation {
readonly environmentId: EnvironmentId;
readonly label: string;
readonly displayUrl: string | null;
readonly relayManaged: boolean;
}
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 usePrimaryEnvironmentId(): EnvironmentId | null {
return useAtomValue(primaryEnvironmentIdAtom);
}
export function useEnvironment(
environmentId: EnvironmentId | null,
): EnvironmentPresentation | null {
const { presentation } = useEnvironmentPresentation(environmentId);
return useMemo(
() =>
environmentId === null || presentation === null
? null
: projectEnvironmentPresentation(environmentId, presentation),
[environmentId, presentation],
);
}
export function usePrimaryEnvironment(): EnvironmentPresentation | null {
return useEnvironment(usePrimaryEnvironmentId());
}
export function useEnvironmentHttpBaseUrl(environmentId: EnvironmentId | null): string | null {
const prepared = usePreparedConnection(environmentId);
return Option.isSome(prepared) ? prepared.value.httpBaseUrl : null;
}
export function useRelayEnvironmentDiscovery(): Discovery.RelayEnvironmentDiscoveryState {
return useAtomValue(relayEnvironmentDiscovery.stateValueAtom);
}