import { useLang } from "@/contexts/LanguageContext"; import { Button } from "@/components/ui/button"; import { motion } from "framer-motion"; import { Clock, ArrowLeft, ArrowRight, Tag, Search, ChevronLeft, ChevronRight } from "lucide-react"; import { useState, useMemo } from "react"; import { Link } from "wouter"; import { articles, categories, blogTags } from "@/data/blogData"; import SEOHead, { breadcrumbSchema } from "@/components/SEOHead"; const fadeUp = { hidden: { opacity: 0, y: 30 }, visible: (i: number) => ({ opacity: 1, y: 0, transition: { delay: i * 0.06, duration: 0.5, ease: [0, 0, 0.2, 1] as const } }), }; const POSTS_PER_PAGE = 12; export default function Blog() { const { t, lang } = useLang(); const Arrow = lang === "ar" ? ArrowLeft : ArrowRight; const [activeCategory, setActiveCategory] = useState("الكل"); const [activeTag, setActiveTag] = useState(""); const [searchQuery, setSearchQuery] = useState(""); const [currentPage, setCurrentPage] = useState(1); const filteredArticles = useMemo(() => { let filtered = [...articles].sort((a, b) => Date.parse(b.date) - Date.parse(a.date)); if (activeCategory !== "الكل") { filtered = filtered.filter(a => a.categoryAr === activeCategory); } if (activeTag) { filtered = filtered.filter(a => a.tags && a.tags.includes(activeTag)); } if (searchQuery.trim()) { const q = searchQuery.trim().toLowerCase(); filtered = filtered.filter(a => a.titleAr.toLowerCase().includes(q) || a.titleEn.toLowerCase().includes(q) || a.excerptAr.toLowerCase().includes(q) || a.excerptEn.toLowerCase().includes(q) ); } return filtered; }, [activeCategory, activeTag, searchQuery]); const handleTagChange = (tag: string) => { setActiveTag(tag === activeTag ? "" : tag); setCurrentPage(1); }; // Top tags by article count const topTags = useMemo(() => { return blogTags .map(t => ({ ...t, count: articles.filter(a => a.tags && a.tags.includes(t.slug)).length })) .filter(t => t.count > 0) .sort((a, b) => b.count - a.count) .slice(0, 12); }, []); const totalPages = Math.ceil(filteredArticles.length / POSTS_PER_PAGE); const paginatedArticles = filteredArticles.slice( (currentPage - 1) * POSTS_PER_PAGE, currentPage * POSTS_PER_PAGE ); const featured = filteredArticles.find(a => a.featured) ?? filteredArticles[0]; const handleCategoryChange = (catAr: string) => { setActiveCategory(catAr); setCurrentPage(1); }; const handleSearch = (val: string) => { setSearchQuery(val); setCurrentPage(1); }; return (
{lang === "ar" ? featured.excerptAr : featured.excerptEn}
{t("لا توجد مقالات مطابقة لبحثك", "No articles match your search")}
{lang === "ar" ? post.excerptAr : post.excerptEn}