Julius MarmingeT3 Code Mobile [WIP] (#2013)b3e8c035 months agoHistory
84 lines · 2.6 KB · TypeScript
RawDownload
import { useAtomValue } from "@effect/atom-react";import {  createTerminalSessionManager,  EMPTY_KNOWN_TERMINAL_SESSIONS_ATOM,  EMPTY_TERMINAL_SESSION_ATOM,  getKnownTerminalSessionTarget,  getKnownTerminalSessionListFilter,  knownTerminalSessionsAtom,  terminalSessionStateAtom,  type TerminalSessionTarget,  type TerminalSessionState,} from "@t3tools/client-runtime";import type {  EnvironmentId,  TerminalAttachInput,  TerminalAttachStreamEvent,  TerminalMetadataStreamEvent,  TerminalSessionSnapshot,} from "@t3tools/contracts";import { useMemo } from "react"; import { appAtomRegistry } from "./atom-registry"; export const terminalSessionManager = createTerminalSessionManager({  getRegistry: () => appAtomRegistry,}); export function subscribeTerminalMetadata(input: {  readonly environmentId: EnvironmentId;  readonly client: {    readonly terminal: {      readonly onMetadata: (        listener: (event: TerminalMetadataStreamEvent) => void,        options?: { readonly onResubscribe?: () => void },      ) => () => void;    };  };}) {  return terminalSessionManager.subscribeMetadata(input);} export function attachTerminalSession(input: {  readonly environmentId: EnvironmentId;  readonly client: Parameters<typeof terminalSessionManager.attach>[0]["client"];  readonly terminal: TerminalAttachInput;  readonly onSnapshot?: (snapshot: TerminalSessionSnapshot) => void;  readonly onEvent?: (event: TerminalAttachStreamEvent) => void;}) {  return terminalSessionManager.attach({    environmentId: input.environmentId,    client: input.client,    terminal: input.terminal,    ...(input.onSnapshot ? { onSnapshot: input.onSnapshot } : {}),    ...(input.onEvent ? { onEvent: input.onEvent } : {}),  });} export function useTerminalSession(input: TerminalSessionTarget): TerminalSessionState {  const target = getKnownTerminalSessionTarget(input);  return useAtomValue(    target !== null ? terminalSessionStateAtom(target) : EMPTY_TERMINAL_SESSION_ATOM,  );} export function useTerminalSessionTarget(input: TerminalSessionTarget) {  return useMemo(    () => ({      environmentId: input.environmentId,      threadId: input.threadId,      terminalId: input.terminalId,    }),    [input.environmentId, input.threadId, input.terminalId],  );} export function useKnownTerminalSessions(input: {  readonly environmentId: TerminalSessionTarget["environmentId"];  readonly threadId: TerminalSessionTarget["threadId"];}) {  const filter = getKnownTerminalSessionListFilter(input);  return useAtomValue(    filter !== null ? knownTerminalSessionsAtom(filter) : EMPTY_KNOWN_TERMINAL_SESSIONS_ATOM,  );}