Open History to see the last commit
1import { useAtomValue } from "@effect/atom-react";
2import {
3 canEditPullRequestChangeRequest,
4 canEditPullRequestComment,
5 canEditPullRequestMaintainerEdits,
6} from "@t3tools/client-runtime/pull-request-editing";
7import { canReactPullRequestComment } from "@t3tools/client-runtime/pull-request-reactions";
8import type { PullRequestComment, PullRequestDetail } from "@t3tools/contracts";
9import { usePullRequestConnected } from "./usePullRequestConnected";
10import { composerPullRequests } from "../../state/pull-requests";
11import { pullRequestTarget, type PullRequestParams } from "./usePullRequestDiff";
12
13export function usePullRequestPermissions(params: PullRequestParams, pr: PullRequestDetail | null) {
14 const { environmentId } = pullRequestTarget(params);
15 const connected = usePullRequestConnected(environmentId);
16 const canWrite = useAtomValue(composerPullRequests.runAction.permissionAtom(environmentId));
17 const canComment = useAtomValue(composerPullRequests.comment.permissionAtom(environmentId));
18 const canReview = useAtomValue(composerPullRequests.submitReview.permissionAtom(environmentId));
19 const canReply = useAtomValue(composerPullRequests.replyToThread.permissionAtom(environmentId));
20 const canResolve = useAtomValue(
21 composerPullRequests.setThreadResolution.permissionAtom(environmentId),
22 );
23 const canUpdate = useAtomValue(composerPullRequests.update.permissionAtom(environmentId));
24 const canUpdateComment = useAtomValue(
25 composerPullRequests.updateComment.permissionAtom(environmentId),
26 );
27 const canSetReaction = useAtomValue(
28 composerPullRequests.setReaction.permissionAtom(environmentId),
29 );
30 return {
31 connected,
32 canInlineComment:
33 connected &&
34 canReview &&
35 pr?.state === "open" &&
36 pr.capabilities.review.inlineComment &&
37 pr.viewerPermissions.comment &&
38 pr.capabilities.review.verdicts.some((verdict) =>
39 pr.viewerPermissions.verdicts.includes(verdict),
40 ),
41 canReply:
42 connected &&
43 canReply &&
44 pr?.capabilities.review.reply === true &&
45 pr.viewerPermissions.comment,
46 canResolve:
47 connected &&
48 canResolve &&
49 pr?.capabilities.review.resolve === true &&
50 pr.viewerPermissions.resolve,
51 canWrite: connected && canWrite,
52 canEditChangeRequest:
53 connected && canUpdate && pr !== null && canEditPullRequestChangeRequest(pr),
54 canEditMaintainerEdits:
55 connected && canUpdate && pr !== null && canEditPullRequestMaintainerEdits(pr),
56 canEditComment: (comment: Pick<PullRequestComment, "author" | "canEdit" | "kind">) =>
57 connected && canUpdateComment && pr !== null && canEditPullRequestComment(pr, comment),
58 canReactComment: (comment: Pick<PullRequestComment, "kind">) =>
59 connected && canSetReaction && pr !== null && canReactPullRequestComment(pr, comment),
60 canReact: connected && canSetReaction && pr?.capabilities.reactions === true,
61 canComment:
62 connected && canComment && pr?.capabilities.comment === true && pr.viewerPermissions.comment,
63 verdicts:
64 connected && canReview && pr?.state === "open"
65 ? pr.capabilities.review.verdicts.filter((verdict) =>
66 pr.viewerPermissions.verdicts.includes(verdict),
67 )
68 : [],
69 };
70}