86 lines · 2.9 KB · TypeScript
RawDownload
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);}