import {useState, useEffect, useCallback} from "react"; import {AxiosError} from "axios"; import {useNavigate} from "react-router-dom"; import {getAllBlogsApi, deleteBlogApi} from "@/api/blog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import {Card, CardContent, CardHeader, CardTitle} from "@/components/ui/card"; import {Button} from "@/components/ui/button"; import {Input} from "@/components/ui/input"; import {Loader2, RefreshCw, Plus, Pencil, Trash} from "lucide-react"; interface Blog { id: number; title: string; writer: string; image: string | null; } export default function BlogPage() { const [blogs, setBlogs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [searchText, setSearchText] = useState(""); const navigate = useNavigate(); const fetchBlogs = useCallback(async () => { setLoading(true); setError(""); try { const res = await getAllBlogsApi(); if (Array.isArray(res)) { setBlogs(res); } else { setBlogs([]); } } catch (err) { if (err instanceof AxiosError) { setError(err.response?.data?.message || "Failed to load blogs"); } else { setError("Something went wrong"); } } finally { setLoading(false); } }, []); useEffect(() => { fetchBlogs(); }, [fetchBlogs]); const filteredBlogs = blogs.filter((b) => { const text = searchText.toLowerCase(); return ( b.title?.toLowerCase().includes(text) || b.writer?.toLowerCase().includes(text) ); }); async function handleDelete(id: number) { const confirmDelete = confirm("Delete this blog?"); if (!confirmDelete) return; try { await deleteBlogApi(id); fetchBlogs(); } catch (error) { console.error(error); } } return (

Blogs

setSearchText(e.target.value)} className="w-[220px]" />
{error && (
{error}
)} Blog List
ID Title Writer Actions {loading ? ( ) : filteredBlogs.length === 0 ? ( No blogs found ) : ( filteredBlogs.map((blog) => ( {blog.id} {blog.title} {blog.writer} )) )}
); }