"use client"; import React, { useState, useEffect, useMemo } from "react"; import { BlogData } from "@/utils/constant.utils"; import Link from "next/link"; import Slider from "react-slick"; const allBlogs = [...BlogData].sort( (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime() ); interface BlogSectionProps { hideHeader?: boolean; isPaginated?: boolean; searchTerm?: string; selectedCategory?: string; blogsPerPage?: number; columns?: string; // e.g., "col-xxl-4 col-xl-4 col-lg-6" } const BlogSection = ({ hideHeader = false, isPaginated = false, searchTerm = "", selectedCategory = "", blogsPerPage = 12, columns = "col-xxl-4 col-xl-4 col-lg-6" }: BlogSectionProps) => { const [currentPage, setCurrentPage] = useState(1); const [isSlider, setIsSlider] = useState(false); const [isMounted, setIsMounted] = useState(false); // Reset to first page when filtering changes useEffect(() => { setCurrentPage(1); }, [searchTerm, selectedCategory]); // Handle mount and resize useEffect(() => { setIsMounted(true); if (isPaginated) { setIsSlider(false); return; } const handleResize = () => { setIsSlider(window.innerWidth <= 1024); }; handleResize(); window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); }, [isPaginated]); // Filter blogs based on search and category const filteredBlogs = useMemo(() => { let list = [...allBlogs]; if (selectedCategory) { list = list.filter(blog => blog.category === selectedCategory); } if (searchTerm) { const lowerTerm = searchTerm.toLowerCase(); list = list.filter(blog => blog.title.toLowerCase().includes(lowerTerm) || blog.category.toLowerCase().includes(lowerTerm) ); } return list; }, [searchTerm, selectedCategory]); if (!isMounted) { return null; // Avoid hydration mismatch } // Total pages const totalPages = Math.ceil(filteredBlogs.length / blogsPerPage); // Get current blogs const indexOfLastBlog = currentPage * blogsPerPage; const indexOfFirstBlog = indexOfLastBlog - blogsPerPage; const currentBlogs = isPaginated ? filteredBlogs.slice(indexOfFirstBlog, indexOfLastBlog) : filteredBlogs.slice(0, 3); const paginate = (pageNumber: number) => { if (pageNumber >= 1 && pageNumber <= totalPages) { setCurrentPage(pageNumber); window.scrollTo({ top: 0, behavior: 'smooth' }); } }; // Pagination display logic: show up to 5 numbers then arrows const renderPageNumbers = () => { const pages = []; let startPage = Math.max(1, currentPage - 2); let endPage = Math.min(totalPages, startPage + 4); if (endPage - startPage < 4) { startPage = Math.max(1, endPage - 4); } for (let i = startPage; i <= endPage; i++) { pages.push( ); } return pages; }; const sliderSettings = { dots: false, infinite: true, speed: 500, slidesToShow: 2, slidesToScroll: 1, arrows: false, autoplay: true, responsive: [ { breakpoint: 767, // Below 768px show 1 card settings: { slidesToShow: 1, slidesToScroll: 1, }, }, ], }; return (
{!hideHeader && (
OUR BLOGS

Latest Blogs Post

)} {isSlider ? ( {currentBlogs.map((blog) => (
{blog.title} {blog.category}
By Admin {blog.date}
{blog.title}
Learn More +
))}
) : (
{currentBlogs.map((blog) => (
{blog.title} {blog.category}
By Admin {blog.date}
{blog.title}
Learn More +
))} {currentBlogs.length === 0 && (

No blogs found matching your criteria.

)}
)} {isPaginated && totalPages > 1 && (
{renderPageNumbers()}
)}
); }; export default BlogSection;