import { useAtomValue } from "@effect/atom-react";import { type VcsStatusClient, type VcsStatusState, type VcsStatusTarget, EMPTY_VCS_STATUS_ATOM, EMPTY_VCS_STATUS_STATE, createVcsStatusManager, getVcsStatusDataForTarget, getVcsStatusTargetKey, vcsStatusStateAtom,} from "@t3tools/client-runtime";import type { EnvironmentId } from "@t3tools/contracts";import { useEffect } from "react"; import { readEnvironmentConnection, subscribeEnvironmentConnections,} from "../environments/runtime";import { appAtomRegistry } from "../rpc/atomRegistry";import { retainBackgroundScope } from "./backgroundActivityReporter"; export type { VcsStatusState, VcsStatusTarget };export { getVcsStatusDataForTarget }; const manager = createVcsStatusManager({ getRegistry: () => appAtomRegistry, getClient: (environmentId) => { const connection = readEnvironmentConnection(environmentId as EnvironmentId); return connection ? connection.client.vcs : null; }, getClientIdentity: (environmentId) => { const connection = readEnvironmentConnection(environmentId as EnvironmentId); return connection ? connection.environmentId : null; }, subscribeClientChanges: subscribeEnvironmentConnections,}); export function getVcsStatusSnapshot(target: VcsStatusTarget): VcsStatusState { return manager.getSnapshot(target);} export function watchVcsStatus(target: VcsStatusTarget, client?: VcsStatusClient): () => void { if (target.cwd === null) { return manager.watch(target, client); } const releaseScope = retainBackgroundScope({ type: "vcs-status", cwd: target.cwd }); const unwatch = manager.watch(target, client); return () => { unwatch(); releaseScope(); };} export function refreshVcsStatus(target: VcsStatusTarget, client?: VcsStatusClient) { return manager.refresh(target, client);} export function resetVcsStatusStateForTests(): void { manager.reset();} export function useVcsStatus(target: VcsStatusTarget): VcsStatusState { const targetKey = getVcsStatusTargetKey(target); useEffect( () => watchVcsStatus({ environmentId: target.environmentId, cwd: target.cwd }), [target.environmentId, target.cwd], ); const state = useAtomValue( targetKey !== null ? vcsStatusStateAtom(targetKey) : EMPTY_VCS_STATUS_ATOM, ); return targetKey === null ? EMPTY_VCS_STATUS_STATE : state;}
import { useAtomValue } from "@effect/atom-react";
import {
type VcsStatusClient,
type VcsStatusState,
type VcsStatusTarget,
EMPTY_VCS_STATUS_ATOM,
EMPTY_VCS_STATUS_STATE,
createVcsStatusManager,
getVcsStatusDataForTarget,
getVcsStatusTargetKey,
vcsStatusStateAtom,
} from "@t3tools/client-runtime";
import type { EnvironmentId } from "@t3tools/contracts";
import { useEffect } from "react";
import {
readEnvironmentConnection,
subscribeEnvironmentConnections,
} from "../environments/runtime";
import { appAtomRegistry } from "../rpc/atomRegistry";
import { retainBackgroundScope } from "./backgroundActivityReporter";
export type { VcsStatusState, VcsStatusTarget };
export { getVcsStatusDataForTarget };
const manager = createVcsStatusManager({
getRegistry: () => appAtomRegistry,
getClient: (environmentId) => {
const connection = readEnvironmentConnection(environmentId as EnvironmentId);
return connection ? connection.client.vcs : null;
},
getClientIdentity: (environmentId) => {
const connection = readEnvironmentConnection(environmentId as EnvironmentId);
return connection ? connection.environmentId : null;
},
subscribeClientChanges: subscribeEnvironmentConnections,
});
export function getVcsStatusSnapshot(target: VcsStatusTarget): VcsStatusState {
return manager.getSnapshot(target);
}
export function watchVcsStatus(target: VcsStatusTarget, client?: VcsStatusClient): () => void {
if (target.cwd === null) {
return manager.watch(target, client);
}
const releaseScope = retainBackgroundScope({ type: "vcs-status", cwd: target.cwd });
const unwatch = manager.watch(target, client);
return () => {
unwatch();
releaseScope();
};
}
export function refreshVcsStatus(target: VcsStatusTarget, client?: VcsStatusClient) {
return manager.refresh(target, client);
}
export function resetVcsStatusStateForTests(): void {
manager.reset();
}
export function useVcsStatus(target: VcsStatusTarget): VcsStatusState {
const targetKey = getVcsStatusTargetKey(target);
useEffect(
() => watchVcsStatus({ environmentId: target.environmentId, cwd: target.cwd }),
[target.environmentId, target.cwd],
);
const state = useAtomValue(
targetKey !== null ? vcsStatusStateAtom(targetKey) : EMPTY_VCS_STATUS_ATOM,
);
return targetKey === null ? EMPTY_VCS_STATUS_STATE : state;
}