"use client"; import * as React from "react"; import { useState, useEffect } from "react"; import { MediumCard } from "../../src/components/MediumCard"; import { SearchBar } from "../../src/components/SearchBar"; import { Tag } from "../../src/components/Tag"; import { blogPosts } from "../../src/data/blogPosts"; import { PageHeader } from "../../src/components/PageHeader"; import { Reveal } from "../../src/components/Reveal"; import { Section } from "../../src/components/Section"; import { AbstractCircuit, GradientMesh } from "../../src/components/Effects"; import { Label } from "../../src/components/Typography"; export default function BlogPage() { const [searchQuery, setSearchQuery] = useState(""); // Memoize allPosts to prevent infinite re-render loop const allPosts = React.useMemo( () => [...blogPosts].sort( (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(), ), [], ); const [filteredPosts, setFilteredPosts] = useState(allPosts); // Memoize allTags const allTags = React.useMemo( () => Array.from(new Set(allPosts.flatMap((post) => post.tags || []))), [allPosts], ); useEffect(() => { const query = searchQuery.toLowerCase().trim(); if (query.startsWith("#")) { const tag = query.slice(1); setFilteredPosts( allPosts.filter((post) => post.tags?.some((t) => t.toLowerCase() === tag.toLowerCase()), ), ); } else { setFilteredPosts( allPosts.filter((post) => { const title = post.title.toLowerCase(); const description = post.description.toLowerCase(); const tags = (post.tags || []).join(" ").toLowerCase(); return ( title.includes(query) || description.includes(query) || tags.includes(query) ); }), ); } }, [searchQuery, allPosts]); const filterByTag = (tag: string) => { setSearchQuery(`#${tag}`); }; return (
Blog
& Notes. } description="Ein technisches Notizbuch über Lösungen, Fehler und Werkzeuge." backLink={{ href: "/", label: "Zurück" }} backgroundSymbol="B" />
} >
{/* Sidebar / Filter area */}
{allTags.length > 0 && (
{allTags.map((tag, index) => ( ))}
)}
{/* Posts area */}
{filteredPosts.length === 0 ? (

Keine Beiträge gefunden.

) : ( filteredPosts.map((post, i) => ( )) )}
); }