Criticisms

This commit is contained in:
hamid zarghami
2026-02-22 14:55:45 +03:30
parent fcab80bb0b
commit 51670fbc94
4 changed files with 48 additions and 192 deletions
+1 -1
View File
@@ -30,7 +30,7 @@ const CriticismsDetail: FC = () => {
<Fragment>
<div>
{t('criticisms.criticism')}
{' #' + getDetail.data?.data?.criticism?.numericId}
{/* {' #' + getDetail.data?.data?.criticism?.numericId} */}
</div>
<div className='flex-1 mt-4 bg-white p-8 rounded-2xl'>
+14 -50
View File
@@ -2,19 +2,19 @@ import { type FC, useState } from 'react'
import { useDeleteCriticismsDetail, useGetCriticismsList } from './hooks/useCriticismsData'
// import { useTranslation } from 'react-i18next'
import { Link } from 'react-router-dom'
import { Eye, Trash } from 'iconsax-react'
import { Eye } from 'iconsax-react'
import { Paths } from '../../config/Paths'
import type { CriticismsItemTypes } from './types/CriticismsTypes'
import moment from 'moment-jalaali'
import DefaulModal from '../../components/DefaulModal'
import Table from '../../components/Table'
import type { ColumnType } from '../../components/types/TableTypes'
import TrashWithConfrim from '@/components/TrashWithConfrim'
import { toast } from '@/shared/toast'
import { extractErrorMessage } from '@/config/func'
const CriticismsList: FC = () => {
const [itemId, setItemId] = useState<string>('')
const [page, setPage] = useState<number>(1)
const [openConfrim, setOpenConfrim] = useState(false)
const getCriticismsList = useGetCriticismsList(page)
const deleteCriticisms = useDeleteCriticismsDetail()
@@ -36,28 +36,19 @@ const CriticismsList: FC = () => {
return translations[key] || key;
};
const handleDelete = (id?: string, confrim: boolean = false) => {
if (confrim) {
deleteCriticisms.mutate(itemId, {
const handleDelete = (id: string) => {
deleteCriticisms.mutate(id, {
onSuccess: () => {
getCriticismsList.refetch()
setOpenConfrim(false)
setItemId('')
},
onError: (error) => {
toast(extractErrorMessage(error), 'error')
}
})
} else if (id) {
setItemId(id)
setOpenConfrim(true)
}
}
// Define table columns
const columns: ColumnType<CriticismsItemTypes>[] = [
{
title: t('criticisms.number'),
key: 'numericId',
},
{
title: t('criticisms.title_criticisms'),
key: 'title',
@@ -76,9 +67,14 @@ const CriticismsList: FC = () => {
title: t('detail'),
key: 'detail',
render: (item) => (
<div className='flex gap-2 items-center'>
<Link to={Paths.criticisms.detail + item.id}>
<Eye size={20} color='#8C90A3' />
</Link>
<TrashWithConfrim
onDelete={() => handleDelete(item.id)}
/>
</div>
),
},
];
@@ -93,13 +89,6 @@ const CriticismsList: FC = () => {
columns={columns}
data={getCriticismsList.data?.data?.criticisms}
isLoading={getCriticismsList.isPending}
rowActions={(item) => [
{
label: t('delete'),
onClick: () => handleDelete(String(item.id)),
icon: <Trash size={20} color='#8C90A3' />,
}
]}
pagination={{
currentPage: page,
totalPages: getCriticismsList.data?.data?.pager?.totalPages || 1,
@@ -107,31 +96,6 @@ const CriticismsList: FC = () => {
}}
/>
<DefaulModal
open={openConfrim}
close={() => setOpenConfrim(false)}
isHeader={true}
title_header={t('delete_confirmation')}
>
<div className="p-4">
<p className="mb-6">{t('are_you_sure_delete')}</p>
<div className="flex gap-3 justify-end">
<button
onClick={() => setOpenConfrim(false)}
className="px-4 py-2 bg-gray-200 rounded-lg"
>
{t('cancel')}
</button>
<button
onClick={() => handleDelete('', true)}
disabled={deleteCriticisms.isPending}
className="px-4 py-2 bg-red-500 text-white rounded-lg disabled:opacity-50"
>
{deleteCriticisms.isPending ? t('deleting') : t('delete')}
</button>
</div>
</div>
</DefaulModal>
</div>
)
}
+13 -120
View File
@@ -1,130 +1,23 @@
import { useMutation, useQuery } from "@tanstack/react-query";
// import * as api from "../service/CriticismsService";
import type { CriticismsItemTypes } from "../types/CriticismsTypes";
// Static data for development
const staticCriticismsData = {
data: {
criticisms: [
{
id: "1",
numericId: "1001",
title: "مشکل در سیستم پرداخت",
content:
"سلام، من در هنگام پرداخت با مشکل مواجه شدم. سیستم پرداخت به درستی کار نمی‌کند و پس از وارد کردن اطلاعات کارت، خطای عجیبی نمایش داده می‌شود. لطفاً این مشکل را بررسی کنید.",
createdAt: new Date("2024-01-15T10:30:00"),
isRead: false,
files: [
{ id: "f1", fileUrl: "https://example.com/files/payment-error.png" },
{ id: "f2", fileUrl: "https://example.com/files/screenshot.jpg" },
],
},
{
id: "2",
numericId: "1002",
title: "کیفیت محصول مطابق انتظار نبود",
content:
"محصولی که سفارش دادم کیفیت مناسبی نداشت و با توضیحات ارائه شده در سایت مطابقت نداشت. انتظار داشتم کیفیت بهتری داشته باشد.",
createdAt: new Date("2024-01-14T14:20:00"),
isRead: true,
files: [
{ id: "f3", fileUrl: "https://example.com/files/product-photo.jpg" },
],
},
{
id: "3",
numericId: "1003",
title: "تاخیر در ارسال سفارش",
content:
"سفارش من با تاخیر زیادی ارسال شد. زمان تحویل اعلام شده رعایت نشد و این موضوع باعث نارضایتی من شده است.",
createdAt: new Date("2024-01-13T09:15:00"),
isRead: false,
files: [],
},
{
id: "4",
numericId: "1004",
title: "مشکل در پشتیبانی آنلاین",
content:
"سیستم چت آنلاین سایت به درستی کار نمی‌کند و نمی‌توانم با پشتیبانی ارتباط برقرار کنم. لطفاً این مشکل را حل کنید.",
createdAt: new Date("2024-01-12T16:45:00"),
isRead: true,
files: [
{ id: "f4", fileUrl: "https://example.com/files/chat-error.png" },
],
},
{
id: "5",
numericId: "1005",
title: "پیشنهاد بهبود رابط کاربری",
content:
"رابط کاربری سایت نیاز به بهبود دارد. منوها کمی پیچیده هستند و یافتن محصولات مورد نظر دشوار است. پیشنهاد می‌کنم طراحی ساده‌تری استفاده کنید.",
createdAt: new Date("2024-01-11T11:30:00"),
isRead: false,
files: [],
},
] as CriticismsItemTypes[],
pager: {
totalPages: 2,
currentPage: 1,
totalItems: 5,
},
},
};
import * as api from "../service/CriticismsService";
export const useGetCriticismsList = (page: number) => {
// Commented out API call - using static data instead
// return useQuery({
// queryKey: ["criticisms", page],
// queryFn: () => api.getCriticismsList(page),
// });
return {
data: staticCriticismsData,
isPending: false,
isLoading: false,
refetch: () => Promise.resolve(staticCriticismsData),
};
return useQuery({
queryKey: ["criticisms", page],
queryFn: () => api.getCriticismsList(page),
});
};
export const useDeleteCriticismsDetail = () => {
// Commented out API call - using mock function instead
// return useMutation({
// mutationFn: (id: string) => api.deleteCriticisms(id),
// });
return {
mutate: (id: string, options?: { onSuccess?: () => void }) => {
// Mock delete - just call onSuccess after a brief delay
setTimeout(() => {
if (options?.onSuccess) {
options.onSuccess();
}
}, 500);
},
isPending: false,
};
return useMutation({
mutationFn: (id: string) => api.deleteCriticisms(id),
});
};
export const useGetDetailCriticisms = (id: string) => {
// Commented out API call - using static data instead
// return useQuery({
// queryKey: ["criticisms", id],
// queryFn: () => api.getCriticismsDetail(id),
// enabled: !!id,
// });
const criticism = staticCriticismsData.data.criticisms.find(
(item) => item.id === id
);
return {
data: {
data: {
criticism: criticism || null,
},
},
isPending: false,
isLoading: false,
};
return useQuery({
queryKey: ["criticisms", id],
queryFn: () => api.getCriticismsDetail(id),
enabled: !!id,
});
};
@@ -1,17 +1,16 @@
// API service functions commented out - using static data instead
// import axios from "../../../config/axios";
import axios from "@/config/axios";
// export const getCriticismsList = async (page: number) => {
// const { data } = await axios.get(`/criticisms?page=${page}`);
// return data;
// };
export const getCriticismsList = async (page: number) => {
const { data } = await axios.get(`/admin/criticisms?page=${page}`);
return data;
};
// export const getCriticismsDetail = async (id: string) => {
// const { data } = await axios.get(`/criticisms/${id}`);
// return data;
// };
export const getCriticismsDetail = async (id: string) => {
const { data } = await axios.get(`/admin/criticisms/${id}`);
return data;
};
// export const deleteCriticisms = async (id: string) => {
// const { data } = await axios.delete(`/criticisms/${id}`);
// return data;
// };
export const deleteCriticisms = async (id: string) => {
const { data } = await axios.delete(`/admin/criticisms/${id}`);
return data;
};