import { useEffect } from 'react'; import { useParams, Link } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { supabase } from '@/lib/supabaseClient'; import { MarkdownRenderer } from '@/components/blog/MarkdownRenderer'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { ArrowLeft, Calendar, Eye } from 'lucide-react'; import { formatDistanceToNow } from 'date-fns'; import { getCloudflareImageUrl } from '@/lib/cloudflareImageUtils'; import { Skeleton } from '@/components/ui/skeleton'; import { Header } from '@/components/layout/Header'; import { Footer } from '@/components/layout/Footer'; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; import { useOpenGraph } from '@/hooks/useOpenGraph'; export default function BlogPost() { const { slug } = useParams<{ slug: string }>(); const { data: post, isLoading } = useQuery({ queryKey: ['blog-post', slug], queryFn: async () => { const query = supabase .from('blog_posts') .select('*, profiles!inner(username, display_name, avatar_url, avatar_image_id)') .eq('slug', slug || '') .eq('status', 'published') .single(); const { data, error } = await query; if (error) throw error; return data; }, enabled: !!slug, }); // Update document title when post changes useDocumentTitle(post?.title || 'Blog Post'); // Update Open Graph meta tags useOpenGraph({ title: post?.title || '', description: post?.content?.substring(0, 160), imageUrl: post?.featured_image_url ?? undefined, imageId: post?.featured_image_id ?? undefined, type: 'article', enabled: !!post }); useEffect(() => { if (slug) { supabase.rpc('increment_blog_view_count', { post_slug: slug }); } }, [slug]); if (isLoading) { return (
); } if (!post) { return (

Post Not Found

); } return (

{post.title}

{post.profiles.display_name?.[0] || post.profiles.username[0]}

{post.profiles.display_name ?? post.profiles.username}

{formatDistanceToNow(new Date(post.published_at!), { addSuffix: true })}
{post.view_count} views
{post.featured_image_id && (
{post.title}
)}
); }