import { type Component, createEffect, createSignal, createResource, Show, } from "solid-js"; import { useNavigate } from "@solidjs/router"; import { useAuth } from "@/context/AuthContext"; import { blogApi, type BlogPost } from "@/api/blog"; import BlogList from "@/components/BlogList"; import BlogModal from "@/components/BlogModal"; import CreateBlogForm from "@/components/CreateBlogForm"; import { UserType } from "@/enums/UserType"; const Blogs: Component = () => { const { user, isAuthenticated } = useAuth(); const navigate = useNavigate(); const [showCreateForm, setShowCreateForm] = createSignal(false); const [selectedBlogId, setSelectedBlogId] = createSignal(null); const [editMode, setEditMode] = createSignal(false); const [blogs, { refetch: refetchBlogs }] = createResource(async () => { if (!isAuthenticated()) return []; return await blogApi.getAllBlogs(); }); const [selectedBlog, { refetch: refetchSelectedBlog }] = createResource( selectedBlogId, async (id) => { if (!id) return null; return await blogApi.getBlog(id); }, ); createEffect(() => { if (!isAuthenticated()) { navigate("/login", { replace: true }); return; } const currentUser = user(); if (currentUser?.userType !== UserType.PATIENT) { navigate("/", { replace: true }); } }); const handleCreateBlog = async (title: string, content: string) => { await blogApi.createBlog({ title, content }); setShowCreateForm(false); refetchBlogs(); }; const handleLike = async (blogId: number) => { try { await blogApi.toggleLike(blogId); } finally { refetchBlogs(); if (selectedBlogId() === blogId) { refetchSelectedBlog(); } } }; const handleAddComment = async (content: string) => { const blog = selectedBlog(); if (!blog) return; await blogApi.addComment(blog.idBlog, content); refetchBlogs(); refetchSelectedBlog(); }; const handleUpdateBlog = async ( blogId: number, title: string, content: string, ) => { await blogApi.updateBlog(blogId, { title, content }); refetchBlogs(); if (selectedBlogId() === blogId) { refetchSelectedBlog(); } }; const handleDeleteBlog = async (blogId: number) => { await blogApi.deleteBlog(blogId); if (selectedBlogId() === blogId) { closeBlog(); } refetchBlogs(); }; const handleUpdateComment = async (commentId: number, content: string) => { await blogApi.updateComment(commentId, content); refetchBlogs(); refetchSelectedBlog(); }; const handleDeleteComment = async (commentId: number) => { await blogApi.deleteComment(commentId); refetchBlogs(); refetchSelectedBlog(); }; const openBlog = (blog: BlogPost) => { setSelectedBlogId(blog.idBlog); setEditMode(false); }; const openBlogInEditMode = (blog: BlogPost) => { setSelectedBlogId(blog.idBlog); setEditMode(true); }; const handleQuickDelete = async (blogId: number) => { await blogApi.deleteBlog(blogId); refetchBlogs(); }; const closeBlog = () => { setSelectedBlogId(null); setEditMode(false); }; return (

Community Blogs

{blogs.error instanceof Error ? blogs.error.message : "Failed to load blogs"}
setShowCreateForm(false)} />
); }; export default Blogs;