import React, { useState, useEffect } from 'react'; import api from '../../utils/api'; import Navbar from '../../components/Navbar'; import MemberFooter from '../../components/MemberFooter'; import { Card } from '../../components/ui/card'; import { Button } from '../../components/ui/button'; import { Badge } from '../../components/ui/badge'; import { Input } from '../../components/ui/input'; import { toast } from 'sonner'; import { FileText, ExternalLink, Calendar, Search } from 'lucide-react'; export default function NewsletterArchive() { const [newsletters, setNewsletters] = useState([]); const [years, setYears] = useState([]); const [selectedYear, setSelectedYear] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { fetchYears(); fetchNewsletters(); }, []); const fetchYears = async () => { try { const response = await api.get('/newsletters/years'); setYears(response.data); } catch (error) { console.error('Failed to load years'); } }; const fetchNewsletters = async (year = null) => { try { setLoading(true); const url = year ? `/newsletters?year=${year}` : '/newsletters'; const response = await api.get(url); setNewsletters(response.data); } catch (error) { toast.error('Failed to load newsletters'); } finally { setLoading(false); } }; const handleYearFilter = (year) => { setSelectedYear(year); fetchNewsletters(year); }; const clearFilter = () => { setSelectedYear(null); fetchNewsletters(); }; const filteredNewsletters = newsletters.filter(newsletter => newsletter.title.toLowerCase().includes(searchTerm.toLowerCase()) || (newsletter.description && newsletter.description.toLowerCase().includes(searchTerm.toLowerCase())) ); const formatDate = (dateString) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); }; const groupByYear = (newsletters) => { const grouped = {}; newsletters.forEach(newsletter => { const year = new Date(newsletter.published_date).getFullYear(); if (!grouped[year]) { grouped[year] = []; } grouped[year].push(newsletter); }); return grouped; }; const groupedNewsletters = groupByYear(filteredNewsletters); const sortedYears = Object.keys(groupedNewsletters).sort((a, b) => b - a); if (loading) { return (

Loading newsletters...

); } return (
{/* Header */}

Newsletter Archive

Browse past monthly newsletters and stay informed about LOAF community updates.

{/* Filters */}
{/* Search */}
setSearchTerm(e.target.value)} className="pl-10 border-[#ddd8eb] focus:border-[#664fa3]" />
{/* Year Filter */}
{years.map(year => ( ))}
{/* Newsletter List */} {filteredNewsletters.length === 0 ? (

No newsletters found

) : (
{sortedYears.map(year => (

{year}

{groupedNewsletters[year].map(newsletter => (

{newsletter.title}

{newsletter.description && (

{newsletter.description}

)}
{formatDate(newsletter.published_date)} {newsletter.document_type === 'google_docs' ? 'Google Docs' : newsletter.document_type.toUpperCase()}
))}
))}
)}
); }