import { useState } from "react"; import { useAtom, useAtomValue } from "jotai"; import { selectedChatIdAtom } from "@/atoms/chatAtoms"; import { selectedAppIdAtom } from "@/atoms/appAtoms"; import { AlertTriangle, XCircle, FileText, Wrench, RefreshCw, Check, } from "lucide-react"; import { Problem, ProblemReport } from "@/ipc/ipc_types"; import { Button } from "@/components/ui/button"; import { useStreamChat } from "@/hooks/useStreamChat"; import { useCheckProblems } from "@/hooks/useCheckProblems"; import { createProblemFixPrompt } from "@/shared/problem_prompt"; import { showError } from "@/lib/toast"; interface ProblemItemProps { problem: Problem; } const ProblemItem = ({ problem }: ProblemItemProps) => { return (
{problem.file} {problem.line}:{problem.column}

{problem.message}

); }; interface RecheckButtonProps { appId: number; size?: "sm" | "default" | "lg"; variant?: | "default" | "destructive" | "outline" | "secondary" | "ghost" | "link"; className?: string; } const RecheckButton = ({ appId, size = "sm", variant = "outline", className = "h-7 px-3 text-xs", }: RecheckButtonProps) => { const { checkProblems, isChecking } = useCheckProblems(appId); const [showingFeedback, setShowingFeedback] = useState(false); const handleRecheck = async () => { setShowingFeedback(true); const res = await checkProblems(); setShowingFeedback(false); if (res.error) { showError(res.error); } }; const isShowingChecking = isChecking || showingFeedback; return ( ); }; interface ProblemsSummaryProps { problemReport: ProblemReport; appId: number; } const ProblemsSummary = ({ problemReport, appId }: ProblemsSummaryProps) => { const { streamMessage } = useStreamChat(); const { problems } = problemReport; const totalErrors = problems.length; const [selectedChatId] = useAtom(selectedChatIdAtom); const handleFixAll = () => { if (!selectedChatId) { return; } streamMessage({ prompt: createProblemFixPrompt(problemReport), chatId: selectedChatId, }); }; if (problems.length === 0) { return (

No problems found

); } return (
{totalErrors > 0 && (
{totalErrors} {totalErrors === 1 ? "error" : "errors"}
)}
); }; export function Problems() { return (
<_Problems />
); } export function _Problems() { const selectedAppId = useAtomValue(selectedAppIdAtom); const { problemReport } = useCheckProblems(selectedAppId); if (!selectedAppId) { return (

No App Selected

Select an app to view TypeScript problems and diagnostic information.

); } if (!problemReport) { return (

No Problems Report

Run checks to scan your app for TypeScript errors and other problems.

); } return (
{problemReport.problems.map((problem, index) => ( ))}
); }