/apiaries: Liste mit Status-Badge; /apiaries/new: Anlegen-Formular;
/apiaries/[id]: Bearbeiten (Name/Standort/Adresse/Notizen) + Deaktivieren.
Editierbares Formular liest den Ausgangszustand direkt aus der geladenen
Apiary (kein useEffect+setState-Sync, React-Key-Reset-Pattern statt
Effect - vermeidet kaskadierende Renders).
(app)/layout.tsx: einfache Nav-Leiste (Bienenstände fuer alle, Benutzer
nur fuer Admins) - Platzhalter bis zur echten Bottom-Nav/Sidebar aus
Modul 15. proxy.ts-Matcher um /apiaries/* erweitert.
Live im Browser gefunden+behoben: Base-UI-Button meldete fehlende
native Button-Semantik beim Rendern als Link (`nativeButton={false}`
noetig, wenn Button auf ein <a> zeigt).
8 Vitest-Tests, Lint, Typecheck und Build gruen. Kompletter Flow
(Anlegen, Liste, Bearbeiten, Deaktivieren, Navigation) live verifiziert.
27 lines
674 B
TypeScript
27 lines
674 B
TypeScript
import { NextResponse } from "next/server";
|
|
import type { NextRequest } from "next/server";
|
|
|
|
const SESSION_COOKIE = "refreshToken";
|
|
|
|
export function proxy(request: NextRequest) {
|
|
const hasSession = request.cookies.has(SESSION_COOKIE);
|
|
const { pathname } = request.nextUrl;
|
|
|
|
if (pathname.startsWith("/login")) {
|
|
if (hasSession) {
|
|
return NextResponse.redirect(new URL("/settings/users", request.url));
|
|
}
|
|
return NextResponse.next();
|
|
}
|
|
|
|
if (!hasSession) {
|
|
return NextResponse.redirect(new URL("/login", request.url));
|
|
}
|
|
|
|
return NextResponse.next();
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/login", "/settings/:path*", "/apiaries/:path*"],
|
|
};
|