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 (

ThrillWiki Blog

Latest news, updates, and stories from the world of theme parks and roller coasters

{ setSearchQuery(e.target.value); setPage(1); }} className="pl-10" />
{isLoading ? (
{[...Array(6)].map((_, i) => ( ))}
) : data?.posts.length === 0 ? (

No blog posts found.

) : ( <>
{data?.posts.map((post) => ( ))}
{totalPages > 1 && (
Page {page} of {totalPages}
)} )}
); }