import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts';
import { AlertCircle, TrendingUp, Users, Zap, CheckCircle, XCircle } from 'lucide-react';
interface ErrorSummary {
error_type: string | null;
occurrence_count: number | null;
affected_users: number | null;
avg_duration_ms: number | null;
}
interface ApprovalMetric {
id: string;
success: boolean;
duration_ms: number | null;
created_at: string | null;
}
interface ErrorAnalyticsProps {
errorSummary: ErrorSummary[] | undefined;
approvalMetrics: ApprovalMetric[] | undefined;
}
export function ErrorAnalytics({ errorSummary, approvalMetrics }: ErrorAnalyticsProps) {
// Calculate error metrics
const totalErrors = errorSummary?.reduce((sum, item) => sum + (item.occurrence_count || 0), 0) || 0;
const totalAffectedUsers = errorSummary?.reduce((sum, item) => sum + (item.affected_users || 0), 0) || 0;
const avgErrorDuration = errorSummary?.length
? errorSummary.reduce((sum, item) => sum + (item.avg_duration_ms || 0), 0) / errorSummary.length
: 0;
const topErrors = errorSummary?.slice(0, 5) || [];
// Calculate approval metrics
const totalApprovals = approvalMetrics?.length || 0;
const failedApprovals = approvalMetrics?.filter(m => !m.success).length || 0;
const successRate = totalApprovals > 0 ? ((totalApprovals - failedApprovals) / totalApprovals) * 100 : 0;
const avgApprovalDuration = approvalMetrics?.length
? approvalMetrics.reduce((sum, m) => sum + (m.duration_ms || 0), 0) / approvalMetrics.length
: 0;
// Show message if no data available
if ((!errorSummary || errorSummary.length === 0) && (!approvalMetrics || approvalMetrics.length === 0)) {
return (
No analytics data available
Last 30 days
Unique error types
Users impacted
Before error occurs
Last 24 hours
Failed approvals
Overall success rate
Approval time