import { useEffect, type ReactElement } from 'react'; import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import { LandingPage } from './pages/LandingPage'; import { EditorPage } from './pages/EditorPage'; import { ExamplesPage } from './pages/ExamplesPage'; import { DocsPage } from './pages/DocsPage'; import { LoginPage } from './pages/LoginPage'; import { RegisterPage } from './pages/RegisterPage'; import { UserProfilePage } from './pages/UserProfilePage'; import { ProjectPage } from './pages/ProjectPage'; import { ProjectByIdPage } from './pages/ProjectByIdPage'; import { AdminPage } from './pages/AdminPage'; import { ExampleDetailPage } from './pages/ExampleDetailPage'; import { ArduinoSimulatorPage } from './pages/ArduinoSimulatorPage'; import { ArduinoEmulatorPage } from './pages/ArduinoEmulatorPage'; import { AtmegaSimulatorPage } from './pages/AtmegaSimulatorPage'; import { ArduinoMegaSimulatorPage } from './pages/ArduinoMegaSimulatorPage'; import { Attiny85SimulatorPage } from './pages/Attiny85SimulatorPage'; import { CircuitSimulatorPage } from './pages/CircuitSimulatorPage'; import { SpiceSimulatorPage } from './pages/SpiceSimulatorPage'; import { ElectronicsSimulatorPage } from './pages/ElectronicsSimulatorPage'; import { CustomChipSimulatorPage } from './pages/CustomChipSimulatorPage'; import { Esp32SimulatorPage } from './pages/Esp32SimulatorPage'; import { Esp32S3SimulatorPage } from './pages/Esp32S3SimulatorPage'; import { Esp32C3SimulatorPage } from './pages/Esp32C3SimulatorPage'; import { RaspberryPiPicoSimulatorPage } from './pages/RaspberryPiPicoSimulatorPage'; import { RaspberryPiSimulatorPage } from './pages/RaspberryPiSimulatorPage'; import { Velxio2Page } from './pages/Velxio2Page'; import { Velxio25Page } from './pages/Velxio25Page'; import { AboutPage } from './pages/AboutPage'; import { PricingPlaceholder } from './pages/PricingPlaceholder'; import { useAuthStore } from './store/useAuthStore'; import { LocaleSync } from './i18n/LocaleSync'; import { NON_DEFAULT_LOCALES } from './i18n/config'; import './App.css'; /** * Single source of truth for the route tree. Each entry is registered * twice in below: once at the root (default locale) and once * nested under each non-default locale prefix (e.g. `/es/editor`). * * Index entries (path === '') belong to the locale-prefixed parent's * `index` slot — they render at exactly `//`. */ const ROUTES: { path: string; element: ReactElement; index?: boolean }[] = [ { path: '/', element: , index: true }, { path: 'editor', element: }, { path: 'examples', element: }, { path: 'examples/:exampleId', element: }, { path: 'docs', element: }, { path: 'docs/:section', element: }, { path: 'login', element: }, { path: 'register', element: }, { path: 'admin', element: }, // SEO landing pages — keyword-targeted { path: 'circuit-simulator', element: }, { path: 'spice-simulator', element: }, { path: 'electronics-simulator', element: }, { path: 'custom-chip-simulator', element: }, { path: 'attiny85-simulator', element: }, { path: 'arduino-simulator', element: }, { path: 'arduino-emulator', element: }, { path: 'atmega328p-simulator', element: }, { path: 'arduino-mega-simulator', element: }, { path: 'esp32-simulator', element: }, { path: 'esp32-s3-simulator', element: }, { path: 'esp32-c3-simulator', element: }, { path: 'raspberry-pi-pico-simulator', element: }, { path: 'raspberry-pi-simulator', element: }, { path: 'v2', element: }, { path: 'v2-5', element: }, { path: 'about', element: }, // Pricing — placeholder by default; private overlays portal-inject the real page { path: 'pricing', element: }, // Canonical project URL by ID { path: 'project/:id', element: }, // Legacy slug route — redirects to /project/:id { path: ':username/:projectName', element: }, { path: ':username', element: }, ]; function App() { const checkSession = useAuthStore((s) => s.checkSession); useEffect(() => { checkSession(); }, []); return ( {/* Default locale (English) — no URL prefix. */} {ROUTES.map((r) => r.index ? ( ) : ( ) )} {/* Non-default locales — same routes nested under `//`. We register one branch per locale rather than a `:lang` param so React Router doesn't accidentally swallow real top-level paths like `/circuit-simulator` as a locale segment. */} {NON_DEFAULT_LOCALES.map((locale) => ( {ROUTES.map((r) => r.index ? ( ) : ( ) )} ))} ); } export default App;