import React, { useEffect, useState } from 'react'; import { motion } from 'framer-motion'; import { Loader2, ArrowRight } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import PageTransition from '../../components/PageTransition'; import SEO from '../../components/SEO'; import BlogPostCard from './components/BlogpostCard'; import type { BlogPost } from './utils/mdxLoader'; // Import aller Sprachversionen import { blog as blogDe } from '../../i18n/locales/de/blog/index'; import { blog as blogEn } from '../../i18n/locales/en/blog/index'; import { blog as blogSr } from '../../i18n/locales/sr/blog/index'; const BlogPage: React.FC = () => { const { i18n } = useTranslation(); // Wir erwarten hier Posts, bei denen coverImage garantiert ein string ist und slug vorhanden ist. const [posts, setPosts] = useState<(BlogPost & { coverImage: string; slug: string })[]>([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Ermittelt die aktuelle Blog-Konfiguration anhand der Sprache. const getBlogConfig = () => { switch (i18n.language) { case 'en': return blogEn; case 'sr': return blogSr; case 'de': default: return blogDe; } }; const blog = getBlogConfig(); useEffect(() => { const loadPosts = async () => { setLoading(true); try { // Aus der aktuellen Sprachkonfiguration werden alle Posts extrahiert. const currentBlog = getBlogConfig(); const blogPosts = Object.entries(currentBlog.posts).map(([slug, post]) => ({ ...post, slug, // Falls coverImage nicht definiert ist, setzen wir einen leeren String als Fallback. coverImage: post.coverImage ?? '' })) as (BlogPost & { coverImage: string; slug: string })[]; setPosts(blogPosts); } catch (error) { console.error('Error loading blog posts:', error); setError( error instanceof Error ? error : new Error(blog.ui.errors.posts) ); } finally { setLoading(false); } }; loadPosts(); }, [i18n.language]); const schema = { '@context': 'https://schema.org', '@type': 'Blog', name: blog.meta.title, description: blog.meta.description }; const metaDescription = blog.meta.description; if (loading) { return (

{blog.ui.loading.posts}

); } if (error) { return (

{blog.ui.errors.posts}

{error.message}

); } return ( {/* SEO-Aufruf: Wir übergeben hier nur die Properties, die im SEOProps-Typ definiert sind */}
{/* Header Section */}

BLOG

{blog.meta.header.title} {blog.meta.header.subtitle}
{/* Blog Posts Grid */} {posts.map((post, index) => ( ))} {/* Empty State */} {posts.length === 0 && !loading && !error && (

{blog.ui.notFound.message}

)}
); }; export default BlogPage;