mirror of
https://github.com/Zproger/Aurum.git
synced 2026-10-13 19:16:40 +07:00
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.
63 lines
2.8 KiB
TypeScript
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>
|
|
);
|
|
}
|