2026-04-23 01:08:18 +08:00
|
|
|
import configPromise from '@payload-config'
|
|
|
|
|
import { RootPage, generatePageMetadata } from '@payloadcms/next/views'
|
2026-04-28 09:16:15 +08:00
|
|
|
import { headers as getHeaders } from 'next/headers'
|
2026-05-11 14:19:29 +08:00
|
|
|
import { notFound, redirect } from 'next/navigation'
|
2026-04-28 09:16:15 +08:00
|
|
|
import { executeAuthStrategies, getPayload } from 'payload'
|
2026-04-23 01:08:18 +08:00
|
|
|
// @ts-expect-error generated by Payload admin import map generator
|
|
|
|
|
import { importMap } from '../importMap.js'
|
|
|
|
|
import { AdminHome } from '../_components/admin-home'
|
2026-04-28 09:16:15 +08:00
|
|
|
import { AdminLoginForm } from '../_components/admin-login-form'
|
2026-04-23 01:08:18 +08:00
|
|
|
|
|
|
|
|
type AdminPageProps = {
|
|
|
|
|
params: Promise<{ segments?: string[] }>
|
|
|
|
|
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-11 14:19:29 +08:00
|
|
|
async function getAdminSegments(params: AdminPageProps['params']) {
|
|
|
|
|
const value = await params
|
|
|
|
|
return Array.isArray(value.segments) ? value.segments.filter(Boolean) : []
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-28 09:16:15 +08:00
|
|
|
async function getAdminUser() {
|
|
|
|
|
const [config, headers] = await Promise.all([configPromise, getHeaders()])
|
|
|
|
|
const payload = await getPayload({
|
|
|
|
|
config,
|
|
|
|
|
importMap,
|
|
|
|
|
})
|
|
|
|
|
const { user } = await executeAuthStrategies({
|
|
|
|
|
headers,
|
|
|
|
|
payload,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return user
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-23 01:08:18 +08:00
|
|
|
export async function generateMetadata({ params, searchParams }: AdminPageProps) {
|
2026-05-11 14:19:29 +08:00
|
|
|
const segments = await getAdminSegments(params)
|
|
|
|
|
|
|
|
|
|
if (segments[0] === 'forgot') notFound()
|
|
|
|
|
|
2026-04-23 01:08:18 +08:00
|
|
|
return generatePageMetadata({
|
|
|
|
|
config: configPromise,
|
2026-05-11 14:19:29 +08:00
|
|
|
params: Promise.resolve({ segments }),
|
2026-04-23 01:08:18 +08:00
|
|
|
searchParams: searchParams as Promise<{ [key: string]: string | string[] }>,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default async function PayloadAdminPage({ params, searchParams }: AdminPageProps) {
|
2026-05-11 14:19:29 +08:00
|
|
|
const segments = await getAdminSegments(params)
|
2026-04-23 01:08:18 +08:00
|
|
|
const resolvedSearchParams = await searchParams
|
|
|
|
|
|
2026-05-11 14:19:29 +08:00
|
|
|
if (segments[0] === 'forgot') notFound()
|
|
|
|
|
|
2026-04-28 09:16:15 +08:00
|
|
|
if (segments.length === 1 && segments[0] === 'login') {
|
|
|
|
|
if (await getAdminUser()) redirect('/admin')
|
|
|
|
|
|
|
|
|
|
return <AdminLoginForm />
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-23 01:08:18 +08:00
|
|
|
if (segments.length === 0) {
|
2026-05-11 14:19:29 +08:00
|
|
|
const user = await getAdminUser()
|
|
|
|
|
if (!user) redirect('/admin/login?redirect=/admin')
|
2026-04-28 09:16:15 +08:00
|
|
|
|
2026-05-11 14:19:29 +08:00
|
|
|
return <AdminHome cacheCleared={resolvedSearchParams.cache === 'cleared'} user={user} />
|
2026-04-23 01:08:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return RootPage({
|
|
|
|
|
config: configPromise,
|
|
|
|
|
importMap,
|
|
|
|
|
params: Promise.resolve({ segments }),
|
|
|
|
|
searchParams: Promise.resolve(resolvedSearchParams as { [key: string]: string | string[] }),
|
|
|
|
|
})
|
|
|
|
|
}
|