{post.title}
{post.profiles.display_name || post.profiles.username}
import { useEffect } from 'react'; import { useParams, Link } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { supabase } from '@/integrations/supabase/client'; 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'; 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, }); useEffect(() => { if (slug) { supabase.rpc('increment_blog_view_count', { post_slug: slug }); } }, [slug]); if (isLoading) { return (
{post.profiles.display_name || post.profiles.username}