import { useEffect, useState } from 'react' import { ThumbsUp, Check, XCircle, Trash2 } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import type { ProductComment } from '../types/comment' import { formatCommentDate } from '../data/productComments' import { ApiError } from '../lib/api' import { COMMENTS_PER_PAGE, deleteComment, listBlogComments, updateCommentApproval, } from '../services/commentService' import { Pagination } from './Pagination' import styles from './BlogCommentsSection.module.css' interface BlogCommentsSectionProps { blogId: string onCountChange?: (count: number) => void } export function BlogCommentsSection({ blogId, onCountChange }: BlogCommentsSectionProps) { const { locale } = useLocale() const dateLocale = locale === 'fa' ? 'fa' : 'en' const [comments, setComments] = useState([]) const [totalComments, setTotalComments] = useState(0) const [currentPage, setCurrentPage] = useState(1) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState('') const [actionId, setActionId] = useState(null) const totalPages = Math.max(1, Math.ceil(totalComments / COMMENTS_PER_PAGE)) useEffect(() => { const controller = new AbortController() void loadComments(currentPage, controller.signal) return () => controller.abort() }, [blogId, currentPage]) async function loadComments(page: number, signal?: AbortSignal) { setIsLoading(true) setError('') try { const data = await listBlogComments(blogId, page, COMMENTS_PER_PAGE, signal) setComments(data.items) setTotalComments(data.total) onCountChange?.(data.total) } catch (err) { if (err instanceof DOMException && err.name === 'AbortError') return if (err instanceof ApiError) { setError(err.message) } else { setError('Unable to load comments.') } } finally { setIsLoading(false) } } async function toggleApproval(comment: ProductComment) { setActionId(comment.id) setError('') try { const updated = await updateCommentApproval(comment.id, !comment.approved) setComments((prev) => prev.map((c) => (c.id === comment.id ? updated : c))) } catch (err) { if (err instanceof ApiError) { setError(err.message) } else { setError('Unable to update comment approval.') } } finally { setActionId(null) } } async function removeComment(commentId: string) { setActionId(commentId) setError('') try { await deleteComment(commentId) const nextTotal = totalComments - 1 const nextTotalPages = Math.max(1, Math.ceil(nextTotal / COMMENTS_PER_PAGE)) const nextPage = currentPage > nextTotalPages ? nextTotalPages : currentPage setTotalComments(nextTotal) onCountChange?.(nextTotal) if (nextPage !== currentPage) { setCurrentPage(nextPage) } else { setComments((prev) => prev.filter((c) => c.id !== commentId)) } } catch (err) { if (err instanceof ApiError) { setError(err.message) } else { setError('Unable to delete comment.') } } finally { setActionId(null) } } return (

Comments

{totalComments} {totalComments === 1 ? 'comment' : 'comments'}
{error && (

{error}

)} {isLoading ? (

Loading comments...

) : totalComments === 0 ? (

No comments yet for this blog post.

) : ( <>
{comments.map((comment) => (
{comment.author}
{formatCommentDate(comment.createdAt, dateLocale)}
{comment.likesCount}

{comment.text}

{comment.approved ? ( ) : ( )}
))}
{totalComments > COMMENTS_PER_PAGE && (
)} )}
) }