'use client' import { useState } from 'react' import type { Article } from '@/lib/types' import ArticleCard from './ArticleCard' interface Props { categorySlug: string initialCount: number hasMore?: boolean } export default function LoadMoreButton({ categorySlug, initialCount, hasMore: initialHasMore = true }: Props) { const [articles, setArticles] = useState([]) const [offset, setOffset] = useState(initialCount) const [loading, setLoading] = useState(false) const [hasMore, setHasMore] = useState(initialHasMore) async function loadMore() { setLoading(true) try { const params = new URLSearchParams({ 'filter[status][_eq]': 'published', 'filter[category][slug][_eq]': categorySlug, sort: '-published_at,-date_created', limit: '12', offset: String(offset), fields: 'id,title,slug,excerpt,featured_image,published_at,is_featured,category.id,category.name,category.slug', access_token: process.env.NEXT_PUBLIC_DIRECTUS_TOKEN ?? '', }) const res = await fetch( `${process.env.NEXT_PUBLIC_DIRECTUS_URL}/items/articles?${params}` ) const data = await res.json() const newArticles: Article[] = data.data ?? [] setArticles((prev) => [...prev, ...newArticles]) setOffset((prev) => prev + newArticles.length) if (newArticles.length < 12) setHasMore(false) } finally { setLoading(false) } } return ( <> {articles.length > 0 && (
{articles.map((article) => ( ))}
)} {hasMore && (
)} ) }