import { useState, useEffect } from 'react'; import { Routes, Route, useParams, useLocation, useNavigate, Navigate } from 'react-router-dom'; import LakeDetail from './components/LakeDetail'; import LakesOverview from './components/LakesOverview'; import LakeMap from './components/LakeMap'; import FavoritesOverview from './components/FavoritesOverview'; import Sidebar from './components/Sidebar'; import Topbar from './components/Topbar'; import SettingsModal from './components/SettingsModal'; import { type Language, t } from './translations'; import { lakesConfig } from '../scripts/lakesConfig'; import { slugify } from './utils/slugify'; import './App.css'; const LakeDetailWrapper = ({ language, windUnit }: { language: Language, windUnit: 'kmh' | 'ms' }) => { const { slug } = useParams(); const lake = lakesConfig.find(l => slugify(l.text) === slug); if (!lake) return ; return ; }; function App() { const [language, setLanguage] = useState(() => { return (localStorage.getItem('hladinator_lang') as Language) || 'en'; }); const [theme, setTheme] = useState<'dark' | 'light'>(() => { return (localStorage.getItem('hladinator_theme') as 'dark' | 'light') || 'dark'; }); const [windUnit, setWindUnit] = useState<'kmh' | 'ms'>(() => { return (localStorage.getItem('hladinator_windUnit') as 'kmh' | 'ms') || 'kmh'; }); const [isSettingsOpen, setIsSettingsOpen] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); useEffect(() => { if (theme === 'light') { document.body.classList.add('light-mode'); } else { document.body.classList.remove('light-mode'); } localStorage.setItem('hladinator_theme', theme); // Clean up empty hash from URL (e.g. if the user clicked an empty anchor) if (window.location.href.endsWith('#')) { window.history.replaceState(null, '', window.location.href.slice(0, -1)); } }, [theme]); useEffect(() => { localStorage.setItem('hladinator_lang', language); }, [language]); useEffect(() => { localStorage.setItem('hladinator_windUnit', windUnit); }, [windUnit]); return (
{/* Mobile overlay */} {isMobileMenuOpen && (
setIsMobileMenuOpen(false)} >
)} setIsSettingsOpen(true)} isMobileMenuOpen={isMobileMenuOpen} onCloseMobileMenu={() => setIsMobileMenuOpen(false)} />
setIsMobileMenuOpen(!isMobileMenuOpen)} />
} /> } /> } /> } />
{t[language].chart.dataSources} pvl.cz, open-meteo.com {t[language].chart.createdIn}
{isSettingsOpen && ( setIsSettingsOpen(false)} /> )}
); } export default App;