mirror of
https://github.com/Zproger/Aurum.git
synced 2026-10-14 03:26:40 +07:00
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.
This commit is contained in:
62
frontend/src/App.tsx
Normal file
62
frontend/src/App.tsx
Normal file
@@ -0,0 +1,62 @@
|
||||
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>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user