1import { useAtomValue } from "@effect/atom-react";
2import type { PullRequestDetail } from "@t3tools/contracts";
3import { usePullRequestConnected } from "./usePullRequestConnected";
4import { composerPullRequests } from "../../state/pull-requests";
5import { pullRequestTarget, type PullRequestParams } from "./usePullRequestDiff";
6
7export function usePullRequestPermissions(params: PullRequestParams, pr: PullRequestDetail | null) {
8 const { environmentId } = pullRequestTarget(params);
9 const connected = usePullRequestConnected(environmentId);
10 const canWrite = useAtomValue(composerPullRequests.runAction.permissionAtom(environmentId));
11 const canComment = useAtomValue(composerPullRequests.comment.permissionAtom(environmentId));
12 const canReview = useAtomValue(composerPullRequests.submitReview.permissionAtom(environmentId));
13 const canReply = useAtomValue(composerPullRequests.replyToThread.permissionAtom(environmentId));
14 const canResolve = useAtomValue(
15 composerPullRequests.setThreadResolution.permissionAtom(environmentId),
16 );
17 return {
18 connected,
19 canInlineComment:
20 connected &&
21 canReview &&
22 pr?.state === "open" &&
23 pr.capabilities.review.inlineComment &&
24 pr.viewerPermissions.comment &&
25 pr.capabilities.review.verdicts.some((verdict) =>
26 pr.viewerPermissions.verdicts.includes(verdict),
27 ),
28 canReply:
29 connected &&
30 canReply &&
31 pr?.capabilities.review.reply === true &&
32 pr.viewerPermissions.comment,
33 canResolve:
34 connected &&
35 canResolve &&
36 pr?.capabilities.review.resolve === true &&
37 pr.viewerPermissions.resolve,
38 canWrite: connected && canWrite,
39 canComment:
40 connected && canComment && pr?.capabilities.comment === true && pr.viewerPermissions.comment,
41 verdicts:
42 connected && canReview && pr?.state === "open"
43 ? pr.capabilities.review.verdicts.filter((verdict) =>
44 pr.viewerPermissions.verdicts.includes(verdict),
45 )
46 : [],
47 };
48}