fix: wrap login page in Suspense (useSearchParams prerender crash)
- /login page used useSearchParams() without Suspense boundary - Next.js 16 requires Suspense for useSearchParams during static prerender - Extracted LoginForm component, wrapped in <Suspense> - Removed --webpack flag (default Turbopack build now works) - Build passes cleanly: ✓ Compiled successfully
This commit is contained in:
1 parent
576a85cd50
commit
ece8626137
2 files changed
+23
-15
No files matched your search
+1
-1
@@ -9,7 +9,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev -p 3000",
|
"dev": "next dev -p 3000",
|
||||||
"dev:log": "next dev -p 3000 2>&1 | tee dev.log",
|
"dev:log": "next dev -p 3000 2>&1 | tee dev.log",
|
||||||
"build": "prisma generate && next build --webpack && cp -r .next/static .next/standalone/.next/ && cp -r public .next/standalone/",
|
"build": "prisma generate && next build && cp -r .next/static .next/standalone/.next/ && cp -r public .next/standalone/",
|
||||||
"start": "NODE_ENV=production bun .next/standalone/server.js 2>&1 | tee server.log",
|
"start": "NODE_ENV=production bun .next/standalone/server.js 2>&1 | tee server.log",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"db:push": "prisma db push --accept-data-loss",
|
"db:push": "prisma db push --accept-data-loss",
|
||||||
|
|||||||
+22
-14
@@ -1,13 +1,13 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useState } from 'react'
|
import { Suspense, useState } from 'react'
|
||||||
import { useRouter, useSearchParams } from 'next/navigation'
|
import { useRouter, useSearchParams } from 'next/navigation'
|
||||||
import { Button } from '@/components/ui/button'
|
import { Button } from '@/components/ui/button'
|
||||||
import { Input } from '@/components/ui/input'
|
import { Input } from '@/components/ui/input'
|
||||||
import { Label } from '@/components/ui/label'
|
import { Label } from '@/components/ui/label'
|
||||||
import { Loader2, Lock } from 'lucide-react'
|
import { Loader2, Lock } from 'lucide-react'
|
||||||
|
|
||||||
export default function LoginPage() {
|
function LoginForm() {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const searchParams = useSearchParams()
|
const searchParams = useSearchParams()
|
||||||
const redirect = searchParams.get('redirect') || '/'
|
const redirect = searchParams.get('redirect') || '/'
|
||||||
@@ -41,18 +41,6 @@ export default function LoginPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex min-h-screen items-center justify-center bg-background p-4">
|
|
||||||
<div className="w-full max-w-sm space-y-6">
|
|
||||||
<div className="text-center space-y-2">
|
|
||||||
<div className="mx-auto flex size-14 items-center justify-center rounded-xl bg-foreground text-background">
|
|
||||||
<Lock className="size-7" />
|
|
||||||
</div>
|
|
||||||
<h1 className="text-2xl font-semibold tracking-tight">AOS Login</h1>
|
|
||||||
<p className="text-sm text-muted-foreground">
|
|
||||||
Agency Operating System — dfmpanel.eu
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form onSubmit={handleSubmit} className="space-y-4">
|
<form onSubmit={handleSubmit} className="space-y-4">
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label htmlFor="password">Passwort</Label>
|
<Label htmlFor="password">Passwort</Label>
|
||||||
@@ -74,6 +62,26 @@ export default function LoginPage() {
|
|||||||
Anmelden
|
Anmelden
|
||||||
</Button>
|
</Button>
|
||||||
</form>
|
</form>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function LoginPage() {
|
||||||
|
return (
|
||||||
|
<div className="flex min-h-screen items-center justify-center bg-background p-4">
|
||||||
|
<div className="w-full max-w-sm space-y-6">
|
||||||
|
<div className="text-center space-y-2">
|
||||||
|
<div className="mx-auto flex size-14 items-center justify-center rounded-xl bg-foreground text-background">
|
||||||
|
<Lock className="size-7" />
|
||||||
|
</div>
|
||||||
|
<h1 className="text-2xl font-semibold tracking-tight">AOS Login</h1>
|
||||||
|
<p className="text-sm text-muted-foreground">
|
||||||
|
Agency Operating System — dfmpanel.eu
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Suspense fallback={<div className="text-center text-sm text-muted-foreground">Laden…</div>}>
|
||||||
|
<LoginForm />
|
||||||
|
</Suspense>
|
||||||
|
|
||||||
<p className="text-center text-xs text-muted-foreground">
|
<p className="text-center text-xs text-muted-foreground">
|
||||||
Geschützter Bereich — nur für autorisierte Benutzer.
|
Geschützter Bereich — nur für autorisierte Benutzer.
|
||||||
|
|||||||
Reference in new issue
Block a user