feat: add backup recovery, setup wizard and user-view guards
Magent CI/CD / verify (push) Successful in 5m20s
Magent CI/CD / deploy-beta (push) Successful in 1m41s

This commit is contained in:
2026-09-18 17:23:03 +12:00
parent a6a4a9aa24
commit fd6671cf7e
44 changed files with 4650 additions and 114 deletions
+9 -7
View File
@@ -1,16 +1,16 @@
"use client";
import PageHeading from "./ui/PageHeading";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
import { authFetch, getApiBase, getToken, clearToken, getEventStreamToken } from "./lib/auth";
import { authFetch, clearToken, getApiBase, getEventStreamToken, getToken } from "./lib/auth";
import {
normalizeRecentResults,
normalizeSearchResults,
type RecentRequest,
type RequestSearchResult,
} from "./lib/request-results";
import { useEffectiveRole } from "./lib/viewMode";
import PageHeading from "./ui/PageHeading";
import RequestStageFilter, { type RequestStage } from "./ui/RequestStageFilter";
export default function HomePage() {
@@ -22,6 +22,8 @@ export default function HomePage() {
const [searchResults, setSearchResults] = useState<RequestSearchResult[]>([]);
const [searchError, setSearchError] = useState<string | null>(null);
const [role, setRole] = useState<string | null>(null);
const effectiveRole = useEffectiveRole(role);
const isAdmin = effectiveRole === "admin";
const [recentDays, setRecentDays] = useState(90);
const [recentStage, setRecentStage] = useState<RequestStage>("all");
const [authReady, setAuthReady] = useState(false);
@@ -62,7 +64,7 @@ export default function HomePage() {
const userRole = me?.role ?? null;
setRole(userRole);
setAuthReady(true);
const take = userRole === "admin" ? 50 : 6;
const take = isAdmin ? 50 : 6;
const params = new URLSearchParams({
take: String(take),
days: String(recentDays),
@@ -96,7 +98,7 @@ export default function HomePage() {
return () => {
cancelled = true;
};
}, [recentDays, recentStage, router]);
}, [isAdmin, recentDays, recentStage, router]);
useEffect(() => {
if (!authReady) {
@@ -305,7 +307,7 @@ export default function HomePage() {
<div className="recent-header home-section-heading">
<div>
<span className="section-kicker">Request activity</span>
<h2>{role === "admin" ? "Recent requests" : "My recent requests"}</h2>
<h2>{isAdmin ? "Recent requests" : "My recent requests"}</h2>
</div>
{authReady && (
<div className="recent-filter-group">
@@ -337,7 +339,7 @@ export default function HomePage() {
<span>Try a wider period or a different stage.</span>
</div>
) : (
recent.map((item) => (
(isAdmin ? recent : recent.slice(0, 6)).map((item) => (
<button
key={item.id}
type="button"