import React, { useState } from 'react'; import Papa from 'papaparse'; import { ResponsiveContainer, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend } from 'recharts'; const CustomMetricExplorer = () => { const [csvData, setCsvData] = useState([]); const [formula, setFormula] = useState('((HR + BB) / PA) * 100'); const [metricName, setMetricName] = useState('Custom Stat'); const [parsedData, setParsedData] = useState([]); const [error, setError] = useState(''); const parseCSV = async (file) => { Papa.parse(file, { header: true, dynamicTyping: true, complete: (results) => { setCsvData(results.data); calculateMetric(results.data); }, error: (err) => setError(`CSV parsing failed: ${err.message}`) }); }; const calculateMetric = (data) => { try { const calculated = data.map(player => { const formulaFn = new Function( ...Object.keys(player), `return ${formula}` ); const metricValue = formulaFn(...Object.values(player)); return { ...player, [metricName]: Number.isFinite(metricValue) ? metricValue.toFixed(2) : 0 }; }); setParsedData(calculated); setError(''); } catch (e) { setError(`Invalid formula: ${e.message}`); setParsedData([]); } }; return (

🧮 Custom Metric Explorer

e.target.files?.[0] && parseCSV(e.target.files[0])} className="block w-full border p-2 rounded" /> setMetricName(e.target.value)} className="w-full border p-2 rounded" /> setFormula(e.target.value)} className="w-full border p-2 rounded" />
{error &&
{error}
} {parsedData.length > 0 && (
{parsedData.map((player, idx) => ( ))}
Name POS {metricName}
{player.Name} {player.POS} {player[metricName]}
)} {parsedData.length > 0 && (

Visualize Metric

)}
); }; export default CustomMetricExplorer;