import { BrowserRouter, Routes, Route } from "react-router-dom"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useProfile } from "./contexts/ProfileContext"; import AppShell from "./components/layout/AppShell"; import DashboardPage from "./pages/DashboardPage"; import ImportPage from "./pages/ImportPage"; import TransactionsPage from "./pages/TransactionsPage"; import CategoriesPage from "./pages/CategoriesPage"; import AdjustmentsPage from "./pages/AdjustmentsPage"; import BudgetPage from "./pages/BudgetPage"; import ReportsPage from "./pages/ReportsPage"; import ReportsHighlightsPage from "./pages/ReportsHighlightsPage"; import ReportsTrendsPage from "./pages/ReportsTrendsPage"; import ReportsComparePage from "./pages/ReportsComparePage"; import ReportsCategoryPage from "./pages/ReportsCategoryPage"; import ReportsCartesPage from "./pages/ReportsCartesPage"; import SettingsLayout from "./pages/settings/SettingsLayout"; import SettingsHomePage from "./pages/settings/SettingsHomePage"; import UsersSettingsPage from "./pages/settings/UsersSettingsPage"; import DataSettingsPage from "./pages/settings/DataSettingsPage"; import SystemsSettingsPage from "./pages/settings/SystemsSettingsPage"; import AccountsPage from "./pages/AccountsPage"; import BalancePage from "./pages/BalancePage"; import SnapshotEditPage from "./pages/SnapshotEditPage"; import CategoriesStandardGuidePage from "./pages/CategoriesStandardGuidePage"; import CategoriesMigrationPage from "./pages/CategoriesMigrationPage"; import DocsPage from "./pages/DocsPage"; import ChangelogPage from "./pages/ChangelogPage"; import ProfileSelectionPage from "./pages/ProfileSelectionPage"; import ErrorPage from "./components/shared/ErrorPage"; import RequireFeature from "./components/shared/RequireFeature"; import { startProfileConnection } from "./utils/startupConnection"; export default function App() { const { t } = useTranslation(); const { activeProfile, isLoading, refreshKey, connectActiveProfile } = useProfile(); const [dbReady, setDbReady] = useState(false); const [startupError, setStartupError] = useState(null); useEffect(() => { if (!activeProfile || isLoading) return; return startProfileConnection({ connect: connectActiveProfile, setDbReady, setStartupError, timeoutMessage: t("error.startupTimeout"), }); }, [activeProfile, isLoading, connectActiveProfile, t]); if (isLoading) { return (
); } if (startupError) { return ; } if (!activeProfile) { return ; } if (!dbReady) { return (
); } return ( }> } /> } /> } /> } /> {/* Gated routes (soft paywall): pathless layout-routes render RequireFeature's — one group per feature, mirroring the SettingsLayout convention. The /reports hub and /reports/trends stay Free and OUTSIDE any gate. */} }> } /> }> } /> } /> } /> }> } /> } /> } /> } /> }> } /> } /> } /> } /> }> } /> } /> } /> } /> } /> } /> } /> ); }