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 (
{/* Header */}
{t("المدونة", "Blog")} {t("أدلة ونصائح للطلاب", "Guides & Tips for Students")} {t( `${articles.length} مقال متخصص يساعدك في رحلتك الأكاديمية من اختيار التخصص إلى الحصول على المنحة`, `${articles.length} specialized articles to help you on your academic journey from choosing a major to securing a scholarship.` )} {/* Search Bar */}
handleSearch(e.target.value)} placeholder={t("ابحث في المقالات...", "Search articles...")} className="w-full ps-12 pe-4 py-3.5 bg-white/10 border border-white/20 rounded-xl text-white placeholder:text-white/40 focus:outline-none focus:ring-2 focus:ring-gold/50 focus:border-gold/50 transition-all" />
{/* Categories */}
{categories.map((cat) => ( ))}
{/* Tags Filter */}
{topTags.map((tag) => ( ))} {t("كل الوسوم", "All Tags")} →
{/* Featured Post - only show on first page with no filters */} {featured && activeCategory === "الكل" && !searchQuery && currentPage === 1 && (
{lang
{lang === "ar" ? featured.categoryAr : featured.categoryEn} {featured.date} {t("مميز", "Featured")}

{lang === "ar" ? featured.titleAr : featured.titleEn}

{lang === "ar" ? featured.excerptAr : featured.excerptEn}

{t(`${featured.readTime} دقائق قراءة`, `${featured.readTime} min read`)}
{t("اقرأ المقال", "Read Article")}
)} {/* Posts Grid */}

{searchQuery ? t(`نتائج البحث (${filteredArticles.length})`, `Search Results (${filteredArticles.length})`) : activeCategory !== "الكل" ? t(`${activeCategory} (${filteredArticles.length})`, `${categories.find(c => c.ar === activeCategory)?.en} (${filteredArticles.length})`) : t("جميع المقالات", "All Articles") }

{paginatedArticles.length === 0 ? (

{t("لا توجد مقالات مطابقة لبحثك", "No articles match your search")}

) : (
{paginatedArticles.map((post, i) => (
{lang
{lang === "ar" ? post.categoryAr : post.categoryEn} {post.date}

{lang === "ar" ? post.titleAr : post.titleEn}

{lang === "ar" ? post.excerptAr : post.excerptEn}

{t(`${post.readTime} دقائق`, `${post.readTime} min`)}
{t("اقرأ المزيد", "Read More")}
))}
)} {/* Pagination */} {totalPages > 1 && (
{Array.from({ length: totalPages }, (_, i) => i + 1).map(page => ( ))}
)}
); }