'use client'; import { useState } from 'react'; import { Play, CheckCircle, XCircle, AlertTriangle, FileText, Clock, Code2, Bug, Loader2 } from 'lucide-react'; import { runCodeQualityCheck, type CodeQualityReport, type CodeQualityIssue } from '@/lib/api'; import { SidebarNav } from '@/components/sidebar-nav'; export default function CodeQualityPage() { const [projectPath, setProjectPath] = useState(''); const [projectId, setProjectId] = useState(''); const [selectedChecks, setSelectedChecks] = useState>([ 'typescript', 'eslint', 'build', 'test', ]); const [loading, setLoading] = useState(false); const [report, setReport] = useState(null); const [error, setError] = useState(null); const handleRunCheck = async () => { if (!projectPath || !projectId) { setError('Please provide project ID and path'); return; } setLoading(true); setError(null); setReport(null); try { const result = await runCodeQualityCheck({ projectId, projectPath, checks: selectedChecks, }); setReport(result); } catch (err) { setError('Failed to run code quality check'); console.error(err); } finally { setLoading(false); } }; const toggleCheck = (check: 'typescript' | 'eslint' | 'build' | 'test') => { setSelectedChecks(prev => prev.includes(check) ? prev.filter(c => c !== check) : [...prev, check] ); }; const getIssueIcon = (type: string) => { switch (type) { case 'error': return ; case 'warning': return ; case 'info': return ; default: return null; } }; const getCategoryIcon = (category: string) => { switch (category) { case 'typescript': return ; case 'eslint': return ; case 'build': return ; case 'test': return ; default: return ; } }; return (

Code Quality Analysis

Run TypeScript, ESLint, build, and test checks on your projects

{/* Configuration */}

Configuration

setProjectId(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white" placeholder="e.g., trading-service" />
setProjectPath(e.target.value)} className="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white" placeholder="e.g., /opt/bytelyst/learning_ai_invt_trdg" />
{(['typescript', 'eslint', 'build', 'test'] as const).map((check) => ( ))}
{error && (
{error}
)} {/* Results */} {report && (
{/* Summary */}

Summary

{report.summary.totalIssues}
Total Issues
{report.summary.errors}
Errors
{report.summary.warnings}
Warnings
{report.categories.test.passed}
Tests Passed
{/* Categories */}

TypeScript

Errors: {report.categories.typescript.errors}
Warnings: {report.categories.typescript.warnings}
Duration: {report.categories.typescript.duration}ms

ESLint

Errors: {report.categories.eslint.errors}
Warnings: {report.categories.eslint.warnings}
Duration: {report.categories.eslint.duration}ms

Build

Status: {report.categories.build.success ? 'Success' : 'Failed'}
Errors: {report.categories.build.errors}
Duration: {report.categories.build.duration}ms

Tests

Status: {report.categories.test.success ? 'Success' : 'Failed'}
Passed: {report.categories.test.passed}
Failed: {report.categories.test.failed}
{/* Issues List */}

Issues

{report.issues.length === 0 ? (

No issues found!

) : (
{report.issues.map((issue) => (
{getIssueIcon(issue.type)}
{issue.file} {issue.line && ( :{issue.line} {issue.column && `:${issue.column}`} )}
{getCategoryIcon(issue.category)}

{issue.message}

{issue.rule && (

Rule: {issue.rule}

)}
))}
)}
)}
); }