import React, { useState, useEffect, useRef, useCallback, Suspense, Component } from 'react'; import { Container, Box, Tabs, Tab, Typography, Paper, Button, IconButton, TextField, Alert, CircularProgress, Grid, Card, CardContent, Chip, Divider, Dialog, DialogTitle, DialogContent, DialogActions, LinearProgress, Slider, FormControl, InputLabel, Select, MenuItem, Accordion, AccordionSummary, AccordionDetails, List, ListItem, ListItemText, ThemeProvider, createTheme, Backdrop, Fade, Checkbox, FormControlLabel, Snackbar } from '@mui/material'; import { Add as AddIcon, Delete as DeleteIcon, Upload as UploadIcon, PlayArrow as PlayIcon, Stop as StopIcon, Download as DownloadIcon, Refresh as RefreshIcon, ExpandMore as ExpandMoreIcon, CloudDownload as CloudDownloadIcon, Close as CloseIcon, Info as InfoIcon, MenuBook as MenuBookIcon, Settings as SettingsIcon, FolderOpen as FolderOpenIcon } from '@mui/icons-material'; import { useDropzone } from 'react-dropzone'; import ReactPlayer from './react-player-config'; import axios from 'axios'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'; class AudioPlayerErrorBoundary extends Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError() { return { hasError: true }; } componentDidCatch(error, info) { console.warn('ReactPlayer failed to load, using native audio:', error); } render() { if (this.state.hasError) { return this.props.audioUrl ?