1import { RegistryContext, useAtomValue } from "@effect/atom-react";
2import type { EnvironmentId } from "@t3tools/contracts";
3import { AsyncResult } from "effect/reactivity";
4import { useContext } from "react";
5
6import { agentSessionScan } from "../state/agentSessions";
7import { environmentAtomList, environmentIdsKey } from "../state/environmentAtomList";
8import { formatEnvironmentQueryError } from "../state/query";
9
10const scanAtom = (environmentId: EnvironmentId) => agentSessionScan({ environmentId, input: {} });
11const projectScansAtom = environmentAtomList("web-project-scans", scanAtom);
12
13export function useProjectScans(environmentIds: readonly EnvironmentId[]) {
14 const registry = useContext(RegistryContext);
15 const results = useAtomValue(projectScansAtom(environmentIdsKey(environmentIds)));
16 return environmentIds.map((environmentId, index) => {
17 const result = results[index]!;
18 return {
19 environmentId,
20 data: AsyncResult.getOrElse(result, () => null),
21 error: result._tag === "Failure" ? formatEnvironmentQueryError(result.cause) : null,
22 isPending: result.waiting || result._tag === "Initial",
23 refresh: () => registry.refresh(scanAtom(environmentId)),
24 };
25 });
26}