"use client"; import React, { useState, useEffect, useMemo } from "react"; import { BlogData } from "@/utils/constant.utils"; import Link from "next/link"; 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]); useEffect(() => { // Swiper Initialization const initSwiper = () => { if (typeof window !== "undefined" && (window as any).Swiper) { new (window as any).Swiper('.blog-one__carousel', { slidesPerView: 1, spaceBetween: 30, loop: true, autoplay: { delay: 3000, disableOnInteraction: false, }, speed: 500, breakpoints: { 576: { slidesPerView: 1 }, 768: { slidesPerView: 2 }, 992: { slidesPerView: 3 }, 1200: { slidesPerView: 3 }, }, }); } else if (typeof window !== "undefined") { setTimeout(initSwiper, 100); } }; if (isSlider) { initSwiper(); } // Animation Initialization const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { const elements = entry.target.querySelectorAll(".wow"); elements.forEach((el) => { const htmlEl = el as HTMLElement; const delay = htmlEl.dataset.wowDelay || "0ms"; setTimeout(() => { htmlEl.classList.add("animated"); htmlEl.style.visibility = "visible"; }, parseInt(delay)); }); observer.unobserve(entry.target); } }); }, { threshold: 0.1 } ); const section = document.querySelector(".blog-section-one"); if (section) observer.observe(section); return () => observer.disconnect(); }, [isSlider]); 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( paginate(i)} className={`pagination-btn ${currentPage === i ? 'active' : ''}`} suppressHydrationWarning > {i} ); } return pages; }; return ( {!hideHeader && ( OUR BLOGS Latest Blogs Post )} {isSlider ? ( {currentBlogs.map((blog, index) => ( {blog.category} By Admin {blog.date} {blog.title} Learn More + ))} ) : ( {currentBlogs.map((blog) => ( {blog.category} By Admin {blog.date} {blog.title} Learn More + ))} {currentBlogs.length === 0 && ( No blogs found matching your criteria. )} )} {isPaginated && totalPages > 1 && ( paginate(currentPage - 1)} disabled={currentPage === 1} className={`pagination-arrow ${currentPage === 1 ? 'disabled' : ''}`} suppressHydrationWarning > {renderPageNumbers()} paginate(currentPage + 1)} disabled={currentPage === totalPages} className={`pagination-arrow ${currentPage === totalPages ? 'disabled' : ''}`} suppressHydrationWarning > )} ); }; export default BlogSection;
OUR BLOGS