import { Link, Navigate, createFileRoute } from "@tanstack/react-router" import { useEffect, useMemo, useRef } from "react" import { ArrowSquareOutIcon, GitPullRequestIcon } from "@phosphor-icons/react" import { useMutation, useQuery } from "@tanstack/react-query" import { buttonVariants } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card" import { Skeleton } from "@/components/ui/skeleton" import { api } from "@/lib/api" import { RequireLogin } from "@/lib/auth-redirect" import { useSession } from "@/lib/session" import { cn } from "@/lib/utils" export const Route = createFileRoute("/$owner/$repo/pull/$number")({ component: PullRequestReviewLinkPage, }) function PullRequestReviewLinkPage() { const { owner, repo, number } = Route.useParams() const prNumber = Number(number) const session = useSession() const stableReviewPath = `/agents/reviews/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/${prNumber}` const githubPrUrl = useMemo( () => `https://github.com/${owner}/${repo}/pull/${number}`, [owner, repo, number] ) const existingReview = useQuery({ queryKey: ["review", owner, repo, prNumber], queryFn: () => api.getReview(owner, repo, prNumber), enabled: !!session.data && Number.isFinite(prNumber), retry: false, }) const triggerRef = useRef(null) const triggerReview = useMutation({ mutationFn: () => api.reReview(owner, repo, prNumber), }) useEffect(() => { if (!session.data || !Number.isFinite(prNumber)) return if (existingReview.isLoading || existingReview.data?.status === "running") { return } const key = `${owner}/${repo}#${prNumber}` if (triggerRef.current === key) return triggerRef.current = key triggerReview.mutate() }, [ existingReview.data?.status, existingReview.isLoading, owner, repo, prNumber, session.data, triggerReview, ]) if (session.isLoading) { return (
) } if (!session.data) return if (!Number.isFinite(prNumber)) { return ( ) } if (existingReview.data?.status === "running" || triggerReview.isSuccess) { return ( ) } if (triggerReview.isError) { return ( triggerReview.mutate()} /> ) } const isCheckingExistingReview = existingReview.isLoading return ( ) } function ReviewLinkCard({ title, description, owner, repo, number, githubPrUrl, stableReviewPath, loading = false, onRetry, }: { title: string description: string owner: string repo: string number: string githubPrUrl: string stableReviewPath?: string loading?: boolean onRetry?: () => void }) { return (
{title} {description}
{owner}/{repo} #{number}
View on GitHub
{loading && }
{onRetry && ( )} {stableReviewPath && ( Open stable review page )} Open GitHub PR
) }