import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { supabase } from '@/lib/supabaseClient'; import { BlogPostCard } from '@/components/blog/BlogPostCard'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Search, ChevronLeft, ChevronRight } from 'lucide-react'; 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'; const POSTS_PER_PAGE = 9; export default function BlogIndex() { useDocumentTitle('Blog'); const [page, setPage] = useState(1); const [searchQuery, setSearchQuery] = useState(''); const { data, isLoading } = useQuery({ queryKey: ['blog-posts', page, searchQuery], queryFn: async () => { let query = supabase .from('blog_posts') .select('*, profiles!inner(username, display_name, avatar_url)', { count: 'exact' }) .eq('status', 'published') .order('published_at', { ascending: false }) .range((page - 1) * POSTS_PER_PAGE, page * POSTS_PER_PAGE - 1); if (searchQuery) { query = query.or(`title.ilike.%${searchQuery}%,content.ilike.%${searchQuery}%`); } const { data: posts, count, error } = await query; if (error) throw error; return { posts, totalCount: count || 0 }; }, }); const totalPages = Math.ceil((data?.totalCount || 0) / POSTS_PER_PAGE); useOpenGraph({ title: 'Blog - ThrillWiki', description: searchQuery ? `Search results for "${searchQuery}" in ThrillWiki Blog` : 'News, updates, and stories from the world of theme parks and roller coasters', imageUrl: data?.posts?.[0]?.featured_image_url ?? undefined, imageId: data?.posts?.[0]?.featured_image_id ?? undefined, type: 'website', enabled: !isLoading }); return (
Latest news, updates, and stories from the world of theme parks and roller coasters
No blog posts found.