import RefreshIcon from "@mui/icons-material/Refresh"; import { Box, Button, Container, GlobalStyles, Slider, Theme, ThemeProvider, createTheme } from "@mui/material"; import { useEffect, useState } from "react"; import useStyles from "./App.styles"; import ChartSkeleton from "./Components/ChartSkeleton"; import TrackChart from "./Components/TrackChart"; import IPoint from "./Data/IPoint"; import ITrack from "./Data/ITrack"; import LoadMockData from "./Data/LoadMockData"; const theme: Theme = createTheme(); /** * The main application component. */ function App(): JSX.Element { const [data, setData] = useState<{ tracks: ITrack[], points: IPoint[]; }>({ tracks: [], points: [] }); const [isLoading, setLoading] = useState(true); const [zoom, setZoom] = useState([0, 1]); const sx = useStyles(); const loadData = () => { setLoading(true); console.log("Loading data..."); const newData = LoadMockData(true); setData(newData); setZoom([0, Math.min(newData.tracks.length + 1, 20)]); new Promise(resolve => setTimeout(resolve, 1000)) .then(() => setLoading(false)) .catch(console.error); }; useEffect(() => { loadData(); }, []); const handleZoomChange = (_: unknown, newValue: number | number[]) => { const value: number[] = newValue as number[]; if ((value[0] === zoom[0] && value[1] === zoom[1]) || value[1] - value[0] < 2) return; if (value[1] - value[0] > 50) setLoading(true); setZoom(value); }; return ( setLoading(false) } /> { !isLoading && } { isLoading && } ); } export default App;