Repository navigation
Expand file tree
/
Copy pathuseReviewGuideWriter.ts
More file actions
64 lines (59 loc) · 2.19 KB
/
Copy pathuseReviewGuideWriter.ts
File metadata and controls
64 lines (59 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import type { EnvironmentId, PullRequestRef } from "@t3tools/contracts";
import { squashAtomCommandFailure } from "@t3tools/client-runtime/state/runtime";
import { useAtomValue } from "@effect/atom-react";
import { useState } from "react";
import { pullRequestEnvironment } from "~/state/pullRequests";
import { useEnvironmentQuery } from "~/state/query";
import { useAtomCommand } from "~/state/use-atom-command";
import { toastManager } from "../../ui/toast";
import { readableFailure } from "../pullRequestDetail.logic";
import { guideRunKey, useGuideRunStore } from "./guideRunStore";
export function useReviewGuideWriter({
environmentId,
reference,
title,
}: {
environmentId: EnvironmentId;
reference: PullRequestRef;
title: string | null;
}) {
const query = useEnvironmentQuery(
pullRequestEnvironment.reviewGuide({ environmentId, input: reference }),
);
const canWrite = useAtomValue(
pullRequestEnvironment.generateReviewGuide.permissionAtom(environmentId),
);
const generate = useAtomCommand(pullRequestEnvironment.generateReviewGuide, {
reportFailure: false,
});
const [starting, setStarting] = useState(false);
const data = query.data;
const running = starting || data?.run?._tag === "Running";
// A run reported by the server is watched where its answer lands (state/pullRequests.ts).
const write = async () => {
if (running) return;
setStarting(true);
useGuideRunStore.getState().watch({
environmentId,
reference,
title,
previousGuideAt: data?.guide?.generatedAt ?? null,
previousFailedAt: data?.run?._tag === "Failed" ? data.run.failedAt : null,
since: Date.now(),
});
const result = await generate({ environmentId, input: reference });
setStarting(false);
if (result._tag === "Failure") {
useGuideRunStore.getState().settle(guideRunKey(environmentId, reference));
toastManager.add({
type: "error",
title: "Could not start a review guide",
description: readableFailure(
squashAtomCommandFailure(result),
"Check the review guide model in Settings → Source control.",
),
});
}
};
return { query, data, running, canWrite, write };
}