import { notFound, redirect } from 'next/navigation'; import { Container, Badge, Heading } from '@/components/ui'; import { getTranslations, setRequestLocale } from 'next-intl/server'; import { Metadata } from 'next'; import { getPageBySlug } from '@/lib/pages'; import { mapSlugToFileSlug, mapFileSlugToTranslated } from '@/lib/slugs'; import { MDXRemote } from 'next-mdx-remote/rsc'; import { SITE_URL } from '@/lib/schema'; import TrackedLink from '@/components/analytics/TrackedLink'; import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; // Import components used in MDX import { HeroVideo as HomeHero } from '@/components/blocks/HeroVideo'; import { SubCompanyTiles as HomeSubCompanyTiles } from '@/components/blocks/SubCompanyTiles'; import { CompetenceBentoGrid as HomeCompetenceBentoGrid } from '@/components/blocks/CompetenceBentoGrid'; import { ReferencesSlider as HomeReferencesSlider } from '@/components/blocks/ReferencesSlider'; import { CompanyTimeline } from '@/components/blocks/CompanyTimeline'; import { JobListingBlock } from '@/components/blocks/JobListingBlock'; import { CallToAction } from '@/components/blocks/CallToAction'; import { ServiceDetailGrid } from '@/components/blocks/ServiceDetailGrid'; import { Button } from '@/components/ui/Button'; const mdxComponents = { HomeHero, HomeSubCompanyTiles, HomeCompetenceBentoGrid, HomeReferencesSlider, CompanyTimeline, JobListingBlock, CallToAction, ServiceDetailGrid, Button, Heading, }; interface PageProps { params: Promise<{ locale: string; slug: string; }>; } export async function generateMetadata({ params }: PageProps): Promise { const { locale, slug } = await params; // Guard against invalid locales if (locale !== 'de' && locale !== 'en') return {}; const pageData = await getPageBySlug(slug, locale); if (!pageData) return {}; const fileSlug = await mapSlugToFileSlug(pageData.slug || slug, locale); const deSlug = await mapFileSlugToTranslated(fileSlug, 'de'); const enSlug = await mapFileSlugToTranslated(fileSlug, 'en'); // Determine correct localized slug based on current locale const currentLocaleSlug = locale === 'de' ? deSlug : enSlug; return { title: pageData.frontmatter.title, description: pageData.frontmatter.excerpt || '', alternates: { canonical: `${SITE_URL}/${locale}/${currentLocaleSlug}`, languages: { de: `${SITE_URL}/de/${deSlug}`, en: `${SITE_URL}/en/${enSlug}`, 'x-default': `${SITE_URL}/en/${enSlug}`, }, }, openGraph: { title: `${pageData.frontmatter.title} | E-TIB`, description: pageData.frontmatter.excerpt || '', url: `${SITE_URL}/${locale}/${currentLocaleSlug}`, }, twitter: { card: 'summary_large_image', title: `${pageData.frontmatter.title} | E-TIB`, description: pageData.frontmatter.excerpt || '', }, }; } export default async function Page(props: { params: Promise<{ locale: string; slug: string }> }) { const { locale, slug } = await props.params; // Guard against invalid locales (e.g. favicon.ico) hitting the DB if (locale !== 'de' && locale !== 'en') { notFound(); } setRequestLocale(locale); const pageData = await getPageBySlug(slug, locale); const t = await getTranslations('StandardPage'); if (!pageData) { notFound(); } // Redirect logic removed to simplify for now, as slugs match file names /* const fileSlug = await mapSlugToFileSlug(pageData.slug || slug, locale); const correctSlug = await mapFileSlugToTranslated(fileSlug, locale); if (correctSlug && correctSlug !== slug) { redirect(`/${locale}/${correctSlug}`); } */ // Full-bleed pages render blocks edge-to-edge without the generic article wrapper if (pageData.frontmatter.layout === 'fullBleed') { return (
); } // Default article layout with hero, content, and support CTA return (
{/* Hero Section */}
{t('badge')} {pageData.frontmatter.title}
{/* Main Content Area */}
{/* Excerpt/Lead paragraph if available */} {pageData.frontmatter.excerpt && (

{pageData.frontmatter.excerpt}

)} {/* Main content */}
{/* Support Section */}

{t('needHelp')}

{t('supportTeamAvailable')}

{t('contactUs')}
); }