import { useEffect, useState, useMemo } from 'react'; import axios from 'axios'; import { flexRender, getCoreRowModel, useReactTable, getSortedRowModel, } from '@tanstack/react-table'; import { BenchmarkResult } from '../../../types'; import { columns } from './columns'; import { BenchmarkCharts } from '../charts/BenchmarkCharts'; import { exportToCsv } from '../export/csvExport'; export function BenchmarkTable() { const [data, setData] = useState([]); const [selectedDataset, setSelectedDataset] = useState(''); const [availableDatasets, setAvailableDatasets] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { setIsLoading(true); setError(null); const response = await axios.get( 'https://raw.githubusercontent.com/magland/zia/benchmark-results/benchmark_results/results.json' ); const results = response.data.results; setData(results); // Extract unique dataset names with proper typing const datasets = Array.from(new Set(results.map((result: BenchmarkResult) => result.dataset))).sort() as string[]; setAvailableDatasets(datasets); } catch (error) { const message = error instanceof Error ? error.message : 'Failed to fetch data'; setError(message); console.error('Error fetching benchmark data:', error); } finally { setIsLoading(false); } }; fetchData(); }, []); // Memoize filtered data to prevent unnecessary recalculations const filteredData = useMemo(() => { if (!selectedDataset) return data; return data.filter(row => row.dataset === selectedDataset); }, [data, selectedDataset]); const table = useReactTable({ data: filteredData || [], columns, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }); // Prepare data for bar charts when a dataset is selected const chartData = useMemo(() => { if (!selectedDataset) return []; return data .filter(row => row.dataset === selectedDataset) .map(row => ({ algorithm: row.algorithm, compression_ratio: row.compression_ratio, encode_speed: row.encode_mb_per_sec, decode_speed: row.decode_mb_per_sec })); }, [data, selectedDataset]); if (isLoading) { return
Loading benchmark data...
; } if (error) { return
Error: {error}
; } return (
{selectedDataset && chartData.length > 0 && ( )} {table.getHeaderGroups().map(headerGroup => ( {headerGroup.headers.map(header => ( ))} ))} {table.getRowModel().rows.map(row => ( {row.getVisibleCells().map(cell => ( ))} ))}
{flexRender( header.column.columnDef.header, header.getContext() )} {header.column.getIsSorted() && ( {header.column.getIsSorted() === 'asc' ? '↑' : '↓'} )}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); }