Add setup and restore flow

This commit is contained in:
michael committed 2026-08-06 08:22:33 +02:00
1 parent 19e4621aeb
commit 72229cf14c
15 files changed
+511 -94

No files matched your search

+29 -1
View File
@@ -53,7 +53,7 @@ import {
import { usePreferencesStore } from "@/stores/preferences/preferences-provider";
import { cn } from "./lib/utils";
import { ApiError, getCurrentUser, logout, lookupTicket } from "./api";
import { ApiError, getCurrentUser, getSetupStatus, logout, lookupTicket } from "./api";
import { formatTimer } from "./format";
import { activeElapsedMs, pauseEntry, readStoredTimers, resumeEntry, storageKeyForUser, ticketPattern, type TimerEntry } from "./timers";
import { AdminUsersPage } from "./views/AdminUsersPage";
@@ -64,6 +64,7 @@ import { MonthlyClosePage } from "./views/MonthlyClosePage";
import { ProfilePage } from "./views/ProfilePage";
import { RecurringBillingsPage } from "./views/RecurringBillingsPage";
import { StatisticsPage } from "./views/StatisticsPage";
import { SetupPage } from "./views/SetupPage";
import { TicketDetailPage } from "./views/TicketDetailPage";
import { TimerPage } from "./views/TimerPage";
import type { AuthUser, PeriodType } from "./types";
@@ -345,6 +346,7 @@ export function App() {
const { path, route, navHandler, navigate } = useAppRouter();
const [currentUser, setCurrentUser] = useState<AuthUser | null>(null);
const [authLoading, setAuthLoading] = useState(true);
const [setupRequired, setSetupRequired] = useState(false);
const [timers, setTimers] = useState<TimerEntry[]>([]);
const [timersLoaded, setTimersLoaded] = useState(false);
const [timerOwnerId, setTimerOwnerId] = useState<string | null>(null);
@@ -354,6 +356,15 @@ export function App() {
useEffect(() => {
async function loadUser() {
try {
const setup = await getSetupStatus();
if (setup.required) {
setSetupRequired(true);
setCurrentUser(null);
return;
}
setSetupRequired(false);
const result = await getCurrentUser();
setCurrentUser(result.user);
} catch (error) {
@@ -554,6 +565,23 @@ export function App() {
);
}
if (setupRequired) {
return (
<SetupPage
onAdminCreated={(user) => {
setSetupRequired(false);
setCurrentUser(user);
navigate("/admin/users");
}}
onRestoreComplete={() => {
setSetupRequired(false);
setCurrentUser(null);
navigate("/");
}}
/>
);
}
if (!currentUser) {
return <LoginPage onLogin={setCurrentUser} />;
}