import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { TrashIcon, StarIcon, MagnifyingGlassIcon } from '@heroicons/react/24/outline'; import { StarIcon as StarSolid } from '@heroicons/react/24/solid'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse, PaginatedResponse } from '../lib/api'; import type { Rating } from '../types'; import { formatDate } from '../lib/utils'; import DataTable, { Column } from '../components/ui/DataTable'; import Pagination from '../components/ui/Pagination'; import ConfirmDialog from '../components/ui/ConfirmDialog'; function Stars({ value }: { value: number }) { return (
{[1, 2, 3, 4, 5].map((i) => i <= value ? : )} {value}
); } export default function RatingsPage() { const qc = useQueryClient(); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [deleteTarget, setDeleteTarget] = useState(null); const limit = 15; const { data, isLoading } = useQuery({ queryKey: ['ratings', page, search], queryFn: () => { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (search) params.set('search', search); return api.get>(`/api/v1/admin/rates?${params}`); }, }); const deleteMutation = useMutation({ mutationFn: (r: Rating) => api.delete>(`/api/v1/rate/${r.uuid}`), onSuccess: () => { toast.success('امتیاز حذف شد'); setDeleteTarget(null); qc.invalidateQueries({ queryKey: ['ratings'] }); }, onError: (err: Error) => toast.error(err.message), }); const columns: Column[] = [ { key: 'patient_name', header: 'بیمار', render: (r) => {r.patient_name} }, { key: 'doctor_name', header: 'پزشک', render: (r) => r.doctor_name }, { key: 'overall', header: 'کلی', render: (r) => }, { key: 'ratings_detail', header: 'جزئیات', render: (r) => (
تشخیص: مهارت: رفتار:
), }, { key: 'created_at', header: 'تاریخ', render: (r) => formatDate(r.created_at) }, ]; const items = data?.data ?? []; const total = data?.meta?.totalRecords ?? 0; return (

امتیازها

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