"use client"; import { useState } from "react"; import Link from "next/link"; import Image from "next/image"; import { CalendarIcon, ChevronRight, Leaf, Search } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { fetchBlogs } from "@/api/hub"; import type { Blog } from "@/types"; export default function KnowledgeHubPage() { const [selectedTopic, setSelectedTopic] = useState("All"); const [searchQuery, setSearchQuery] = useState(""); // Fetch blogs using react-query. const { data: blogs, isLoading, isError, } = useQuery({ queryKey: ["blogs"], queryFn: fetchBlogs, staleTime: 60 * 1000, }); if (isLoading) { return
Loading...
; } if (isError || !blogs) { return
Error loading blogs.
; } // Derive the list of topics from the fetched blogs. const topics = ["All", ...new Set(blogs.map((blog) => blog.topic))]; // Filter blogs based on selected topic and search query. const filteredBlogs = blogs.filter((blog) => { const matchesTopic = selectedTopic === "All" || blog.topic === selectedTopic; const matchesSearch = blog.title.toLowerCase().includes(searchQuery.toLowerCase()) || blog.description.toLowerCase().includes(searchQuery.toLowerCase()); return matchesTopic && matchesSearch; }); // Get featured blogs const featuredBlogs = blogs.filter((blog) => blog.featured); return (
{/* Header */}

Knowledge Hub

Explore our collection of articles, guides, and resources to help you grow better.

setSearchQuery(e.target.value)} />
{/* Featured article */} {featuredBlogs.length > 0 && (

Featured Articles

{featuredBlogs.slice(0, 2).map((blog) => (
{blog.title}
{blog.topic}

{blog.title}

{new Date(blog.date).toLocaleDateString()} {blog.readTime}
By {blog.author}
))}
)} {/* Topic filters */}

Browse by Topic

{topics.map((topic) => ( ))}
{/* Blog grid */}
{filteredBlogs.length === 0 ? (

No articles found

Try adjusting your search or filter to find what you're looking for.

) : ( filteredBlogs.map((blog) => (
{blog.title}
{blog.topic}
{new Date(blog.date).toLocaleDateString()}
{blog.title}
{blog.description}
By {blog.author}
)) )}
{/* Pagination - simplified for this example */} {filteredBlogs.length > 0 && (
)}
); }