Files
aurum/frontend/src/App.tsx
ZProger fe9b079c12 Initial public release
Aurum — a self-hosted personal finance operating system: cash flow,
net worth tracking, budgets, goals, recurring payments, reports,
proactive alerts, and a compound-interest returns calculator, all
bilingual (RU/EN) and mobile-first. Ships as a three-container Docker
Compose stack (Postgres + FastAPI + nginx-served React frontend).

See README.md for setup and CONTRIBUTING.md for development.
2026-08-16 18:39:52 +03:00

63 lines
2.8 KiB
TypeScript

import { useEffect, useState } from "react";
import { Route, Routes } from "react-router-dom";
import { Sidebar } from "@/components/layout/Sidebar";
import { Topbar } from "@/components/layout/Topbar";
import { useLocalStorageState } from "@/hooks/useLocalStorageState";
import { useAppSettings } from "@/hooks/useSettings";
import { setCurrency } from "@/lib/i18n";
import { AccountsPage } from "@/pages/AccountsPage";
import { AdvicePage } from "@/pages/AdvicePage";
import { BudgetPage } from "@/pages/BudgetPage";
import { CashFlowPage } from "@/pages/CashFlowPage";
import { DashboardPage } from "@/pages/DashboardPage";
import { GoalsPage } from "@/pages/GoalsPage";
import { NetWorthPage } from "@/pages/NetWorthPage";
import { RecurringPage } from "@/pages/RecurringPage";
import { ReportsPage } from "@/pages/ReportsPage";
import { RoiPage } from "@/pages/RoiPage";
import { SettingsPage } from "@/pages/SettingsPage";
import { TransactionsPage } from "@/pages/TransactionsPage";
export default function App() {
const [collapsed, setCollapsed] = useLocalStorageState("aurum:sidebar-collapsed", false);
const [mobileNavOpen, setMobileNavOpen] = useState(false);
// Primary currency is server-persisted, unlike language — sync the
// client-side reactive mirror (lib/i18n's getCurrency/formatCurrency)
// once the setting loads, so it's not stuck on the "USD" fallback default.
const { data: settings } = useAppSettings();
useEffect(() => {
if (settings) setCurrency(settings.currency);
}, [settings]);
return (
<div className="flex min-h-screen bg-surface-0">
<Sidebar
collapsed={collapsed}
onToggleCollapsed={() => setCollapsed(!collapsed)}
mobileOpen={mobileNavOpen}
onCloseMobile={() => setMobileNavOpen(false)}
/>
<div className="flex min-w-0 flex-1 flex-col">
<Topbar onOpenMobileNav={() => setMobileNavOpen(true)} />
<main className="mx-auto w-full max-w-6xl px-4 py-5 sm:px-6 sm:py-6 lg:px-8">
<Routes>
<Route path="/" element={<DashboardPage />} />
<Route path="/net-worth" element={<NetWorthPage />} />
<Route path="/roi" element={<RoiPage />} />
<Route path="/accounts" element={<AccountsPage />} />
<Route path="/cash-flow" element={<CashFlowPage />} />
<Route path="/transactions" element={<TransactionsPage />} />
<Route path="/reports" element={<ReportsPage />} />
<Route path="/budget" element={<BudgetPage />} />
<Route path="/advice" element={<AdvicePage />} />
<Route path="/goals" element={<GoalsPage />} />
<Route path="/recurring" element={<RecurringPage />} />
<Route path="/settings" element={<SettingsPage />} />
</Routes>
</main>
</div>
</div>
);
}