import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { CheckIcon, TrashIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse, PaginatedResponse } from '../lib/api'; import type { Comment } from '../types'; import { formatDate } from '../lib/utils'; import DataTable, { Column } from '../components/ui/DataTable'; import { ActiveBadge } from '../components/ui/StatusBadge'; import Pagination from '../components/ui/Pagination'; import ConfirmDialog from '../components/ui/ConfirmDialog'; const FILTERS = [ { value: '', label: 'همه' }, { value: 'pending', label: 'در انتظار' }, { value: 'approved', label: 'تأییدشده' }, ]; export default function CommentsPage() { const qc = useQueryClient(); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [approvedFilter, setApprovedFilter] = useState('pending'); const [approveTarget, setApproveTarget] = useState(null); const [deleteTarget, setDeleteTarget] = useState(null); const limit = 15; const { data, isLoading } = useQuery({ queryKey: ['comments', page, search, approvedFilter], queryFn: () => { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (search) params.set('search', search); if (approvedFilter !== '') params.set('status', approvedFilter); return api.get>(`/api/v1/admin/comments?${params}`); }, }); const approveMutation = useMutation({ mutationFn: (c: Comment) => api.post>(`/api/v1/admin/comment/${c.uuid}/approve`, {}), onSuccess: () => { toast.success('نظر تأیید شد'); setApproveTarget(null); qc.invalidateQueries({ queryKey: ['comments'] }); }, onError: (err: Error) => toast.error(err.message), }); const deleteMutation = useMutation({ mutationFn: (c: Comment) => api.delete>(`/api/v1/comment/${c.uuid}`), onSuccess: () => { toast.success('نظر حذف شد'); setDeleteTarget(null); qc.invalidateQueries({ queryKey: ['comments'] }); }, onError: (err: Error) => toast.error(err.message), }); const columns: Column[] = [ { key: 'patient_name', header: 'کاربر', render: (c) => {c.patient_name}, }, { key: 'doctor_name', header: 'پزشک', render: (c) => c.doctor_name }, { key: 'title', header: 'عنوان' }, { key: 'body', header: 'متن', render: (c) => ( {c.body} ), }, { key: 'is_approved', header: 'وضعیت', render: (c) => , }, { key: 'created_at', header: 'تاریخ', render: (c) => formatDate(c.created_at) }, ]; const items = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; return (

نظرات

{total} نظر ثبت‌شده
{ setSearch(e.target.value); setPage(1); }} placeholder="جستجو بر اساس نام پزشک یا متن..." />
{FILTERS.map((f) => ( ))}
columns={columns} data={items} loading={isLoading} emptyMessage="هیچ نظری یافت نشد" actions={(comment) => ( <> {!comment.is_approved && ( )} )} />
approveTarget && approveMutation.mutate(approveTarget)} onCancel={() => setApproveTarget(null)} /> deleteTarget && deleteMutation.mutate(deleteTarget)} onCancel={() => setDeleteTarget(null)} />
); }