Files
biblical-guide.com/app/[locale]/layout.tsx
Andrei 95070e5369 Add comprehensive page management system to admin dashboard
Features added:
- Database schema for pages and media files with content types (Rich Text, HTML, Markdown)
- Admin API routes for full page CRUD operations
- Image upload functionality with file management
- Rich text editor using TinyMCE with image insertion
- Admin interface for creating/editing pages with SEO options
- Dynamic navigation and footer integration
- Public page display routes with proper SEO metadata
- Support for featured images and content excerpts

Admin features:
- Create/edit/delete pages with rich content editor
- Upload and manage images through media library
- Configure pages to appear in navigation or footer
- Set page status (Draft, Published, Archived)
- SEO title and description management
- Real-time preview of content changes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 07:26:25 +00:00

118 lines
3.4 KiB
TypeScript

import '../globals.css'
import type { Metadata } from 'next'
import { NextIntlClientProvider } from 'next-intl'
import { getMessages, getTranslations } from 'next-intl/server'
import { notFound } from 'next/navigation'
import { MuiThemeProvider } from '@/components/providers/theme-provider'
import { AuthProvider } from '@/components/auth/auth-provider'
import { Navigation } from '@/components/layout/navigation'
import { Footer } from '@/components/layout/footer'
import FloatingChat from '@/components/chat/floating-chat'
import { merriweather, lato } from '@/lib/fonts'
export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
const { locale } = await params
const t = await getTranslations({ locale, namespace: 'seo' })
const currentUrl = locale === 'ro' ? 'https://biblical-guide.com/ro/' : 'https://biblical-guide.com/en/'
const alternateUrl = locale === 'ro' ? 'https://biblical-guide.com/en/' : 'https://biblical-guide.com/ro/'
return {
title: t('title'),
description: t('description'),
keywords: t('keywords'),
alternates: {
canonical: currentUrl,
languages: {
'ro': 'https://biblical-guide.com/ro/',
'en': 'https://biblical-guide.com/en/',
'x-default': 'https://biblical-guide.com/'
}
},
openGraph: {
title: t('ogTitle'),
description: t('ogDescription'),
url: currentUrl,
siteName: 'Biblical Guide',
locale: locale,
type: 'website',
images: [
{
url: `https://ghidulbiblic.ro/og-image-${locale}.jpg`,
width: 1200,
height: 630,
alt: t('ogTitle'),
},
],
},
twitter: {
card: 'summary_large_image',
site: '@ghidbiblic',
title: t('twitterTitle'),
description: t('twitterDescription'),
images: [`https://ghidulbiblic.ro/og-image-${locale}.jpg`],
},
other: {
'application/ld+json': JSON.stringify({
"@context": "https://schema.org",
"@type": "MobileApplication",
"name": locale === 'ro' ? "Ghid Biblic" : "Biblical Guide",
"url": "https://ghidulbiblic.ro",
"description": t('description'),
"applicationCategory": "EducationApplication",
"operatingSystem": "iOS, Android, Web",
"inLanguage": [locale],
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
})
}
}
}
export async function generateStaticParams() {
return [
{ locale: 'ro' },
{ locale: 'en' }
]
}
interface LocaleLayoutProps {
children: React.ReactNode
params: Promise<{ locale: string }>
}
const locales = ['ro', 'en']
export default async function LocaleLayout({
children,
params
}: LocaleLayoutProps) {
const { locale } = await params
// Validate locale
if (!locales.includes(locale)) {
notFound()
}
const messages = await getMessages({ locale })
return (
<html lang={locale}>
<body className={`${merriweather.variable} ${lato.variable}`}>
<NextIntlClientProvider messages={messages} locale={locale}>
<MuiThemeProvider>
<AuthProvider>
<Navigation />
{children}
<Footer />
<FloatingChat />
</AuthProvider>
</MuiThemeProvider>
</NextIntlClientProvider>
</body>
</html>
)
}