"use client"; import { getListArticle } from "@/service/article"; import Image from "next/image"; import { usePathname } from "next/navigation"; import { useEffect, useState } from "react"; import Link from "next/link"; import { getAdvertise } from "@/service/advertisement"; type Article = { id: number; title: string; description: string; categoryName: string; createdAt: string; createdByName: string; customCreatorName: string; thumbnailUrl: string; categories: { title: string; }[]; files: { fileUrl: string; file_alt: string; }[]; }; type Advertise = { id: number; title: string; description: string; placement: string; contentFileUrl: string; redirectLink: string; }; const slugToLabel = (slug: string) => { const mapping: Record = { development: "Pembangunan", health: "Kesehatan", "citizen-news": "Berita Warga", }; return mapping[slug] || slug.charAt(0).toUpperCase() + slug.slice(1); }; export default function DevelopmentNews() { const [activeTab, setActiveTab] = useState("comments"); const [page, setPage] = useState(1); const [totalPage, setTotalPage] = useState(1); const [articles, setArticles] = useState([]); const [showData, setShowData] = useState("100"); const [search, setSearch] = useState(""); const [selectedCategories, setSelectedCategories] = useState(""); const [startDateValue, setStartDateValue] = useState({ startDate: null, endDate: null, }); const pathname = usePathname(); const pathSegments = pathname.split("/").filter(Boolean); const [bannerAd, setBannerAd] = useState(null); useEffect(() => { initStateAdver(); }, []); async function initStateAdver() { const req = { limit: 100, page: 1, sort: "desc", sortBy: "created_at", isPublish: true, }; try { const res = await getAdvertise(req); const data: Advertise[] = res?.data?.data || [1]; // filter iklan dengan placement = "banner" const banner = data.find((ad) => ad.placement === "jumbotron"); if (banner) { setBannerAd(banner); } } catch (err) { console.error("Error fetching advertisement:", err); } } const categorySlug = pathSegments[1]; const categoryLabel = slugToLabel(categorySlug); useEffect(() => { initState(); }, [page, showData, startDateValue, selectedCategories, activeTab]); async function initState() { let sortBy = "created_at"; if (activeTab === "comments") sortBy = "comment_count"; if (activeTab === "trending") sortBy = "view_count"; // loading(); const req = { limit: showData, page: 1, search, categorySlug: Array.from(selectedCategories).join(","), sort: "desc", isPublish: true, sortBy: "created_at", }; try { const res = await getListArticle(req); setArticles(res?.data?.data || []); setTotalPage(res?.data?.meta?.totalPage || 1); } finally { // close(); } } const pembangunanArticles = articles.filter((article) => article.categories?.some((category) => category.title?.toLowerCase().includes("berita warga") ) ); // Pagination manually (front-end) const itemsPerPage = 2; const calculatedTotalPage = Math.ceil( pembangunanArticles.length / itemsPerPage ); const paginatedArticles = pembangunanArticles.slice( (page - 1) * itemsPerPage, page * itemsPerPage ); function truncateText(text: string, wordLimit: number) { const words = text.split(" "); if (words.length <= wordLimit) return text; return words.slice(0, wordLimit).join(" ") + "..."; } return (
{/* Left Content */}
{paginatedArticles.map((item) => (
{/* Image + Category */}
{item.title} {item.categories[0]?.title || "Pembangunan"}
{/* Content */}

{item.title}

BY{" "} {item?.customCreatorName || item.createdByName} {" "} • {new Date(item.createdAt).toLocaleDateString("id-ID")}

{truncateText(item.description, 20)}

))} {/* Pagination */}
{/* Previous Button */} {Array.from({ length: calculatedTotalPage }, (_, i) => i + 1) .filter((p) => { return ( p === 1 || p === calculatedTotalPage || (p >= page - 1 && p <= page + 1) ); }) .map((p, idx, arr) => { const prev = arr[idx - 1]; const showEllipsis = prev && p - prev > 1; return ( {showEllipsis && ...} ); })}
{/* Sidebar */}
{/* Advertisement */}
{bannerAd ? (
{bannerAd.title
) : ( Berita Utama )}
{/* Connect with us */}

Connect with us

138

Followers

205k

Subscribers

23.9k

Followers

{/* Tabs */}
{["trending", "comments", "latest"].map((tab) => ( ))}
{articles.slice(0, 5).map((item) => (
{item.title}

{item.title}

{new Date(item.createdAt).toLocaleDateString()}

))}

Recommended

{"articles[0]?.title"}

{articles[0]?.title}

{" "} {new Date(articles[0]?.createdAt).toLocaleDateString( "id-ID", { day: "numeric", month: "long", year: "numeric", } )}

{articles?.slice(1, 4).map((article, index) => (
{"article?.title"}

{article?.title}

{" "} {new Date(articles[0]?.createdAt).toLocaleDateString( "id-ID", { day: "numeric", month: "long", year: "numeric", } )}

))}
); }