73 lines
2.7 KiB
JavaScript
73 lines
2.7 KiB
JavaScript
import { Routes, Route, Navigate, Outlet } from 'react-router-dom';
|
|
import { useAuth } from './auth/AuthContext.jsx';
|
|
import { useHouseholdContext } from './household/HouseholdContext.jsx';
|
|
import Login from './pages/Login.jsx';
|
|
import Register from './pages/Register.jsx';
|
|
import ForgotPassword from './pages/ForgotPassword.jsx';
|
|
import ResetPassword from './pages/ResetPassword.jsx';
|
|
import JoinInvite from './pages/JoinInvite.jsx';
|
|
import Onboarding from './pages/Onboarding.jsx';
|
|
import Dashboard from './pages/Dashboard.jsx';
|
|
import AddExpense from './pages/AddExpense.jsx';
|
|
import History from './pages/History.jsx';
|
|
import Settlements from './pages/Settlements.jsx';
|
|
import Stats from './pages/Stats.jsx';
|
|
import Settings from './pages/Settings.jsx';
|
|
import BottomNav from './components/BottomNav.jsx';
|
|
import OfflineBanner from './components/OfflineBanner.jsx';
|
|
import InstallBanner from './components/InstallBanner.jsx';
|
|
import SettingsButton from './components/SettingsButton.jsx';
|
|
|
|
function RequireAuth() {
|
|
const { isAuthenticated } = useAuth();
|
|
if (!isAuthenticated) return <Navigate to="/login" replace />;
|
|
return <Outlet />;
|
|
}
|
|
|
|
function RequireHousehold() {
|
|
const { households, householdsLoading } = useHouseholdContext();
|
|
if (householdsLoading) return <div className="page-loading">Ładowanie…</div>;
|
|
if (households.length === 0) return <Navigate to="/onboarding" replace />;
|
|
return <Outlet />;
|
|
}
|
|
|
|
function Layout() {
|
|
return (
|
|
<div className="app-shell">
|
|
<OfflineBanner />
|
|
<InstallBanner />
|
|
<SettingsButton />
|
|
<main className="app-content">
|
|
<Outlet />
|
|
</main>
|
|
<BottomNav />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default function App() {
|
|
return (
|
|
<Routes>
|
|
<Route path="/login" element={<Login />} />
|
|
<Route path="/register" element={<Register />} />
|
|
<Route path="/forgot-password" element={<ForgotPassword />} />
|
|
<Route path="/reset-password" element={<ResetPassword />} />
|
|
<Route path="/join/:code" element={<JoinInvite />} />
|
|
<Route element={<RequireAuth />}>
|
|
<Route path="/onboarding" element={<Onboarding />} />
|
|
<Route element={<RequireHousehold />}>
|
|
<Route element={<Layout />}>
|
|
<Route path="/" element={<Dashboard />} />
|
|
<Route path="/add" element={<AddExpense />} />
|
|
<Route path="/history" element={<History />} />
|
|
<Route path="/settlements" element={<Settlements />} />
|
|
<Route path="/stats" element={<Stats />} />
|
|
<Route path="/settings" element={<Settings />} />
|
|
</Route>
|
|
</Route>
|
|
</Route>
|
|
<Route path="*" element={<Navigate to="/" replace />} />
|
|
</Routes>
|
|
);
|
|
}
|