import React, { useState, useCallback } from 'react';
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, LineChart, Line, Area, AreaChart } from 'recharts';
import { Upload, Music, TrendingUp, Users, Heart, Calendar, PlayCircle, FileText, Download, AlertCircle } from 'lucide-react';
const CSVAnalyticsDashboard = () => {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');
const [fileName, setFileName] = useState('');
const [showDashboard, setShowDashboard] = useState(false);
const handleFileUpload = useCallback((event) => {
const file = event.target.files[0];
if (!file) return;
if (!file.name.endsWith('.csv')) {
setError('Please upload a CSV file');
return;
}
setLoading(true);
setError('');
setFileName(file.name);
const reader = new FileReader();
reader.onload = async (e) => {
try {
const csvContent = e.target.result;
const Papa = await import('papaparse');
const parsedData = Papa.parse(csvContent, {
header: true,
dynamicTyping: true,
skipEmptyLines: true
});
if (parsedData.errors.length > 0) {
setError('Error parsing CSV file');
setLoading(false);
return;
}
// Validate required columns for music data
const requiredColumns = ['song', 'streams'];
const columns = parsedData.meta.fields;
const hasRequiredColumns = requiredColumns.every(col => columns.includes(col));
if (!hasRequiredColumns) {
setError('CSV must contain at least "song" and "streams" columns');
setLoading(false);
return;
}
setData(parsedData.data.filter(row => row.song && row.streams));
setShowDashboard(true);
} catch (err) {
setError('Failed to process file');
} finally {
setLoading(false);
}
};
reader.readAsText(file);
}, []);
const resetUpload = () => {
setData([]);
setShowDashboard(false);
setFileName('');
setError('');
};
if (showDashboard && data.length > 0) {
return
Upload your CSV file and get instant music statistics
Your CSV should contain columns: song, streams, and optionally listeners, saves, release_date
{loading ? 'Processing...' : 'Click to upload or drag and drop'}
CSV files only
Data from: {fileName}
| Song | Streams | {data.some(song => song.listeners) && (Listeners | )} {data.some(song => song.saves) && (Saves | )} {data.some(song => song.release_date) && (Release Date | )}
|---|---|---|---|---|
| {song.song} | {formatNumber(song.streams || 0)} | {data.some(s => s.listeners) && ({formatNumber(song.listeners || 0)} | )} {data.some(s => s.saves) && ({formatNumber(song.saves || 0)} | )} {data.some(s => s.release_date) && ({song.release_date ? new Date(song.release_date).toLocaleDateString('en-US') : 'Unknown'} | )}
{title}
{value}