import { useAtomValue } from "@effect/atom-react"; import { EMPTY_SOURCE_CONTROL_DISCOVERY_ATOM, EMPTY_SOURCE_CONTROL_DISCOVERY_STATE, type SourceControlDiscoveryState, createSourceControlDiscoveryManager, getSourceControlDiscoveryTargetKey, sourceControlDiscoveryStateAtom, } from "@t3tools/client-runtime"; import type { SourceControlDiscoveryResult } from "@t3tools/contracts"; import { Effect } from "effect"; import { Atom } from "effect/unstable/reactivity"; import { readLocalApi } from "../localApi"; import { appAtomRegistry } from "../rpc/atomRegistry"; const SOURCE_CONTROL_DISCOVERY_TARGET = { key: "primary" } as const; const SOURCE_CONTROL_DISCOVERY_STALE_TIME_MS = 30_000; const SOURCE_CONTROL_DISCOVERY_IDLE_TTL_MS = 5 * 60_000; export const sourceControlDiscoveryManager = createSourceControlDiscoveryManager({ getRegistry: () => appAtomRegistry, getClient: () => readLocalApi()?.server ?? null, }); const sourceControlDiscoveryAutoRefreshAtom = Atom.make(() => Effect.promise(() => refreshSourceControlDiscovery()), ).pipe( Atom.swr({ staleTime: SOURCE_CONTROL_DISCOVERY_STALE_TIME_MS, revalidateOnMount: true, }), Atom.setIdleTTL(SOURCE_CONTROL_DISCOVERY_IDLE_TTL_MS), Atom.withLabel("source-control-discovery:auto-refresh"), ); export function refreshSourceControlDiscovery(): Promise { return sourceControlDiscoveryManager.refresh(SOURCE_CONTROL_DISCOVERY_TARGET); } export function resetSourceControlDiscoveryStateForTests(): void { sourceControlDiscoveryManager.reset(); } export function useSourceControlDiscovery(): SourceControlDiscoveryState { const targetKey = getSourceControlDiscoveryTargetKey(SOURCE_CONTROL_DISCOVERY_TARGET); useAtomValue(sourceControlDiscoveryAutoRefreshAtom); const state = useAtomValue( targetKey !== null ? sourceControlDiscoveryStateAtom(targetKey) : EMPTY_SOURCE_CONTROL_DISCOVERY_ATOM, ); return targetKey === null ? EMPTY_SOURCE_CONTROL_DISCOVERY_STATE : state; }