feat: manage generic page fallback copy via payload

This commit is contained in:
syntaxbullet
2026-06-22 13:00:02 +02:00
parent b4b4820e46
commit 9cf23552cc
9 changed files with 101 additions and 7 deletions

View File

@@ -6,6 +6,7 @@ import Layout from '@/spa/components/layout/Layout'
import ScrollToTop from '@/spa/components/layout/ScrollToTop'
import { defaultHeaderData, type SpaFooterData, type SpaHeaderData } from '@/spa/cmsNavigation'
import { CmsRouteProvider, type CmsRouteData } from '@/spa/cmsRoute'
import type { SpaSiteSettingsData } from '@/spa/siteSettings'
import About from '@/spa/pages/About'
import BlogDetail from '@/spa/pages/BlogDetail'
import Contact from '@/spa/pages/Contact'
@@ -58,11 +59,13 @@ export default function NextApp({
header,
footer,
cmsRoute,
siteSettings,
}: {
pathname: string
header?: SpaHeaderData
footer?: SpaFooterData
cmsRoute?: CmsRouteData
siteSettings?: SpaSiteSettingsData
}) {
const [loading, setLoading] = useState(true)
const headerData = header || defaultHeaderData
@@ -92,7 +95,7 @@ export default function NextApp({
return (
<>
<CmsRouteProvider value={cmsRoute}>
<CmsRouteProvider value={cmsRoute ? { ...cmsRoute, siteSettings } : undefined}>
<ScrollToTop />
<Layout header={header} footer={footer}>
{page}

View File

@@ -2,6 +2,8 @@
import React, { createContext, useContext } from 'react'
import type { SpaSiteSettingsData } from '@/spa/siteSettings'
export type CmsRouteCollection = 'pages' | 'posts' | 'events' | 'preistraeger'
export type CmsRouteDoc = {
@@ -21,6 +23,7 @@ export type CmsRouteData = {
collection: CmsRouteCollection
doc: CmsRouteDoc
lists?: Partial<Record<CmsRouteCollection, CmsRouteDoc[]>>
siteSettings?: SpaSiteSettingsData
}
const CmsRouteContext = createContext<CmsRouteData | undefined>(undefined)

View File

@@ -3,6 +3,7 @@
import React from 'react'
import { useCmsRoute } from '@/spa/cmsRoute'
import { defaultSiteSettings } from '@/spa/siteSettings'
const NAVY = '#111D55'
const GOLD = '#EFBF04'
@@ -13,14 +14,15 @@ const FB = '"Inter", sans-serif'
export default function CmsGenericPage() {
const route = useCmsRoute()
const doc = route?.doc
const title = doc?.title || doc?.meta?.title || 'Seite'
const siteSettings = route?.siteSettings || defaultSiteSettings
const title = doc?.title || doc?.meta?.title || siteSettings.genericPageTitle
const description = doc?.description || doc?.meta?.description
return (
<main style={{ minHeight: '70vh', background: CREAM, padding: '140px 24px 80px' }}>
<div style={{ maxWidth: 960, margin: '0 auto' }}>
<div style={{ color: GOLD, fontFamily: FF, fontWeight: 800, fontSize: 12, letterSpacing: '0.18em', textTransform: 'uppercase', marginBottom: 20 }}>
{route?.collection || 'CMS'}
{route?.collection || siteSettings.genericPageKicker}
</div>
<h1 style={{ color: NAVY, fontFamily: FF, fontSize: 'clamp(2.25rem, 7vw, 5rem)', lineHeight: 1, fontWeight: 900, textTransform: 'uppercase', margin: 0 }}>
{title}
@@ -31,7 +33,7 @@ export default function CmsGenericPage() {
</p>
) : (
<p style={{ color: 'rgba(58,58,58,0.65)', fontFamily: FB, fontSize: 18, lineHeight: 1.7, marginTop: 28, maxWidth: 760 }}>
Diese Route wird aus Payload CMS geladen. Ergänze Inhalte im entsprechenden Collection-Dokument.
{siteSettings.genericPageDescription}
</p>
)}
</div>

18
src/spa/siteSettings.ts Normal file
View File

@@ -0,0 +1,18 @@
export type SpaSiteSettingsData = {
genericPageKicker: string
genericPageTitle: string
genericPageDescription: string
}
export const defaultSiteSettings: SpaSiteSettingsData = {
genericPageKicker: 'CMS',
genericPageTitle: 'Seite',
genericPageDescription: 'Diese Route wird aus Payload CMS geladen. Ergänze Inhalte im entsprechenden Collection-Dokument.',
}
export function normalizeSiteSettings(settings?: Partial<SpaSiteSettingsData> | null): SpaSiteSettingsData {
return {
...defaultSiteSettings,
...settings,
}
}