feat(07-02): register /setup route and add first-run redirect

- /setup route as protected standalone page (outside AppLayout)
- DashboardPage redirects first-run users to /setup via useFirstRunState
- All hooks called before conditional returns (React rules of hooks)
This commit is contained in:
2026-04-20 21:10:58 +02:00
parent 396d342d57
commit 6b75f14361
2 changed files with 15 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ import { useAuth } from "@/hooks/useAuth"
import AppLayout from "@/components/AppLayout" import AppLayout from "@/components/AppLayout"
import LoginPage from "@/pages/LoginPage" import LoginPage from "@/pages/LoginPage"
import RegisterPage from "@/pages/RegisterPage" import RegisterPage from "@/pages/RegisterPage"
import SetupPage from "@/pages/SetupPage"
import DashboardPage from "@/pages/DashboardPage" import DashboardPage from "@/pages/DashboardPage"
import CategoriesPage from "@/pages/CategoriesPage" import CategoriesPage from "@/pages/CategoriesPage"
import TemplatePage from "@/pages/TemplatePage" import TemplatePage from "@/pages/TemplatePage"
@@ -44,6 +45,14 @@ export default function App() {
</PublicRoute> </PublicRoute>
} }
/> />
<Route
path="/setup"
element={
<ProtectedRoute>
<SetupPage />
</ProtectedRoute>
}
/>
<Route <Route
element={ element={
<ProtectedRoute> <ProtectedRoute>

View File

@@ -1,5 +1,7 @@
import { useState, useMemo } from "react" import { useState, useMemo } from "react"
import { Navigate } from "react-router-dom"
import { useTranslation } from "react-i18next" import { useTranslation } from "react-i18next"
import { useFirstRunState } from "@/hooks/useFirstRunState"
import { useBudgets, useBudgetDetail } from "@/hooks/useBudgets" import { useBudgets, useBudgetDetail } from "@/hooks/useBudgets"
import { useMonthParam } from "@/hooks/useMonthParam" import { useMonthParam } from "@/hooks/useMonthParam"
import type { CategoryType } from "@/lib/types" import type { CategoryType } from "@/lib/types"
@@ -271,6 +273,7 @@ function DashboardContent({ budgetId }: { budgetId: string }) {
export default function DashboardPage() { export default function DashboardPage() {
const { t } = useTranslation() const { t } = useTranslation()
const { isFirstRun, loading: firstRunLoading } = useFirstRunState()
const { month } = useMonthParam() const { month } = useMonthParam()
const { budgets, loading, createBudget, generateFromTemplate } = useBudgets() const { budgets, loading, createBudget, generateFromTemplate } = useBudgets()
@@ -286,6 +289,9 @@ export default function DashboardPage() {
const [parsedYear, parsedMonth] = month.split("-").map(Number) const [parsedYear, parsedMonth] = month.split("-").map(Number)
if (firstRunLoading) return <DashboardSkeleton />
if (isFirstRun) return <Navigate to="/setup" replace />
return ( return (
<PageShell <PageShell
title={t("dashboard.title")} title={t("dashboard.title")}