import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import matter from 'gray-matter'; function Blog() { const [posts, setPosts] = useState([]); const [searchTerm, setSearchTerm] = useState(''); const [selectedTag, setSelectedTag] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchPosts() { try { const postFiles = import.meta.glob('../blogs/*.md', { query: '?raw', import: 'default', eager: true }); const loadedPosts = []; for (const path in postFiles) { const content = postFiles[path]; const { data } = matter(content); const slug = path.split('/').pop().replace('.md', ''); loadedPosts.push({ slug, ...data }); } loadedPosts.sort((a, b) => new Date(b.date) - new Date(a.date)); setPosts(loadedPosts); } catch (error) { console.error("Error fetching blog posts:", error); } finally { setLoading(false); } } fetchPosts(); }, []); const allTags = [...new Set(posts.flatMap(post => post.tags || []))]; const filteredPosts = posts .filter(post => { const title = post.title || ''; const author = post.author || ''; return title.toLowerCase().includes(searchTerm.toLowerCase()) || author.toLowerCase().includes(searchTerm.toLowerCase()); }) .filter(post => selectedTag ? (post.tags || []).includes(selectedTag) : true ); return (

OurWorld Blog

Insights, stories, and updates from the OurWorld Cooperative.

setSearchTerm(e.target.value)} />
{loading ? (
Loading posts...
) : filteredPosts.length > 0 ? (
{filteredPosts.map(post => ( {post.cover_image && ( {post.title} )}
{post.tags && post.tags.map(tag => ( {tag} ))}

{post.title}

By {post.author} on {new Date(post.date).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' })}

{post.summary && post.summary.length > 200 ? `${post.summary.substring(0, 200)}...` : post.summary}

))}
) : (

No posts found

Try adjusting your search or filters.

)}
); } export default Blog;