import React, { useEffect, useState } from 'react'; import { PieChart, Pie, Cell, ResponsiveContainer, BarChart, Bar, XAxis, YAxis, Tooltip, Legend } from 'recharts'; import { Classification, Innovation, StatsData, ResultResponse } from '../types'; import { COLOR_MAP } from '../constants'; import { backendService } from '../services/backendService'; import InnovationCard from './InnovationCard'; import { CircleDashed } from 'lucide-react'; interface StatsDashboardProps { innovations: Innovation[]; isVisible: boolean; } const StatsDashboard: React.FC = ({ isVisible }) => { const [dbInnovations, setDbInnovations] = useState([]); const [loading, setLoading] = useState(false); // Filter Toggle State const [activeFilters, setActiveFilters] = useState([ Classification.HIGH, Classification.MEDIUM, Classification.LOW, Classification.UNCLASSIFIED ]); // Fetch from DB for the "True" state const fetchDbInnovations = async () => { setLoading(true); const results = await backendService.fetchClassifiedInnovations(); // Transform ResultResponse -> Innovation const transformed: ResultResponse[] = results.map((r: any) => ({ id: r.id, file_name: r.file_name, content: r.content, context: r.context || "N/A", problem: r.problem || "N/A", methodology: r.methodology || "N/A", classification: r.classification, })); setDbInnovations(transformed); setLoading(false); }; useEffect(() => { if (isVisible) { fetchDbInnovations(); } }, [isVisible]); const handleClassify = async (id: string, classification: Classification) => { // Find the innovation const inv = dbInnovations.find(i => i.id === Number(id)); if (inv && inv.id) { // Optimistic update setDbInnovations(prev => prev.map(i => i.id === Number(id) ? { ...i, classification } : i)); await backendService.saveClassification(Number(id), classification); } }; const toggleFilter = (cls: Classification) => { setActiveFilters(prev => prev.includes(cls) ? prev.filter(c => c !== cls) : [...prev, cls] ); }; // Filter for Display (High, Medium, Low, Unclassified) const displayInnovations = dbInnovations.filter(i => activeFilters.includes(i.classification as Classification) ); // Stats Logic - Use DB data for charts to be consistent with the list below const statsSource = dbInnovations.length > 0 ? dbInnovations : []; const data: StatsData[] = [ { name: 'High Priority', value: statsSource.filter(i => i.classification === Classification.HIGH).length, fill: COLOR_MAP[Classification.HIGH] }, { name: 'Medium Priority', value: statsSource.filter(i => i.classification === Classification.MEDIUM).length, fill: COLOR_MAP[Classification.MEDIUM] }, { name: 'Low Priority', value: statsSource.filter(i => i.classification === Classification.LOW).length, fill: COLOR_MAP[Classification.LOW] }, { name: 'Rejected', value: statsSource.filter(i => i.classification === Classification.DELETE).length, fill: COLOR_MAP[Classification.DELETE] }, { name: 'Unclassified', value: statsSource.filter(i => i.classification === Classification.UNCLASSIFIED).length, fill: COLOR_MAP[Classification.UNCLASSIFIED] }, ]; // Mock context data (unchanged) const contextData = [ { name: 'Network Opt', count: 12 }, { name: 'Security', count: 8 }, { name: 'QoS', count: 15 }, { name: 'New Use Cases', count: 5 }, ]; return (
{/* Charts Section */}

Classification Status

{data.map((entry, index) => ( ))}

Innovation Contexts (Trends)

{/* Classified List Section */}

Classified Innovations

{[Classification.HIGH, Classification.MEDIUM, Classification.LOW, Classification.UNCLASSIFIED].map(cls => ( ))}
{displayInnovations.length === 0 ? (

No items (High, Medium, Low, Unclassified) found.

) : (
{displayInnovations.map(inv => ( ))}
)}
); }; export default StatsDashboard;