diff --git a/apps/web/src/components/github/open-pr-button.tsx b/apps/web/src/components/github/open-pr-button.tsx new file mode 100644 index 00000000..e6527efa --- /dev/null +++ b/apps/web/src/components/github/open-pr-button.tsx @@ -0,0 +1,80 @@ +"use client"; + +import { useStreamContext } from "@/providers/Stream"; +import { TooltipIconButton } from "@/components/ui/tooltip-icon-button"; +import { useQueryState } from "nuqs"; +import { + GitPullRequest, + GitMerge, + GitPullRequestClosed, + GitPullRequestDraft, +} from "lucide-react"; +import { useEffect, useState } from "react"; +import { getPullRequest } from "@/utils/github"; +import { cn } from "@/lib/utils"; + +export function OpenPRButton() { + const stream = useStreamContext(); + const [branch] = useQueryState("branch"); + const [prState, setPrState] = useState< + "open" | "closed" | "draft" | "merged" + >(); + const [pullRequest, setPullRequest] = useState>(); + + useEffect(() => { + const baseBranch = + stream.values.targetRepository?.branch ?? + stream.values.targetRepository?.baseCommit ?? + branch; + if ( + !stream.values.branchName || + !stream.values.targetRepository || + !baseBranch + ) { + return; + } + getPullRequest({ + owner: stream.values.targetRepository.owner, + repo: stream.values.targetRepository.repo, + baseBranch: baseBranch, + headBranch: stream.values.branchName, + }).then((pr) => { + if (!pr) return; + setPullRequest(pr); + if (pr.merged_at) { + setPrState("merged"); + } else if (pr.draft) { + setPrState("draft"); + } else { + setPrState(pr.state); + } + }); + }, [stream.values?.branchName, stream.values.targetRepository, branch]); + + if (!pullRequest) { + return null; + } + + const handleOpenPR = () => { + window.open(pullRequest.html_url, "_blank", "noopener,noreferrer"); + }; + + return ( + + {prState === "merged" && } + {prState === "draft" && } + {prState === "closed" && } + {prState === "open" && } + + ); +} diff --git a/apps/web/src/components/thread/index.tsx b/apps/web/src/components/thread/index.tsx index edeb55f0..308eb680 100644 --- a/apps/web/src/components/thread/index.tsx +++ b/apps/web/src/components/thread/index.tsx @@ -45,6 +45,7 @@ import { ConfigurationSidebar } from "../configuration-sidebar"; import { DEFAULT_CONFIG_KEY, useConfigStore } from "@/hooks/useConfigStore"; import { RepositoryBranchSelectors } from "../github/repo-branch-selectors"; import { useRouter } from "next/navigation"; +import { OpenPRButton } from "../github/open-pr-button"; import { Tooltip, TooltipContent, @@ -115,6 +116,7 @@ export function Thread() { "chatHistoryOpen", parseAsBoolean.withDefault(false), ); + const [baseBranch, setBaseBranch] = useQueryState("base-branch"); const [configSidebarOpen, setConfigSidebarOpen] = useState(false); @@ -446,6 +448,7 @@ export function Thread() {
+ 0) { + return data.filter((d) => d.head?.ref === inputs.headBranch)[0]; + } + return data?.[0]; + } catch (e) { + console.error("Failed to get pull request", { + inputs, + error: e, + }); + return null; + } +}