import React, { useEffect, useState } from "react"; import { AlertTriangle, CheckCircle, Info, XCircle, Sparkles, ChevronDown, ChevronUp, FileCode } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; interface Suggestion { id: string; path: string; line?: number; severity: "info" | "warning" | "error" | "critical"; type: string; title: string; message: string; suggestedFix?: string; isDismissed: boolean; } interface Review { id: string; status: string; summary: string; overallSeverity: "info" | "warning" | "error" | "critical"; updatedAt: string; } interface AIReviewSummaryProps { owner: string; repo: string; prNumber: number; } export function AIReviewSummary({ owner, repo, prNumber }: AIReviewSummaryProps) { const [review, setReview] = useState(null); const [suggestions, setSuggestions] = useState([]); const [loading, setLoading] = useState(true); const [expanded, setExpanded] = useState(true); const fetchReview = async () => { try { const res = await fetch(`/api/repos/${owner}/${repo}/pulls/${prNumber}/ai-review`); if (res.ok) { const data = await res.json(); if (data) { setReview(data.review); setSuggestions(data.suggestions || []); } } } catch (e) { console.error("Failed to fetch AI review", e); } finally { setLoading(false); } }; useEffect(() => { fetchReview(); // Poll every 5s if status is running const interval = setInterval(() => { if (review?.status === 'running' || review?.status === 'pending') { fetchReview(); } }, 5000); return () => clearInterval(interval); }, [review?.status]); if (loading && !review) return null; if (!review && !loading) return null; // No review yet const severityColor = { info: "text-blue-500 border-blue-200 bg-blue-50", warning: "text-yellow-600 border-yellow-200 bg-yellow-50", error: "text-red-600 border-red-200 bg-red-50", critical: "text-red-700 border-red-400 bg-red-100", }; const StatusIcon = { info: Info, warning: AlertTriangle, error: XCircle, critical: AlertTriangle }[review!.overallSeverity] || Info; return (
{review?.status === 'running' ? ( ) : ( )}

AI Code Review {review?.status === 'running' && Analyzing...}

{review?.status === 'completed' ? `Completed ${new Date(review.updatedAt).toLocaleString()}` : "Analysis in progress..."}

{expanded && (
{/* Summary */} {review?.summary && (
{review.summary}
)} {/* Suggestions */}
{suggestions.map(suggestion => (
{suggestion.severity} {suggestion.title}

{suggestion.message}

{suggestion.path} {suggestion.line && L{suggestion.line}}
{suggestion.suggestedFix && (
// Suggested Fix
{suggestion.suggestedFix}
)}
))}
)}
); }